- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- vue中webpack打包優(yōu)化操作技巧有哪些
這篇文章主要介紹vue中webpack打包優(yōu)化操作技巧有哪些,文中介紹的非常詳細,具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
webpack是react項目標配的打包工具,和NPM搭配起來(lái)使用管理模塊實(shí)在非常方便。
??webapck 把所有的靜態(tài)資源都看做是一個(gè) module,通過(guò) webpack,將這些 module 組成到一個(gè) bundle 中去,從而實(shí)現在頁(yè)面上引入一個(gè) bundle.js,來(lái)實(shí)現所有靜態(tài)資源的加載。
先給大家看一下項目的目錄結構:
就是正常的項目結構,簡(jiǎn)單說(shuō)一下吧:
build文件夾包含的是一些打包配置的一下東西
config文件夾是項目的基礎配置
dist是打包之后的文件
node_modules是項目的依賴(lài)包
src文件夾里面是項目的源碼
static文件夾里面放的是一些項目使用的靜態(tài)資源
index.html是項目的首頁(yè)
package.json文件是項目的配置json
yarn.lock是使用yarn鎖定項目用的依賴(lài)
優(yōu)化思路
項目打包時(shí)間長(cháng),原因無(wú)外乎就是項目整體比較龐大、依賴(lài)復雜、組件之前拆分不夠合理。
對于這三個(gè)問(wèn)題呢,我們可以針對下面這幾個(gè)方面去做一下處理:
對項目進(jìn)行路由屏蔽,只打包自己需要打包的部分(我司就是好幾個(gè)項目合并在了一起,至于原因則是 需求類(lèi)似,所以放在一起比較省事 -_-||| 開(kāi)發(fā)過(guò)程中是省了不少事,但是現在一樣要還的?。。。。?br/>
依賴(lài)關(guān)系復雜,這里說(shuō)的是項目中的依賴(lài)模塊比較多,像我們現在這個(gè)項目,光算依賴(lài)包的話(huà)就有40+,另外一個(gè)重要原因就是組件之間存在相同引用的依賴(lài)。解決思路是把項目中重用的依賴(lài)抽離出來(lái)進(jìn)行單獨打包。
組件在寫(xiě)的過(guò)程中,需要考慮好這個(gè)組件的使用方向,以及實(shí)現功能,不能混為一談。
實(shí)際操作
有了整體的思路,那么開(kāi)搞就可以啦 去webpack文檔去看了一下有一個(gè)DllPlugin,這個(gè)插件就是幫助我們解決問(wèn)題的關(guān)鍵,下面是我webpack.dll.config的代碼:
var path = require("path"); var webpack = require("webpack"); function resolve (dir) { return path.join(__dirname, '..', dir) } module.exports = { // 你想要打包的模塊的數組 entry: { vendor: ['vue', 'lodash', 'vuex', 'axios', 'vue-router', 'iview', 'element-ui', 'echarts','xlsx','jquery','vue-fullcalendar','vue-cookie','handsontable'] }, output: { path: path.join(__dirname, '../dist/vendor-dll-js'), // 打包后文件輸出的位置 filename: '[name].dll.js', library: '[name]_library' // vendor.dll.js中暴露出的全局變量名。 // 主要是給DllPlugin中的name使用, // 故這里需要和webpack.DllPlugin中的`name: '[name]_library',`保持一致。 }, resolve: { extensions: ['.js', '.vue', '.json'], alias: { 'vue$': 'vue/dist/vue.esm.js', '@': resolve('src'), } }, plugins: [ new webpack.DllPlugin({ path: path.join(__dirname, '.', '[name]-manifest.json'), name: '[name]_library', context: __dirname }), // 壓縮打包的文件,與該文章主線(xiàn)無(wú)關(guān) new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false } }) ] };
我們需要將項目中具有重用性的包抽離出來(lái),放在vendor數組里面,然后在下面output里面定義一下打包輸出的文件路徑,然后在resolve里面配置解析參數,最后定義使用的DllPlugin插件,UglifyJsPlugin是壓縮js的插件
Dllplugin里的path,會(huì )輸出一個(gè)vendor-manifest.json
,這是用來(lái)做關(guān)聯(lián)id的,打包的時(shí)候不會(huì )打包進(jìn)去,所以不用放到static里 然后運行一下 webpack -p --progress --config build/webpack.dll.conf.js
成功以后,static下會(huì )有dll.vendor.js,根目錄下會(huì )有vendor.manifest.json
各自打開(kāi)看一下,就會(huì )看到依賴(lài)庫的源碼和匹配id
ok,到這里,抽離依賴(lài)庫的事情就完成了,那么接下來(lái)問(wèn)題就是怎么引用呢,怎么在dev和build跑呢?
這里補了一點(diǎn)dll和commonsChunk
概念上的區別,commonsChunk之所以慢和大,是因為每次run的時(shí)候,都會(huì )去做一次打包,而實(shí)際上我們不會(huì )一直去更新我們引用的依賴(lài)庫,所以dll的做法就等于是,事先先打包好依賴(lài)庫,然后只對每次都修改的js做打包。
繼續上面的步驟,我們需要根據生成的json文件去修改webpack.base.config文件:
const manifest = require('../vendor-manifest.json') ...... plugins: [ new webpack.DllReferencePlugin({ manifest }) ]
然后打開(kāi)index.html,在底部加上 <script src="./static/dll.vendor.js"></script>
;
執行一下 npm run build
,一起正常的話(huà),表示你的操作是正確的。
升級處理
至此優(yōu)化的問(wèn)題基本已經(jīng)解決了,但是在處理過(guò)程中需要進(jìn)行復制粘貼,還要對index.html文件進(jìn)行操作,如果是對于項目不熟悉的人來(lái)進(jìn)行開(kāi)發(fā)項目的話(huà),就會(huì )出現一些小的問(wèn)題,所以我決定繼續往下研究一下:
思路還是上面的思路,我們下面需要進(jìn)行的操作呢就是對與之前的處理進(jìn)行優(yōu)化,通過(guò)配置文件,和命令去實(shí)現我們想要的效果
首先我們將上面 webpack.dll.config 文件里面的entry配置項拿出來(lái),在config文件夾下新建一個(gè)dll.js
module.exports = { entry: { // 這里的依賴(lài)順序必須是:對象從上往下依賴(lài),數組從右到左依賴(lài)(如果互不依賴(lài)的可以忽略順序) ui: ['iview', 'element-ui'], tool: ['lodash', 'jquery', 'axios', 'vue-fullcalendar'], vue: ['vue', 'vuex', 'vue-router', 'vue-cookie'], xlsx: ['xlsx'], echarts: ['echarts'], other: ['handsontable'], }, outFile: '../static/dll' };
這里面其實(shí)就是我們一開(kāi)始寫(xiě)的entry的配置項,根據這個(gè)js去打包的文件有一個(gè)順序,就是我總結的這個(gè):
這里的依賴(lài)順序必須是:對象從上往下依賴(lài),數組從右到左依賴(lài)(如果互不依賴(lài)的可以忽略順序)
如果不按照這個(gè)順序去寫(xiě)的話(huà),會(huì )出現依賴(lài)錯誤的問(wèn)題?。?!
然后在output里面再進(jìn)行一下配置:
output: { path: path.join(__dirname, dllConfig.outFile), // 打包后文件輸出的位置 filename: '[name].dll.[chunkhash].js', library: '[name]_library' // 主要是給DllPlugin中的name使用, // 故這里需要和webpack.DllPlugin中的`name: '[name]_library',`保持一致。 },
這樣在執行 webpack -p --progress --config build/webpack.dll.conf.js
指令的時(shí)候會(huì )生成如下:
是不是看到文件后面的hash就一臉懵逼,這怎么辦,我們沒(méi)有辦法去進(jìn)行復制粘貼了?。。ㄎ覀兊哪康牟痪褪遣贿M(jìn)行復制粘貼嗎 正經(jīng)臉-_-)
要實(shí)現命令操作之后不進(jìn)行復制粘貼操作就需要使用webpack的HtmlWebpackPlugin插件
在plugins里面配置一下HtmlWebpackPlugin
new HtmlWebpackPlugin({ filename: path.join(__dirname, '../', config.dev.index), template: 'index.ejs', inject: false }),
然后在根目錄添加一個(gè)index.ejs模版(ejsGitHub地址 ), index.ejs中代碼如下:
<body> <div id="app"></div> <!-- dll files will be auto injected --> <% for (var chunk in htmlWebpackPlugin.files.chunks) { %><script type="text/javascript" src="/<%= htmlWebpackPlugin.files.chunks[chunk].entry %>"></script> <% } %> <!-- built files will be auto injected --> </body>
最后需要在config文件夾下的index.js進(jìn)行一下修改: 在dev中添加: index: 'index.html'
,
項目在執行dev指令或者build指令之前需要先執行: webpack -p --progress --config build/webpack.dll.conf.js
在dll指令結束后 執行其他操作就可以完美的玩耍了
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站