dll預編譯提高webpack打包速度
一、webpack的dll功能
基於
webpack3
構建
1.1 dll介紹
我們構建前端專案的時候,往往希望第三方庫(
vendors
)和自己寫的程式碼可以分開打包,因為第三方庫往往不需要經常打包更新。對此Webpack
的文件建議用CommonsChunkPlugin
來單獨打包第三方庫
- 我們這裡的
dll.js
是提前打包好了的,而不是在每次build
的時候去打包輸出的;這樣才能做到依賴包一次構建,無限次使用 -
webpack
輸出的檔名都帶有hash
值; 而用dll
構建後輸出的檔名是固定的
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)
})
通常為了對抗快取,我們會給售出檔案的檔名中加入
hash
的字尾——但是——我們編輯了app
部分的程式碼後,重新打包,發現vendor
的hash
也變化了
這麼一來,意味著每次釋出版本的時候,vendor程式碼都要重新整理,即使我並沒有修改其中的程式碼。這樣並不符合我們分開打包的初衷
-
Dll
是Webpack
最近新加的功能 -
Dll
這個概念應該是借鑑了Windows
系統的dll
。一個dll
包,就是一個純純的依賴庫,它本身不能執行,是用來給你的app
引用的 - 打包
dll
的時候,Webpack
會將所有包含的庫做一個索引,寫在一個manifest
檔案中,而引用dll
的程式碼(dll user
)在打包的時候,只需要讀取這個manifest
檔案,就可以了。
優勢
-
Dll
打包以後是獨立存在的,只要其包含的庫沒有增減、升級,hash
也不會變化,因此線上的dll
程式碼不需要隨著版本釋出頻繁更新 -
App
部分程式碼修改後,只需要編譯app
部分的程式碼,dll
部分,只要包含的庫沒有增減、升級,就不需要重新打包。這樣也大大提高了每次編譯的速度 - 假設你有多個專案,使用了相同的一些依賴庫,它們就可以共用一個
dll
1.2 dll使用
首先要先建立一個
dll
的配置檔案,entry
只包含第三方庫
第一步:新建webpack.dll.conf.js
-
webpack.DllPlugin
的選項中,path
是manifest
檔案的輸出路徑;name
是dll
暴露的物件名,要跟output.library
保持一致
// build/webpack.dll.conf.js
const path = require('path')
const webpack = require('webpack')
module.exports = {
entry: {
// 把這些資源打包成dll,提高編譯速度
react: ['react','react-router-dom','redux','redux-immutable','immutable','react-redux','react-router','redux-logger','redux-thunk','styled-components'],
ui: ['antd-mobile','antd'],
others: ['react-icons','axios','clipboard','humps','lodash','md5','moment','normalizr']
},
output: {
path: path.resolve(__dirname, "../dist/static/js"),
filename: `[name].dll.js`,
library: '[name]_library'
},
plugins: [
...Object.keys(['react','ui','others']).map(name => {
return new webpack.DllReferencePlugin({
context: '.',
manifest: require(`../static/${name}.manifest.json`),
})
}),
new webpack.optimize.UglifyJsPlugin()
]
}
第二步:加一個命令
// package.json
"scripts": {
"dll": "webpack --config config/webpack.dll.conf.js"
}
執行
npm run dll
- 執行
Webpack
,會輸出兩個檔案一個是打包好的vendor.js
,一個就是manifest.json
,長這樣
{
"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
將每個庫都進行了編號索引,之後的dll user
可以讀取這個檔案,直接用id
來引用
第三步: 在plugins中增加配置
// build/webpack.prod.conf.js
module.exports = {
plugins: [
new webpack.DllReferencePlugin({
manifest: require('../dll/react-manifest.json')
}),
new webpack.DllReferencePlugin({
manifest: require('../dll/ui-manifest.json')
}),
new webpack.DllReferencePlugin({
manifest: require('../dll/others-manifest.json')
})
]
}
再次執行
npm run build
之前
之後
二、happypack 多執行緒打包
一般情況下,js是單執行緒執行的,但
node
不是。利用node
提供的多執行緒環境,happypack
是可以多執行緒打包的。基本上開啟官網看了一下readme就可以配置了,特別是我只針對js的編譯進行優化,配置還是比較簡單的。
https://www.npmjs.com/package/happypack
-
happyPack
把所有序列的東西並行處理,使得loader
並行處理,較少檔案處理時間
// build/webpack.prod.conf.js
// @file: webpack.config.js
const HappyPack = require('happypack');
exports.module = {
rules: [
{
test: /.js$/,
// 1) replace your original list of loaders with "happypack/loader":
// loaders: [ 'babel-loader?presets[]=es2015' ],
use: 'happypack/loader',
include: [ /* ... */ ],
exclude: [ /* ... */ ]
}
],
plugins: [
// 2) create the plugin:
new HappyPack({
// 3) re-add the loaders you replaced above in #1:
loaders: [ 'babel-loader?presets[]=es2015' ]
})
]
}
這時的編譯時間也減小了一些
三、更多參考
相關文章
- webpack編譯速度提升之DllPluginWeb編譯Plugin
- 如何提高 Xcode 的編譯速度XCode編譯
- webpack dll打包重複問題優化Web優化
- 如何讓webpack打包的速度提升50%?Web
- 如何分析和提高(C/C++)程式的編譯速度?C++編譯
- 用實驗的思路優化webpack4專案編譯速度優化Web編譯
- 兩個小優化,webpack打包速度飛起來優化Web
- Parceljs和Webpack在React專案上打包速度對比JSWebReact
- webpack的編譯&構建Web編譯
- 使用 ccache 增加 Xcode 編譯速度XCode編譯
- webpack專案開發完後,如何最佳化打包速度?Web
- 【譯】如何使用webpack減少vuejs打包的大小WebVueJS
- iOS自動化編譯打包iOS編譯
- Java動態編譯優化——提升編譯速度(N倍)Java編譯優化
- 使用ilasm 和 ildasm編譯和反編譯工具對DLL檔案修改ASMLDA編譯
- dll反編譯(修改引用檔案、修改程式碼)再生成dll編譯
- #ifndef預編譯編譯
- Android 編譯打包的那些疑問Android編譯
- Taro編譯打包優化實踐編譯優化
- 使用Reflector和Filedisassembler逆向編譯反編譯.cs.dll檔案程式碼編譯
- webpack打包CSSWebCSS
- js預編譯 --預編譯詳解四部曲JS編譯
- 使用webpack構建時,如何使你的專案打包速度提升68% ?Web
- 升級優化Webpack4,使你的打包速度提升200%以上!優化Web
- mingw 編譯生成的dll 如何在vs中使用編譯
- CSS預編譯器CSS編譯
- ijkplayer 的編譯、打包 framework 和 https 支援編譯FrameworkHTTP
- windows下體驗quarkus原生編譯打包Windows編譯
- Nginx 的編譯並打包成二.txtNginx編譯
- 深入淺出的webpack構建工具---DllPlugin DllReferencePlugin提高構建速度(七)WebPlugin
- webpack 打包優化Web優化
- webpack打包地址配置Web
- Webpack打包優化Web優化
- webpack打包合併Web
- webpack打包學習Web
- GCC編譯過程(預處理->編譯->彙編->連結)GC編譯
- Stupid && 祖傳Fortran程式碼救贖之路(編譯Dll)編譯
- Android加快編譯速度的另一種方法Android編譯