摘要:原理文件又稱為動態鏈接庫文件,它通常作為應用程序可執行代碼的一部分,供應用程序在運行時進行調用。優化以上程序只是為了快速入手與搭建,需要優化的地方還有很多,在此簡單的列舉幾點,供大家參考。
原理
DLL文件又稱為動態鏈接庫文件,它通常作為應用程序可執行代碼的一部分,供應用程序在運行時進行調用。
在Webpack中,內置的DllPlugin與DllReferencePlugin插件可以通過使用DLL來大幅提高構建性能,以下是DLL機制流程圖:
為了便于實驗,我們通過使用create-react-app創建項目并eject出webpack配置:
npx create-react-app react-dll-demo cd react-dll-demo && npm run eject
由于默認配置隱藏了編譯信息,打開webpackDevServer.config.js,將quiet: true改為false,再啟動一下項目,找出我們需要的信息:
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" }
然后創建配置文件:
// 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]" }) ] };
執行npm run build:dll,CLI應該會自動提示你安裝webpack-cli,運行完成后可以看到以下文件:
public/dll ├── react.dll.js └── react.manifest.jsonDLLReferencePlugin
打開config/webpack.config.js,在根對象plugins字段中寫入該插件:
{ plugins: [ // ... new webpack.DllReferencePlugin({ manifest: require(path.join( __dirname, "../public/dll/react.manifest.json" )) }), ] }
最后一個步驟,在index.html我們先手動引入dll依賴:
... ...
此時重新運行程序,等待項目正常運行,再檢查一下編譯信息:
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模式下,構建時間降低了2s,打包大小降低了2.4M,相信將DLL運用到項目工程中,你能收獲到更多的驚喜。
優化以上程序只是為了快速入手與demo搭建,需要優化的地方還有很多,在此簡單的列舉幾點,供大家參考。
自動注入編譯文件到HTML通過安裝html-webpack-include-assets-plugin插件,可以自動將相應文件注入到index.html中,就可以避免手動進行更改了:
// config/webpack.config.js const HtmlIncludeAssetsPlugin = require("html-webpack-include-assets-plugin"); // ... { plugins: [ new HtmlIncludeAssetsPlugin({ assets: ["dll/react.dll.js"], append: false // 在其他資源前添加 }), ] }DLL的緩存問題與自動加載
我們通常不會對html文件做緩存,每次發版本時采用增量發布,只要html的依賴文件名變了,則會重新去解析靜態資源列表。除此之外,還需要提供一個函數,自動去加載文件夾內的多入口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"); // 根據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文件的靜態資源路徑 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 }) ] }構建前清空文件夾
若DLLPlugiun的entry發生變化,則dll內的文件可能會越來越多,因此我們需要在構建dll前清空文件夾,在這里推薦這兩個package:
npm-run-all,在scripts可串行或并行執行script
rimraf,nodejs刪除文件利器
首先安裝相應依賴: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", }
之后在變動DLL時,一定要記得執行:npm run make:dll。
其他Demo倉庫地址:GitHub - vv13/react-dll-demo
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/101968.html
摘要:原文地址對于沒有了解過的童鞋,建議先去看看官方的教程傳送門新版本的新特性插件使用的插件,可以很快的搭建一個項目的結構。使用時直接引入即可。的界面讓管理項目變得更加簡單。如遷移過程中有任何疑問,可以留言一起探討。 原文地址 對于沒有了解過 vue-cli3 的童鞋,建議先去看看官方的教程: 傳送門 新版本的新特性 1. 插件 使用 cli 的插件,可以很快的搭建一個項目的結構。如 ax...
摘要:關于的使用,我這里不做過多介紹,網上都有,一擼一大把,今天我要說的是在使用過程中出現的一個包依賴問題,這個問題導致打出來的包會包含重復的代碼。 關于webpack dll的使用,我這里不做過多介紹,網上都有,一擼一大把,今天我要說的是在使用dll plugin過程中出現的一個包依賴問題,這個問題導致打出來的包會包含重復的代碼。 優化背景 最近在給公司項目優化的時候,由于內部CDN上傳文...
摘要:本文首發于的技術博客實用至上,非經作者同意,請勿轉載。原文地址如果您對本系列文章感興趣,歡迎關注訂閱這里前言書承上文多頁應用架構系列十如何打造一個自定義的。終于,發現了這一大殺器,打包時間過長的問題得到完美解決。 本文首發于Array_Huang的技術博客——實用至上,非經作者同意,請勿轉載。原文地址:https://segmentfault.com/a/119000000710437...
摘要:一緩存失效改變了的一點兒代碼,打包的就會改變導致每次發布,的緩存都會失效。為了解決上述問題,在網上查找資料后,找到使用這個方案。三對比結果優化前筆記本上打包時間為,優化后筆記本打包時間為,同時也增加了這些庫的緩存。 問題 在前端項目中,我們希望第三方庫(vendors)和自己寫的代碼可以分開打包,vue-cli也幫我們配好了webpack的CommonsChunkPlugin,但是在使...
摘要:轉載文章公司的平臺功能越堆越多,打包也越來越費勁,一次十幾分鐘,運維很不爽,搗鼓了一下預編譯,試了一下大概縮短了七八分鐘,目前感覺還行,現在把它記下來,給需要的童鞋當做參考,也給自己記錄一下。 (轉載文章)公司的平臺功能越堆越多,打包也越來越費勁,一次十幾分鐘,運維很不爽,so搗鼓了一下預編譯,試了一下大概縮短了七八分鐘,目前感覺還行,現在把它記下來,給需要的童鞋當做參考,也給自己記錄...
閱讀 2882·2023-04-26 02:49
閱讀 3455·2021-11-25 09:43
閱讀 3430·2021-10-09 09:43
閱讀 3008·2021-09-28 09:44
閱讀 2457·2021-09-22 15:29
閱讀 4529·2021-09-14 18:02
閱讀 2789·2021-09-03 10:48
閱讀 3434·2019-08-30 12:47