摘要:一緩存失效改變了的一點(diǎn)兒代碼,打包的就會(huì)改變導(dǎo)致每次發(fā)布,的緩存都會(huì)失效。為了解決上述問題,在網(wǎng)上查找資料后,找到使用這個(gè)方案。三對(duì)比結(jié)果優(yōu)化前筆記本上打包時(shí)間為,優(yōu)化后筆記本打包時(shí)間為,同時(shí)也增加了這些庫(kù)的緩存。
問題
在前端項(xiàng)目中,我們希望第三方庫(kù)(vendors)和自己寫的代碼可以分開打包,vue-cli也幫我們配好了webpack的CommonsChunkPlugin,但是在使用vue-cli的打包的過程中有一些痛點(diǎn)。
一、verdors緩存失效改變了app.js的一點(diǎn)兒代碼,verdors打包的chunkhash就會(huì)改變,導(dǎo)致每次發(fā)布,vendors的緩存都會(huì)失效。這樣增加了用戶的流量消耗和首屏加載時(shí)間。
二、項(xiàng)目打包時(shí)間過長(zhǎng)在公司的臺(tái)式機(jī)打包一次要花費(fèi)30s,在個(gè)人筆記本上則需要花費(fèi)40s之多。
為了解決上述問題,在網(wǎng)上查找資料后,找到使用 webpack dll這個(gè)方案。
解決過程 一、編寫dll配置文件先貼上我的webpack.dll.conf.js配置代碼
var path = require("path"); var webpack = require("webpack"); var config = require("../config") var ExtractTextPlugin = require("extract-text-webpack-plugin"); // 提取css var AssetsPlugin = require("assets-webpack-plugin"); // 生成文件名,配合HtmlWebpackPlugin增加打包后dll的緩存 module.exports = { entry: { libs: [ "vue-infinite-scroll", "vue-cookie", "jquery", "iscroll", "weui.js", "video.js", "babel-polyfill", "resetcss", "font-awesome/css/font-awesome.min.css", "video.js/dist/video-js.min.css", ] }, output: { path: path.resolve(__dirname, "../public"), filename: "[name].[chunkhash:7].js", library: "[name]_library" }, plugins: [ new webpack.DllPlugin({ path: path.resolve(__dirname, "../public/[name]-mainfest.json"), name: "[name]_library", context: __dirname // 執(zhí)行的上下文環(huán)境,對(duì)之后DllReferencePlugin有用 }), new ExtractTextPlugin("[name].[contenthash:7].css"), new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false }, }), new AssetsPlugin({ filename: "bundle-config.json", path: "./public" }), ], module: { rules: [ { test: /.css$/, use: ExtractTextPlugin.extract({ fallback: "style-loader", use: "css-loader" }) }, { test: /.(png|jpe?g|gif|svg)(?.*)?$/, loader: "url-loader", query: { limit: 10000, name: "img/[name].[hash:7].[ext]" } }, { test: /.(woff2?|eot|ttf|otf)(?.*)?$/, loader: "url-loader", query: { limit: 10000, name: "fonts/[name].[hash:7].[ext]" } } ] }, }
1、entry配置需要dll打包的庫(kù)
2、module配置處理對(duì)應(yīng)文件類型的loader
3、增加 webpack.DllPlugin插件
1、path:生成mainfest.json文件的絕對(duì)路徑。mainfest.json里面的內(nèi)容為所有被打包到dll.js文件模塊id的映射。
2、name:webpack打包時(shí)mainfest.json包含的庫(kù)的暴露出來的函數(shù)名名
3、contenxt(可選):引入manifest文件的context,默認(rèn)為webpack的context
二、修改webpack.base.conf.js在webpack.base.conf.js的plugins增加
new webpack.DllReferencePlugin({ context: __dirname, manifest: require("../public/libs-mainfest.json") // 指向生成的manifest.json }),
注:上面提到通過AssetsPlugin和HtmlWebpackPlugin給打包的dll.js各dll.css增加緩存機(jī)制
AssetsPlugin生成的bundle-config.js
{"libs":{"js":"libs.f7d8ef0.js","css":"libs.e2245d7.css"}}
webpack.dev.conf.js文件增加以下代碼
var bundleConfig = require("../public/bundle-config.json") new HtmlWebpackPlugin({ filename: "index.html", template: "index.html", inject: true, libJsName:bundleConfig.libs.js, libCssName:bundleConfig.libs.css, env:config.dev.env, }),
在index.html引入生成的dll.js,dll.css
上面為開發(fā)環(huán)境的配置,生產(chǎn)環(huán)境對(duì)應(yīng)修改就可以了。
增加build.dll.js文件,
var path = require("path"); var utils = require("./utils") var webpack = require("webpack"); var config = require("../config") var utils = require("./utils") var dllConfig = require("./webpack.dll.conf"); var ExtractTextPlugin = require("extract-text-webpack-plugin"); var AssetsPlugin = require("assets-webpack-plugin"); var chalk = require("chalk") var rm = require("rimraf") var ora = require("ora") var spinner = ora({ color: "green", text: "正為生產(chǎn)環(huán)境打包dll包,耐心點(diǎn),不然自動(dòng)關(guān)機(jī)。。。" }) spinner.start() rm(path.resolve(__dirname, "../public"), err => { if (err) throw err webpack(dllConfig,function (err, stats) { spinner.stop() if (err) throw err process.stdout.write(stats.toString({ colors: true, modules: false, children: false, chunks: false, chunkModules: false }) + " ") console.log(chalk.cyan(" dll打包完成. ")) }) });
然后在package.json script中加上"build:dll": "node build/buildDll.js"
三、對(duì)比結(jié)果注:開發(fā)和生產(chǎn)環(huán)境都要首先使用 webpack運(yùn)行webpack.dll.conf.js生成dll.js, dll.css, mainfest.json文件,每次改變庫(kù)文件也都需要重新執(zhí)行一遍。
優(yōu)化前筆記本上打包時(shí)間為4000ms,
優(yōu)化后筆記本打包時(shí)間為1800ms,同時(shí)也增加了這些庫(kù)的緩存。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/83476.html
摘要:轉(zhuǎn)載文章公司的平臺(tái)功能越堆越多,打包也越來越費(fèi)勁,一次十幾分鐘,運(yùn)維很不爽,搗鼓了一下預(yù)編譯,試了一下大概縮短了七八分鐘,目前感覺還行,現(xiàn)在把它記下來,給需要的童鞋當(dāng)做參考,也給自己記錄一下。 (轉(zhuǎn)載文章)公司的平臺(tái)功能越堆越多,打包也越來越費(fèi)勁,一次十幾分鐘,運(yùn)維很不爽,so搗鼓了一下預(yù)編譯,試了一下大概縮短了七八分鐘,目前感覺還行,現(xiàn)在把它記下來,給需要的童鞋當(dāng)做參考,也給自己記錄...
摘要:使用打包的基本上都是獨(dú)立庫(kù)文件,這類文件有一個(gè)特性就是變化不大。修改往添加一個(gè)配置只針對(duì)的模塊化有效配置文件詳情請(qǐng)點(diǎn)擊 基于vue-cli優(yōu)化的webpack配置 大概分為以下幾點(diǎn) 通過 externals 配置來提取常用庫(kù),引用外鏈 配置CommonsChunkPlugin提取公用代碼 (vue-cli已做) 善用alias(vue-cli配置了一部分) 啟用DllPlugin和D...
摘要:原文地址對(duì)于沒有了解過的童鞋,建議先去看看官方的教程傳送門新版本的新特性插件使用的插件,可以很快的搭建一個(gè)項(xiàng)目的結(jié)構(gòu)。使用時(shí)直接引入即可。的界面讓管理項(xiàng)目變得更加簡(jiǎn)單。如遷移過程中有任何疑問,可以留言一起探討。 原文地址 對(duì)于沒有了解過 vue-cli3 的童鞋,建議先去看看官方的教程: 傳送門 新版本的新特性 1. 插件 使用 cli 的插件,可以很快的搭建一個(gè)項(xiàng)目的結(jié)構(gòu)。如 ax...
摘要:搭建的項(xiàng)目界面想對(duì)之前較為簡(jiǎn)潔之前的和文件夾不見了,那么應(yīng)該如何配置如等的配那只需要在項(xiàng)目的根目錄下文件是根目錄,不是目錄語(yǔ)法基本路徑輸出文件目錄是否在保存的時(shí)候檢查配置配置項(xiàng)生產(chǎn)環(huán)境是否生成文件相關(guān)配置是否使用分離插件 Vue-cli3 搭建的項(xiàng)目 界面想對(duì)之前較為簡(jiǎn)潔 showImg(https://segmentfault.com/img/bVbesOu?w=320&h=222)...
閱讀 2927·2021-10-11 10:57
閱讀 1845·2021-09-26 09:55
閱讀 1465·2021-09-06 15:11
閱讀 3627·2021-08-26 14:16
閱讀 878·2019-08-30 15:54
閱讀 669·2019-08-30 12:43
閱讀 3486·2019-08-29 16:18
閱讀 2740·2019-08-23 16:14