Webpack的dll功能使用
最近使用Webpack遇到了一個(gè)坑。
我們構(gòu)建前端項(xiàng)目的時(shí)候,往往希望第三方庫(vendors)和自己寫的代碼可以分開打包,因?yàn)榈谌綆焱恍枰?jīng)常打包更新。對(duì)此Webpack的文檔建議用CommonsChunkPlugin
來單獨(dú)打包第三方庫。
entry: { vendor: ["jquery", "other-lib"], app: "./entry" } new CommonsChunkPlugin({ name: "vendor", // filename: "vendor.js" // (Give the chunk a different name) minChunks: Infinity, // (with more entries, this ensures that no other module // goes into the vendor chunk) })
通常為了對(duì)抗緩存,我們會(huì)給售出文件的文件名中加入hash的后綴——但是——我們編輯了app部分的代碼后,重新打包,發(fā)現(xiàn)vendor的hash也變化了!
這么一來,意味著每次發(fā)布版本的時(shí)候,vendor代碼都要刷新,即使我并沒有修改其中的代碼。這樣并不符合我們分開打包的初衷。
帶著問題我瀏覽了Github上的討論,發(fā)現(xiàn)了一個(gè)神器:dll。
Dll是Webpack最近新加的功能,我在網(wǎng)上并沒有找到什么中文的介紹,所以在這里我就簡(jiǎn)單介紹一下。
Dll這個(gè)概念應(yīng)該是借鑒了Windows系統(tǒng)的dll。一個(gè)dll包,就是一個(gè)純純的依賴庫,它本身不能運(yùn)行,是用來給你的app引用的。
打包dll的時(shí)候,Webpack會(huì)將所有包含的庫做一個(gè)索引,寫在一個(gè)manifest文件中,而引用dll的代碼(dll user)在打包的時(shí)候,只需要讀取這個(gè)manifest文件,就可以了。
這么一來有幾個(gè)好處:
- Dll打包以后是獨(dú)立存在的,只要其包含的庫沒有增減、升級(jí),hash也不會(huì)變化,因此線上的dll代碼不需要隨著版本發(fā)布頻繁更新。
- App部分代碼修改后,只需要編譯app部分的代碼,dll部分,只要包含的庫沒有增減、升級(jí),就不需要重新打包。這樣也大大提高了每次編譯的速度。
- 假設(shè)你有多個(gè)項(xiàng)目,使用了相同的一些依賴庫,它們就可以共用一個(gè)dll。
如何使用呢?
首先要先建立一個(gè)dll的配置文件,entry
只包含第三方庫:
const webpack = require('webpack'); const vendors = [ 'antd', 'isomorphic-fetch', 'react', 'react-dom', 'react-redux', 'react-router', 'redux', 'redux-promise-middleware', 'redux-thunk', 'superagent', ]; module.exports = { output: { path: 'build', filename: '[name].[chunkhash].js', library: '[name]_[chunkhash]', }, entry: { vendor: vendors, }, plugins: [ new webpack.DllPlugin({ path: 'manifest.json', name: '[name]_[chunkhash]', context: __dirname, }), ], };
webpack.DllPlugin
的選項(xiàng)中,path
是manifest文件的輸出路徑;name
是dll暴露的對(duì)象名,要跟output.library
保持一致;context
是解析包路徑的上下文,這個(gè)要跟接下來配置的dll user一致。
運(yùn)行Webpack,會(huì)輸出兩個(gè)文件一個(gè)是打包好的vendor.js,一個(gè)就是manifest.json,長(zhǎng)這樣:
{ "name": "vendor_ac51ba426d4f259b8b18", "content": { "./node_modules/antd/dist/antd.js": 1, "./node_modules/react/react.js": 2, "./node_modules/react/lib/React.js": 3, "./node_modules/react/node_modules/object-assign/index.js": 4, "./node_modules/react/lib/ReactChildren.js": 5, "./node_modules/react/lib/PooledClass.js": 6, "./node_modules/react/lib/reactProdInvariant.js": 7, "./node_modules/fbjs/lib/invariant.js": 8, "./node_modules/react/lib/ReactElement.js": 9, ............
Webpack將每個(gè)庫都進(jìn)行了編號(hào)索引,之后的dll user可以讀取這個(gè)文件,直接用id來引用。
Dll user的配置:
const webpack = require('webpack'); module.exports = { output: { path: 'build', filename: '[name].[chunkhash].js', }, entry: { app: './src/index.js', }, plugins: [ new webpack.DllReferencePlugin({ context: __dirname, manifest: require('./manifest.json'), }), ], };
DllReferencePlugin
的選項(xiàng)中,context
需要跟之前保持一致,這個(gè)用來指導(dǎo)Webpack匹配manifest中庫的路徑;manifest
用來引入剛才輸出的manifest文件。
運(yùn)行Webpack之后,結(jié)果如下:
對(duì)比一下不做分離的情況下打包的結(jié)果:
速度快了,文件也小了。
平時(shí)開發(fā)的時(shí)候,修改代碼后重新編譯的速度會(huì)大大減少,節(jié)省時(shí)間。
如果有多個(gè)項(xiàng)目,使用相同的一套庫,你可以在打包的時(shí)候引用相同的manifest文件,這樣就可以在項(xiàng)目之間共享了。
參考:
https://webpack.github.io/docs/list-of-plugins.html#dllplugin
https://github.com/webpack/webpack/tree/master/examples/dll
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
實(shí)例講解javascript實(shí)現(xiàn)異步圖片上傳方法
給大家詳細(xì)講解一下如何通過javascript寫出異步圖片上傳,并且把實(shí)例代碼給大家分享了下,有興趣的讀者們測(cè)試一下吧。2017-12-12容易造成JavaScript內(nèi)存泄露幾個(gè)方面
這篇文章主要介紹了容易造成JavaScript內(nèi)存泄露幾個(gè)方面,本文講解了多個(gè)會(huì)在Chrome V8中產(chǎn)生內(nèi)存泄漏的示例,需要的朋友可以參考下2014-09-09javascript瀑布流式圖片懶加載實(shí)例解析與優(yōu)化
這篇文章主要針對(duì)javascript瀑布流式圖片懶加載實(shí)例進(jìn)行解析與優(yōu)化,感興趣的小伙伴們可以參考一下2016-02-02JS使用Expires?max-age判斷緩存過期的瀏覽器實(shí)例
這篇文章主要為大家介紹了JS使用Expires?max-age判斷緩存過期的瀏覽器實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11JavaScript易錯(cuò)知識(shí)點(diǎn)整理
本文主要對(duì)JavaScript易錯(cuò)知識(shí)點(diǎn)進(jìn)行整理和匯總。需要的朋友可以看下,希望對(duì)大家有所幫助2016-12-12各種常用瀏覽器getBoundingClientRect的解析
getBoundingClientRect2009-05-05ES6基礎(chǔ)之?dāng)?shù)組和對(duì)象的拓展實(shí)例詳解
這篇文章主要介紹了ES6基礎(chǔ)之?dāng)?shù)組和對(duì)象的拓展,結(jié)合實(shí)例形式詳細(xì)分析了ES6數(shù)組和對(duì)象拓展運(yùn)算符、拓展方法的使用及相關(guān)操作技巧,需要的朋友可以參考下2019-08-08JavaScript實(shí)現(xiàn)標(biāo)簽頁切換效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)標(biāo)簽頁切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10