国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

徹底解決 webpack 打包文件體積過大問題

2024-05-06 16:38:19
字體:
來源:轉載
供稿:網友

webpack 把我們所有的文件都打包成一個 JS 文件,這樣即使你是小項目,打包后的文件也會非常大。下面就來講下如何從多個方面進行優化。

去除不必要的插件

剛開始用 webpack 的時候,開發環境和生產環境用的是同一個 webpack 配置文件,導致生產環境打包的 JS 文件包含了一大堆沒必要的插件,比如 HotModuleReplacementPlugin, NoErrorsPlugin... 這時候不管用什么優化方式,都沒多大效果。所以,如果你打包后的文件非常大的話,先檢查下是不是包含了這些插件。

提取第三方庫

像 react 這個庫的核心代碼就有 627 KB,這樣和我們的源代碼放在一起打包,體積肯定會很大。所以可以在 webpack 中設置

{ entry: {  bundle: 'app'  vendor: ['react'] } plugins: {  new webpack.optimize.CommonsChunkPlugin('vendor', 'vendor.js') }}

這樣打包之后就會多出一個 vendor.js 文件,之后在引入我們自己的代碼之前,都要先引入這個文件。比如在 index.html 中

 <script src="/build/vendor.js"></script> <script src="/build/bundle.js"></script>

除了這種方式之外,還可以通過引用外部文件的方式引入第三方庫,比如像下面的配置

{ externals: {   'react': 'React' }}

externals 對象的 key 是給 require 時用的,比如 require('react'),對象的 value 表示的是如何在 global 中訪問到該對象,這里是 window.React。這時候 index.html 就變成下面這樣

<script src="//cdn.bootcss.com/react/0.14.7/react.min.js"></script><script src="/build/bundle.js"></script>

當然,個人更推薦第一種方式。

目前推薦用 DLL 的方式提取第三方庫。

代碼壓縮

webpack 自帶了一個壓縮插件UglifyJsPlugin,只需要在配置文件中引入即可。

{ plugins: [  new webpack.optimize.UglifyJsPlugin({   compress: {    warnings: false   }  }) ]}

加入了這個插件之后,編譯的速度會明顯變慢,所以一般只在生產環境啟用。

另外,服務器端還可以開啟 gzip 壓縮,優化的效果更明顯。

代碼分割

什么是代碼分割呢?我們知道,一般加載一個網頁都會把全部的 js 代碼都加載下來。但是對于 web app 來說,我們更想要的是只加載當前 UI 的代碼,沒有點擊的部分不加載。

看起來好像挺麻煩,但是通過 webpack 的 code split 以及配合react router 就可以方便實現。具體的例子可以看下 react router 的官方示例huge apps。不過這里還是講下之前配置踩過的坑。

code split 是不支持 ES6 的模塊系統的,所以在導入和導出的時候千萬要注意,特別是導出。如果你導出組件的時候用 ES6 的方式,這時候不管導入是用 CommomJs 還是 AMD,都會失敗,而且還不會報錯!

當然會踩到這個坑也是因為我剛剛才用 NodeJS,而且一入門就是用 ES6 的風格。除了這個之外,還有一點也要注意,在生產環境的 webpack 配置文件中,要加上 publicPath

output: {  path: xxx,  publicPath: yyy,  filename: 'bundle.js'}

不然的話,webpack 在加載 chunk 的時候,路徑會出錯。

設置緩存

開始這個小節之前,可以先看下大神的一篇文章:大公司里怎樣開發和部署前端代碼。

對于靜態文件,第一次獲取之后,文件內容沒改變的話,瀏覽器直接讀取緩存文件即可。那如果緩存設置過長,文件要更新怎么辦呢?嗯,以文件內容的 MD5 作為文件名就是一個不錯的解決方案。來看下用 webpack 應該怎樣實現

output: {  path: xxx,  publicPath: yyy,  filename: '[name]-[chunkhash:6].js'}

打包后的文件名加入了 hash 值

const bundler = webpack(config)bundler.run((err, stats) => { let assets = stats.toJson().assets let name for (let i = 0; i < assets.length; i++) {  if (assets[i].name.startsWith('main')) {   name = assets[i].name   break  } } fs.stat(config.buildTemplatePath, (err, stats) => {  if (err) {   fs.mkdirSync(config.buildTemplatePath)  }  writeTemplate(name) })})

手動調用 webpack 的 API,獲取打包后的文件名,通過 writeTemplate 更新 html 代碼。完整代碼猛戳 gitst

這樣子,我們就可以把文件的緩存設置得很長,而不用擔心更新問題。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 喀喇沁旗| 华宁县| 普陀区| 武安市| 台南市| 南郑县| 大关县| 留坝县| 偏关县| 青州市| 巴中市| 中宁县| 昌都县| 锦屏县| 乐平市| 侯马市| 永春县| 曲阳县| 南木林县| 神木县| 水城县| 浑源县| 山丹县| 榆中县| 囊谦县| 花莲市| 海兴县| 阿尔山市| 遂川县| 金坛市| 鄂尔多斯市| 道孚县| 桐乡市| 卓资县| 富平县| 策勒县| 青龙| 澄江县| 云浮市| 仁怀市| 隆回县|