在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 關(guān)于webpack代碼分割優(yōu)化前端項目的一些疑問?

關(guān)于webpack代碼分割優(yōu)化前端項目的一些疑問?

最近一直在研究這塊內(nèi)容,希望能夠讓站點加載速度最優(yōu),自己單獨新建了一個項目,對著webpack的官方文檔做了一些實驗,但是結(jié)果和預(yù)期(文檔里面提到的結(jié)果)還是有很大差別,有時候感覺根本實現(xiàn)不了……

項目結(jié)構(gòu)非常加單,如下圖:
圖片描述

首頁(IndexPage)有兩個菜單,分別對應(yīng)(Menu1、Menu2),兩個菜單都引用了兩個分頁組件(Pagination、Pagination2)。

路由如下:

routes: [
  {
    path: '/', name: 'index', component: IndexPage, children:[
      {path: '/menu1', name: 'menu1', component: Menu1, hidden: true},
      {path: '/menu2', name: 'menu2', component: Menu2, hidden: true},
    ],
  }
]

:頁面(組件)中所有的import語句改為require.ensure。

以下是我的一些疑問:

1、按照上面的說明,現(xiàn)在所有的組件都分開打包了,其實只是用到了壓縮,其實這樣還是不夠理想的,有些組件可能只有幾k甚至更小,導(dǎo)致請求非常多。那么該如何設(shè)定這個分界點呢?什么樣的打包到一起?什么樣的分開打包?一個文件大概多大合適?
2、require.ensure()方法,第三個參數(shù)相同的組件可以打包到一起,但是這樣感覺太不方便了,假設(shè)paage頁面用到了分頁組件,并取名(提供第三個參數(shù)),那么其他的頁面在引用的時候也需要使用該名字,這樣如果項目大,就會非常麻煩,需要的名字太多了,改如何組織打包呢?
3、把第三方組件分開打包,確保每次打包的名稱都不變化,這樣就能利用緩存了,因為引用的第三方庫如果版本不變,內(nèi)容就不變,所以不需要每次都改名、打包發(fā)布?配置如下:

  entry: {
    app: ["babel-polyfill", "./src/main.js"],
    vendors: ['vuex', 'vee-validate', 'vue-cookie', 'vue-i18n', 'vue-router'],
  },

  plugins: [
    //new webpack.optimize.CommonsChunkPlugin('common.js'),
    new webpack.optimize.CommonsChunkPlugin({
      name: 'vendors', 
      filename: 'vendors.js'
    }),
    /*new webpack.ProvidePlugin({
      jQuery: "jquery",
      $: "jquery"
    })*/
  ]

錯誤信息如下:
圖片描述

綠色部分表示打包成功了,但是又有紅色的錯誤提示,這是什么意思呢?關(guān)鍵是打包出來的vendors.xxxx.js沒有什么內(nèi)容,預(yù)期是把這些第三方庫打包到一起,利用緩存,每次打包名字(hash保持)相同?

回答
編輯回答
懶豬

逐個交流下

1、按照上面的說明,現(xiàn)在所有的組件都分開打包了,其實只是用到了壓縮,其實這樣還是不夠理想的,有些組件可能只有幾k甚至更小,導(dǎo)致請求非常多。那么該如何設(shè)定這個分界點呢?什么樣的打包到一起?什么樣的分開打包?一個文件大概多大合適?

按需加載的分界的確不太好確定,我一般的判斷準則是:當我處于當前路由時,是否需要其他路由的視圖組件局部組件。比如這里為了做優(yōu)化,我會將Menu1和Menu1兩個從路由視圖組件級別上就先做一個按需加載的分割。

題主對所有的引用模塊都使用require.ensure(),它的結(jié)果只是說將這些按需模塊單獨抽出成一個個小的chunk塊,一多反而多了一堆請求了,得不償失。很多子chunk塊之間,其實功能是關(guān)聯(lián)的,本來就不需要各自按需,所以還是分界點問題。

總之就是當前主業(yè)務(wù)邏輯用的到的,都應(yīng)該初始打包在一起,需要條件再觸發(fā)的局部組件才按需加載。盡量以一組功能塊為原則,將組件模塊打包在一起。

分界點其實我也給不了什么好建議,可能更多的是看經(jīng)驗。一個文件沒有多大才合適,我也給不了答案。不過提供兩個插件,題主可以看看MinChunkSizePluginLimitChunkCountPlugin

2、require.ensure()方法,第三個參數(shù)相同的組件可以打包到一起,但是這樣感覺太不方便了,假設(shè)paage頁面用到了分頁組件,并取名(提供第三個參數(shù)),那么其他的頁面在引用的時候也需要使用該名字,這樣如果項目大,就會非常麻煩,需要的名字太多了,改如何組織打包呢?

我當時也用過以group的形式成組打包,使用group的方式可以減緩按需加載粒度太細產(chǎn)生多余的請求和網(wǎng)絡(luò)不穩(wěn)定而產(chǎn)生的延遲等待。

我當時的group形式打包,我是按照如下策略的方式組織的。

  • 將所有可能初次就進入的頁面打包在一起(比如首頁、用戶最喜歡分享的頁面等等)
  • 將用戶在1的基礎(chǔ)上,最容易被引導(dǎo)去點擊的頁面
  • 其余的路由頁
  • 錯誤頁

3、把第三方組件分開打包,確保每次打包的名稱都不變化,這樣就能利用緩存了,因為引用的第三方庫如果版本不變,內(nèi)容就不變,所以不需要每次都改名、打包發(fā)布。

官方提供了兩個插件,來解決此問題

  • NamedModulesPlugin - 建議開發(fā)環(huán)境使用
  • HashedModuleIdsPlugin - 建議生產(chǎn)環(huán)境使用

報錯內(nèi)容,由于線索太少,分析不出來,不過可以看看你的WDS是不是設(shè)置了inline:false

2017年11月7日 14:05