亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

徹底解決 webpack 打包文件體積過(guò)大問(wèn)題

 更新時(shí)間:2017年07月07日 17:12:21   作者:clinyong  
本篇文章主要介紹了徹底解決 webpack 打包文件體積過(guò)大問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

webpack 把我們所有的文件都打包成一個(gè) JS 文件,這樣即使你是小項(xiàng)目,打包后的文件也會(huì)非常大。下面就來(lái)講下如何從多個(gè)方面進(jìn)行優(yōu)化。

去除不必要的插件

剛開(kāi)始用 webpack 的時(shí)候,開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境用的是同一個(gè) webpack 配置文件,導(dǎo)致生產(chǎn)環(huán)境打包的 JS 文件包含了一大堆沒(méi)必要的插件,比如 HotModuleReplacementPlugin, NoErrorsPlugin... 這時(shí)候不管用什么優(yōu)化方式,都沒(méi)多大效果。所以,如果你打包后的文件非常大的話,先檢查下是不是包含了這些插件。

提取第三方庫(kù)

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

{
 entry: {
  bundle: 'app'
  vendor: ['react']
 }

 plugins: {
  new webpack.optimize.CommonsChunkPlugin('vendor', 'vendor.js')
 }
}

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

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

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

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

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

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

當(dāng)然,個(gè)人更推薦第一種方式。

目前推薦用 DLL 的方式提取第三方庫(kù)。

代碼壓縮

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

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

加入了這個(gè)插件之后,編譯的速度會(huì)明顯變慢,所以一般只在生產(chǎn)環(huán)境啟用。

另外,服務(wù)器端還可以開(kāi)啟 gzip 壓縮,優(yōu)化的效果更明顯。

代碼分割

什么是代碼分割呢?我們知道,一般加載一個(gè)網(wǎng)頁(yè)都會(huì)把全部的 js 代碼都加載下來(lái)。但是對(duì)于 web app 來(lái)說(shuō),我們更想要的是只加載當(dāng)前 UI 的代碼,沒(méi)有點(diǎn)擊的部分不加載。

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

code split 是不支持 ES6 的模塊系統(tǒng)的,所以在導(dǎo)入和導(dǎo)出的時(shí)候千萬(wàn)要注意,特別是導(dǎo)出。如果你導(dǎo)出組件的時(shí)候用 ES6 的方式,這時(shí)候不管導(dǎo)入是用 CommomJs 還是 AMD,都會(huì)失敗,而且還不會(huì)報(bào)錯(cuò)!

當(dāng)然會(huì)踩到這個(gè)坑也是因?yàn)槲覄倓偛庞?NodeJS,而且一入門(mén)就是用 ES6 的風(fēng)格。除了這個(gè)之外,還有一點(diǎn)也要注意,在生產(chǎn)環(huán)境的 webpack 配置文件中,要加上 publicPath

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

不然的話,webpack 在加載 chunk 的時(shí)候,路徑會(huì)出錯(cuò)。

設(shè)置緩存

開(kāi)始這個(gè)小節(jié)之前,可以先看下大神的一篇文章:大公司里怎樣開(kāi)發(fā)和部署前端代碼。

對(duì)于靜態(tài)文件,第一次獲取之后,文件內(nèi)容沒(méi)改變的話,瀏覽器直接讀取緩存文件即可。那如果緩存設(shè)置過(guò)長(zhǎng),文件要更新怎么辦呢?嗯,以文件內(nèi)容的 MD5 作為文件名就是一個(gè)不錯(cuò)的解決方案。來(lái)看下用 webpack 應(yīng)該怎樣實(shí)現(xiàn)

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)
 })
})

手動(dòng)調(diào)用 webpack 的 API,獲取打包后的文件名,通過(guò) writeTemplate 更新 html 代碼。完整代碼猛戳 gitst。

這樣子,我們就可以把文件的緩存設(shè)置得很長(zhǎng),而不用擔(dān)心更新問(wèn)題。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 不同js異步函數(shù)同步的實(shí)現(xiàn)方法

    不同js異步函數(shù)同步的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇不同js異步函數(shù)同步的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • js刪除數(shù)組中的元素delete和splice的區(qū)別詳解

    js刪除數(shù)組中的元素delete和splice的區(qū)別詳解

    下面小編就為大家分享一篇js刪除數(shù)組中的元素delete和splice的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • 解決webpack打包速度慢的解決辦法匯總

    解決webpack打包速度慢的解決辦法匯總

    本篇文章主要介紹了徹底解決webpack打包慢的解決辦法匯總,詳細(xì)的介紹了3種方法,有興趣的可以了解一下
    2017-07-07
  • JS中toFixed(2)精度問(wèn)題的原因以及解決辦法

    JS中toFixed(2)精度問(wèn)題的原因以及解決辦法

    最近發(fā)現(xiàn)JS當(dāng)中toFixed()方法存在一些問(wèn)題,所以這里給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于JS中toFixed(2)精度問(wèn)題的原因以及解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • JavaScript報(bào)錯(cuò):Uncaught TypeError: XXX is not iterable的解決方法

    JavaScript報(bào)錯(cuò):Uncaught TypeError: XXX is 

    在 JavaScript 編程中,“Uncaught TypeError: XYZ is not iterable” 是一種常見(jiàn)的錯(cuò)誤,這種錯(cuò)誤通常發(fā)生在試圖對(duì)一個(gè)非可迭代對(duì)象進(jìn)行迭代操作時(shí),了解這種錯(cuò)誤的成因和解決方法,對(duì)于編寫(xiě)健壯的代碼至關(guān)重要,需要的朋友可以參考下
    2024-07-07
  • JavaScript尾遞歸的實(shí)現(xiàn)及應(yīng)用場(chǎng)景

    JavaScript尾遞歸的實(shí)現(xiàn)及應(yīng)用場(chǎng)景

    本文主要介紹了JavaScript尾遞歸的實(shí)現(xiàn)及應(yīng)用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • javascript實(shí)現(xiàn)類(lèi)似于新浪微博搜索框彈出效果的方法

    javascript實(shí)現(xiàn)類(lèi)似于新浪微博搜索框彈出效果的方法

    這篇文章主要介紹了javascript實(shí)現(xiàn)類(lèi)似于新浪微博搜索框彈出效果的方法,涉及javascript彈出搜索框的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Next.js預(yù)期錯(cuò)誤與未捕獲異常的處理方法

    Next.js預(yù)期錯(cuò)誤與未捕獲異常的處理方法

    在開(kāi)發(fā)過(guò)程中,錯(cuò)誤是不可避免的,如何優(yōu)雅地處理這些錯(cuò)誤是提升應(yīng)用穩(wěn)定性與用戶體驗(yàn)的關(guān)鍵,本文將詳細(xì)介紹如何在 Next.js 中處理預(yù)期錯(cuò)誤與未捕獲的異常,包括使用 useFormState 處理預(yù)期錯(cuò)誤,使用錯(cuò)誤邊界捕獲未捕獲的異常,需要的朋友可以參考下
    2025-03-03
  • p5.js實(shí)現(xiàn)故宮橘貓賞秋圖動(dòng)畫(huà)

    p5.js實(shí)現(xiàn)故宮橘貓賞秋圖動(dòng)畫(huà)

    這篇文章主要為大家詳細(xì)介紹了p5.js實(shí)現(xiàn)故宮橘貓賞秋圖動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名器

    JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名器

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評(píng)論