最近一直在研究這塊內(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)驗。一個文件沒有多大才合適,我也給不了答案。不過提供兩個插件,題主可以看看
MinChunkSizePlugin和LimitChunkCountPlugin
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
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。