未進行打包優化的痛點:javascript
隨着項目的不斷擴大,引入的第三方庫會愈來愈多,咱們每次build的時候會對全部的文件進行打包,耗時一定很長,不利於平常開發。css
解決思路:html
第三方庫咱們只是引入到項目裏來,通常不會常常性的去修改源碼,通常都是在src目錄下編寫業務代碼,所以能夠把第三方依賴和src分開打包。vue
每次build的時候咱們只須要把以前build好的第三方依賴文件引入到項目中便可,避免了咱們每次build的時候都會build第三方依賴。java
當第三方依賴發生改變的時候咱們只須要把第三方依賴再build一次就行。node
步驟一:構建項目 引入第三方依賴webpack
vue init webpack webpack-test
cd dll-test
npm install
npm install vuex vue-router axios lodash element-ui vue-bus iview --save
import Vue from 'vue' import App from './App' import router from './router' import iView from 'iview' import VueBus from 'vue-bus' import lodash from 'lodash' import vuex from 'vuex' import ElementUI from 'element-ui' import axios from 'axios' import vueRouter from 'vue-router' Vue.config.productionTip = false Vue.use(iView) Vue.use(ElementUI) Vue.use(VueBus) Vue.use(lodash) Vue.use(vuex) Vue.use(axios) Vue.use(vueRouter)
看下未優化前的打包時間ios
22930ms差很少23s,後面項目變大,可達數分鐘。 web
步驟二:使用DllPlugin插件把第三方依賴抽離出來vue-router
在build文件夾下(根目錄,config目錄下均可以)建立webpack.dll.conf.js
內容以下:
var path = require("path"); var webpack = require("webpack"); module.exports = { // 你想要打包的模塊 entry: { vendor: [ 'axios', 'iview', 'vue/dist/vue.esm.js', 'lodash', 'vue-bus', 'element-ui', 'vue-router', 'vuex', ] }, output: { path: path.join(__dirname, '../static/js'), // 打包後文件輸出的位置 filename: '[name].dll.js', library: '[name]_library' }, plugins: [ new webpack.DllPlugin({ //生成上文說到清單文件,此處放在當前build文件下面,你也能夠放其餘地方 path: path.join(__dirname, '.', '[name]-manifest.json'), name: '[name]_library' }), //壓縮 只是爲了包更小一點 new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false, drop_console:true, drop_debugger:true }, output:{ // 去掉註釋內容 comments: false, }, sourceMap: true }) ] };
將第三方包抽離出來打包的腳本已經寫好了,須要編寫一條命令來執行該腳本。
package.json中scripts下加入該命令"dll": "webpack --config build/webpack.dll.conf.js"
"scripts": { "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", "start": "npm run dev", "lint": "eslint --ext .js,.vue src", "build": "node build/build.js", "dll": "webpack --config build/webpack.dll.conf.js" },
執行下npm run dll 命令將第三方依賴進行打包
能夠看到在項目中生成了vendor-manifest.json 和 vendor.dll.js這兩個文件
vendor-manifest.json是dllPlugin生成的資源,內容以下:
能夠看到,每個公共庫中的js文件,都會有一個對應的資源ID。
同時生成一個打包文件vendor.dll.js,通常是依賴庫, 這個文件會暴露給全局一個相似require功能的函數,這個全局函數的名字是能夠配置的, 好比,能夠爲 vendorRequire();
步驟三:引入DllReferencePlugin 插件,讓在打包業務組件的時候自動引入第三方依賴打包好的資源,根據vendor-manifest.json中對應的資源id。
DllReferencePlugin 是在打包過程當中使用的,在打包業務代碼時,每遇到一個在manifest.json中出現的文件,就能夠利用上述 vendor.dll.js 暴露的全局函數進行相應處理,而不會把這個文件打包進來。
npm add-asset-html-webpack-plugin --save
在webpack.prod.conf.js中加入如下代碼:
// 將生成的css js添加到HTML文件 const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin')
在plugins中加入以下代碼:
// 打包優化 new webpack.DllReferencePlugin({ context: path.resolve(__dirname, '..'), manifest: require('./vendor-manifest.json') }), //這個主要是將生成的vendor.dll.js文件加上hash值插入到頁面中。 new AddAssetHtmlPlugin([{ filepath: path.resolve(__dirname,'../static/js/vendor.dll.js'), outputPath: utils.assetsPath('js'), publicPath: path.posix.join(config.build.assetsPublicPath, 'static/js'), includeSourcemap: false, hash: true, }]),
至此第三方依賴的抽離已完成,咱們打包下看看優化後的速度。
npm run build
3187ms 才3s,是否是比未優化的22930ms快多了,在項目愈來愈大的時候效果更明顯。
可使用npm run build -report 來查看打包的直觀圖。
這只是一種優化的方式,還有其餘可優化的部分,後續繼續添加。
趕忙去解決打包時間過長的煩惱吧。