摘要:原理文件又稱為動(dòng)態(tài)鏈接庫(kù)文件,它通常作為應(yīng)用程序可執(zhí)行代碼的一部分,供應(yīng)用程序在運(yùn)行時(shí)進(jìn)行調(diào)用。優(yōu)化以上程序只是為了快速入手與搭建,需要優(yōu)化的地方還有很多,在此簡(jiǎn)單的列舉幾點(diǎn),供大家參考。
原理
DLL文件又稱為動(dòng)態(tài)鏈接庫(kù)文件,它通常作為應(yīng)用程序可執(zhí)行代碼的一部分,供應(yīng)用程序在運(yùn)行時(shí)進(jìn)行調(diào)用。
在Webpack中,內(nèi)置的DllPlugin與DllReferencePlugin插件可以通過使用DLL來大幅提高構(gòu)建性能,以下是DLL機(jī)制流程圖:
為了便于實(shí)驗(yàn),我們通過使用create-react-app創(chuàng)建項(xiàng)目并eject出webpack配置:
npx create-react-app react-dll-demo cd react-dll-demo && npm run eject
由于默認(rèn)配置隱藏了編譯信息,打開webpackDevServer.config.js,將quiet: true改為false,再啟動(dòng)一下項(xiàng)目,找出我們需要的信息:
Version: webpack 4.28.3 Time: 6985ms Built at: 2019-02-21 10:46:42 Asset Size Chunks Chunk Names asset-manifest.json 232 bytes [emitted] index.html 1.65 KiB [emitted] static/js/0.chunk.js 4.21 MiB 0 [emitted] static/js/bundle.js 30.9 KiB runtime~main [emitted] runtime~main static/js/main.chunk.js 47.4 KiB main [emitted] main static/media/logo.5d5d9eef.svg 2.61 KiB [emitted]DLLPlugin
首先在package.json的scripts字段添加一條腳本:
{ "build:dll": "webpack --config config/webpack.dll.config.js --mode production" }
然后創(chuàng)建配置文件:
// config/webpack.dll.config.js const webpack = require("webpack"); const path = require("path"); module.exports = { entry: { react: ["react", "react-dom"] }, output: { filename: "[name].dll.js", path: path.join(__dirname, "../public/dll"), libraryTarget: "var", library: "_dll_[name]_[hash]" }, plugins: [ new webpack.DllPlugin({ path: path.join(__dirname, "../public/dll", "[name].manifest.json"), name: "_dll_[name]_[hash]" }) ] };
執(zhí)行npm run build:dll,CLI應(yīng)該會(huì)自動(dòng)提示你安裝webpack-cli,運(yùn)行完成后可以看到以下文件:
public/dll ├── react.dll.js └── react.manifest.jsonDLLReferencePlugin
打開config/webpack.config.js,在根對(duì)象plugins字段中寫入該插件:
{ plugins: [ // ... new webpack.DllReferencePlugin({ manifest: require(path.join( __dirname, "../public/dll/react.manifest.json" )) }), ] }
最后一個(gè)步驟,在index.html我們先手動(dòng)引入dll依賴:
... ...
此時(shí)重新運(yùn)行程序,等待項(xiàng)目正常運(yùn)行,再檢查一下編譯信息:
Version: webpack 4.28.3 Time: 4883ms Built at: 2019-02-21 11:19:11 Asset Size Chunks Chunk Names asset-manifest.json 232 bytes [emitted] index.html 1.69 KiB [emitted] static/js/0.chunk.js 1.82 MiB 0 [emitted] static/js/bundle.js 30.9 KiB runtime~main [emitted] runtime~main static/js/main.chunk.js 52.1 KiB main [emitted] main static/media/logo.5d5d9eef.svg 2.61 KiB [emitted]
很顯然的看到,在development模式下,構(gòu)建時(shí)間降低了2s,打包大小降低了2.4M,相信將DLL運(yùn)用到項(xiàng)目工程中,你能收獲到更多的驚喜。
優(yōu)化以上程序只是為了快速入手與demo搭建,需要優(yōu)化的地方還有很多,在此簡(jiǎn)單的列舉幾點(diǎn),供大家參考。
自動(dòng)注入編譯文件到HTML通過安裝html-webpack-include-assets-plugin插件,可以自動(dòng)將相應(yīng)文件注入到index.html中,就可以避免手動(dòng)進(jìn)行更改了:
// config/webpack.config.js const HtmlIncludeAssetsPlugin = require("html-webpack-include-assets-plugin"); // ... { plugins: [ new HtmlIncludeAssetsPlugin({ assets: ["dll/react.dll.js"], append: false // 在其他資源前添加 }), ] }DLL的緩存問題與自動(dòng)加載
我們通常不會(huì)對(duì)html文件做緩存,每次發(fā)版本時(shí)采用增量發(fā)布,只要html的依賴文件名變了,則會(huì)重新去解析靜態(tài)資源列表。除此之外,還需要提供一個(gè)函數(shù),自動(dòng)去加載文件夾內(nèi)的多入口dll文件,以下為核心代碼:
config/dllHelper.js:
// config/dllHelper.js const webpack = require("webpack"); const path = require("path"); const fs = require("fs"); const dllConfig = require("./webpack.dll.config"); // 根據(jù)entry生成DllReferencePlugin列表 function genDllReferences() { return Object.keys(dllConfig.entry).map( name => new webpack.DllReferencePlugin({ manifest: require(path.join( __dirname, "../public/dll", `${name}.manifest.json` )) }) ); } // 生成dll文件的靜態(tài)資源路徑 function loadDllAssets() { return fs .readdirSync(path.resolve(__dirname, "../public/dll")) .filter(filename => filename.match(/.dll.js$/)) .map(filename => `dll/${filename}`); } module.exports = { loadDllAssets, genDllReferences };
config/webpack.dll.config.js:
// { ... output: { filename: "[name].[hash:8].dll.js" } }
config/webpack.config.js:
const dllHelper = require("./dllHelper"); ... { plugins: [ ...dllHelper.genDllReferences(), new HtmlIncludeAssetsPlugin({ assets: dllHelper.loadDllAssets(), append: false }) ] }構(gòu)建前清空文件夾
若DLLPlugiun的entry發(fā)生變化,則dll內(nèi)的文件可能會(huì)越來越多,因此我們需要在構(gòu)建dll前清空文件夾,在這里推薦這兩個(gè)package:
npm-run-all,在scripts可串行或并行執(zhí)行script
rimraf,nodejs刪除文件利器
首先安裝相應(yīng)依賴:yarn add -D rimraf npm-run-all,然后修改package.json:
scripts: { "make:dll": "npm-run-all clear:dll build:dll", "build:dll": "webpack --config config/webpack.dll.config.js --mode production", "clear:dll": "rimraf public/dll", }
之后在變動(dòng)DLL時(shí),一定要記得執(zhí)行:npm run make:dll。
其他Demo倉(cāng)庫(kù)地址:GitHub - vv13/react-dll-demo
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/101968.html
摘要:原文地址對(duì)于沒有了解過的童鞋,建議先去看看官方的教程傳送門新版本的新特性插件使用的插件,可以很快的搭建一個(gè)項(xiàng)目的結(jié)構(gòu)。使用時(shí)直接引入即可。的界面讓管理項(xiàng)目變得更加簡(jiǎn)單。如遷移過程中有任何疑問,可以留言一起探討。 原文地址 對(duì)于沒有了解過 vue-cli3 的童鞋,建議先去看看官方的教程: 傳送門 新版本的新特性 1. 插件 使用 cli 的插件,可以很快的搭建一個(gè)項(xiàng)目的結(jié)構(gòu)。如 ax...
摘要:關(guān)于的使用,我這里不做過多介紹,網(wǎng)上都有,一擼一大把,今天我要說的是在使用過程中出現(xiàn)的一個(gè)包依賴問題,這個(gè)問題導(dǎo)致打出來的包會(huì)包含重復(fù)的代碼。 關(guān)于webpack dll的使用,我這里不做過多介紹,網(wǎng)上都有,一擼一大把,今天我要說的是在使用dll plugin過程中出現(xiàn)的一個(gè)包依賴問題,這個(gè)問題導(dǎo)致打出來的包會(huì)包含重復(fù)的代碼。 優(yōu)化背景 最近在給公司項(xiàng)目?jī)?yōu)化的時(shí)候,由于內(nèi)部CDN上傳文...
摘要:本文首發(fā)于的技術(shù)博客實(shí)用至上,非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載。原文地址如果您對(duì)本系列文章感興趣,歡迎關(guān)注訂閱這里前言書承上文多頁(yè)應(yīng)用架構(gòu)系列十如何打造一個(gè)自定義的。終于,發(fā)現(xiàn)了這一大殺器,打包時(shí)間過長(zhǎng)的問題得到完美解決。 本文首發(fā)于Array_Huang的技術(shù)博客——實(shí)用至上,非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載。原文地址:https://segmentfault.com/a/119000000710437...
摘要:一緩存失效改變了的一點(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,但是在使...
摘要:轉(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)做參考,也給自己記錄...
閱讀 2857·2023-04-26 02:49
閱讀 3441·2021-11-25 09:43
閱讀 3370·2021-10-09 09:43
閱讀 2985·2021-09-28 09:44
閱讀 2446·2021-09-22 15:29
閱讀 4507·2021-09-14 18:02
閱讀 2773·2021-09-03 10:48
閱讀 3426·2019-08-30 12:47