欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解webpack4之splitchunksPlugin代碼包分拆

 更新時間:2018年12月04日 11:19:30   作者:jaycaoln  
這篇文章主要介紹了詳解webpack4之splitchunksPlugin代碼包分拆,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

本文講解的是最近在做的一個多頁面項目,結(jié)合webpack4的splitChunks進行代碼包分拆的過程

項目框架

項目有home和topic兩個入口文件,主要包括:

  • react、mobx、antd作為項目的基本框架,
  • echarts和d3(畫圖)是項目中部分頁面用到比較大的組件庫
  • src下的工作的組件和代碼
  • 其他的非公共代碼。

兩個入口文件都用react-loadable做了異步加載

import Loadable from 'react-loadable';
...
const LoadableLogin = Loadable({
 loader: () => import('../../common/components/login'),
 loading: Loading,
});
...

webpack部分配置相關(guān)如下:

module.exports = {
 ...
 mode: 'production',
 entry: { // 多入口
 home: './src/home',
 topic: './src/topic',
 },
 output: {
 path: config.build.assetsRoot,
 filename: '[name].js',
 publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath,
 },
 plugins: [
 new HtmlWebpackPlugin({ // home頁面
  filename: 'home.html',
  template: './template.html',
 }),
 new HtmlWebpackPlugin({ // topic頁面
  filename: 'topic.html',
  template: './template.html',
  inject: true,
 }),
 ],
 ...
}

splitChunks

chunks:

  • all: 不管文件是動態(tài)還是非動態(tài)載入,統(tǒng)一將文件分離。當頁面首次載入會引入所有的包
  • async: 將異步加載的文件分離,首次一般不引入,到需要異步引入的組件才會引入。
  • initial:將異步和非異步的文件分離,如果一個文件被異步引入也被非異步引入,那它會被打包兩次(注意和all區(qū)別),用于分離頁面首次需要加載的包。

minSize: 文件最小打包體積,單位byte,默認30000

比如說某個項目下有三個入口文件,a.js和b.js和c.js都是100byte,當我們將minSize設(shè)置為301,那么webpack就會將他們打包成一個包,不會將他們拆分成為多個包。

比如說某個項目下有三個入口文件,a.js和b.js和c.js都是100byte,當我們將minSize設(shè)置為301,那么webpack就會將他們打包成一個包,不會將他們拆分成為多個包。

automaticNameDelimiter: 連接符

假設(shè)我們生成了一個公用文件名字叫vendor,a.js,和b.js都依賴他,并且我們設(shè)置的連接符是"~"那么,最終生成的就是 vendor~a~b.js

maxInitialRequests 入口點處的最大并行請求數(shù),默認為3

如果我們設(shè)置為1,那么每個入口文件就只會打包成為一個文件

maxAsyncRequests 最大異步請求數(shù)量,默認5

如果我們設(shè)置為1,那么每個入口文件就只會打包成為一個文件

優(yōu)先級關(guān)系

maxInitialRequest / maxAsyncRequests <maxSize <minSize。

cacheGroups 定制分割包的規(guī)則

test可以配置正則和寫入function作為打包規(guī)則。其他屬性均可繼承splitChunks,這里必須說一下 priority,設(shè)置包的打包優(yōu)先級,非常重要! (后面結(jié)合實踐)

minChunks

最少引入的次數(shù)

實踐

我們以一個最簡單的配置開始,將公共代碼打包出來

 splitChunks: {
  chunks: 'all', // initial、async和all
  minSize: 30000, // 形成一個新代碼塊最小的體積
  maxAsyncRequests: 5, // 按需加載時候最大的并行請求數(shù)
  maxInitialRequests: 3, // 最大初始化請求數(shù)
  automaticNameDelimiter: '~', // 打包分割符
  name: true,
  cacheGroups: {
  vendors: { // 打包兩個頁面的公共代碼
   minChunks: 2, // 引入兩次及以上被打包
   name: 'vendors', // 分離包的名字
   chunks: 'all'
  },
  }
 },

兩個入口文件的公共代碼被打包到vendor文件夾下面,包括echarts d3 amcharts等一些三方包和src下的公共代碼。

這當然不是我們想要的結(jié)果!存在以下問題:

  • 其實當我們進入網(wǎng)站,一般第一步都是進入一個登陸頁面,需要的只是項目的基本框架代碼,例如react,react-dom.antd等,我們可以用all(或者initial)將它們單獨打包,作為首頁必須載入的包
  • 我們打包的公共包,首次加載頁面的時候,只想把同步加載的加載進來,所以需要一個同步的Common包
  • 像echarts,d3,以及一些src下面一些異步加載的包,將它們利用async將打包成一個獨立異步加載包

我們修改cacheGroups為:

 cacheGroups: {
  vendors: { // 項目基本框架等
   chunks: 'all',
   test: /(react|react-dom|react-dom-router|babel-polyfill|mobx)/,
   priority: 100,
   name: 'vendors',
  },
  'async-commons': { // 異步加載公共包、組件等
   chunks: 'async',
   minChunks: 2,
   name: 'async-commons',
   priority: 90,
  },
  commons: { // 其他同步加載公共包
   chunks: 'all',
   minChunks: 2,
   name: 'commons',
   priority: 80,
  },
  }

這次webpack幫我們打出來的包主要有:

  • async-common:是兩個入口文件都異步加載的三方包和利用react-loader做的懶加載代碼,有echarts,d3等
  • vendors: 包括react,react-dom,antd等
  • commons: 引用超過兩次的同步代碼

這里說兩個需要注意的地方:

  • 注意這里我們priority的設(shè)置,vendors>async-commons>commons,我們首先將react,react-dom等優(yōu)先打包出來,然后再打包公共部分,如果將vendors的優(yōu)先級設(shè)置小于兩個Common的優(yōu)先級,那么react,react-dom將會打包到common包,將不會再生成vendors包。
  • 如果我們這里將commons的配置去掉,將會生成一個topic~home的包,我們配置了async-common提取出異步加載的公共包后,將會默認將同步加載的公共包打包生成以automaticNameDelimiter連接符‘~'生成的名字'topic~home'包,內(nèi)容其實和commons包內(nèi)容完全一樣,

ok!按照我們的要求,這樣首次頁面加載只會引入vendors,commons包,而不會引入async-common包,還是挺棒的!追求更精致的我們,再認真想想,是不是還可以做一些更好的優(yōu)化?

到目前為止我們打包文件的打包是這樣的:

用gzip壓縮后,最大的async-common包有391kb。公司說最近因為一些狀況,布置到生產(chǎn)后速度慢的時候,有時候只能有20kb/s的下載速度==。。。。于是繼續(xù)split!

分析一下:

  • async-common中包含了自己寫的src組件和第三方組件
  • async-common中比較大是echarts,zrender(echarts引入)和d3,結(jié)合項目來說,只有部分頁面我們需要echarts(d3同),所以我們可以考慮將d3和echarts這兩個比較大的包提取出來,等到某個頁面需要的時候,再讓其異步加載,這樣就大大減小了async-common的體積了。

修改

cacheGroups: {
  vendors: { // 基本框架
   chunks: 'all',
   test: /(react|react-dom|react-dom-router|babel-polyfill|mobx)/,
   priority: 100,
   name: 'vendors',
  },
  d3Venodr: { // 將體積較大的d3單獨提取包,指定頁面需要的時候再異步加載
   test: /d3/,
   priority: 100, // 設(shè)置高于async-commons,避免打包到async-common中
   name: 'd3Venodr',
   chunks: 'async'
  },
  echartsVenodr: { // 異步加載echarts包
   test: /(echarts|zrender)/,
   priority: 100, // 高于async-commons優(yōu)先級
   name: 'echartsVenodr',
   chunks: 'async'
  },
  'async-commons': { // 其余異步加載包
   chunks: 'async',
   minChunks: 2,
   name: 'async-commons',
   priority: 90,
  },
  commons: { // 其余同步加載包
   chunks: 'all',
   minChunks: 2,
   name: 'commons',
   priority: 80,
  },
  }

當然,每次修改后,需要在htmlWebpackPlugin中配置chunk需要的包

 plugins: [
 new HtmlWebpackPlugin({ // home頁面
  filename: 'home.html',
  template: './template.html',
  chunks: ['vendors', 'commons', 'home'],
 }),
 new HtmlWebpackPlugin({ // topic頁面
  filename: 'topic.html',
  template: './template.html',
  chunks: ['vendors', 'commons', 'topic'],
 }),
 ],

后期還做了其他的拆分和優(yōu)化,大概最大的包保持在100k左右,當然也不建議拆的特別小,因為瀏覽器http1可能一次性支持6次下載文件,太多可能會適得其反。大家可以根據(jù)自己的項目做不同的拆分方法,總而言之,就是為了讓項目更完美的在線上運行,給用戶更好的體驗~

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

相關(guān)文章

  • 關(guān)于BootStrap modal 在IOS9中不能彈出的解決方法(IOS 9 bootstrap modal ios 9 noticework)

    關(guān)于BootStrap modal 在IOS9中不能彈出的解決方法(IOS 9 bootstrap modal ios

    本文給大家介紹BootStrap modal 在IOS9中不能彈出的問題以及bootstrap datepicker 在bootstrap modal中不顯示問題的解決方案,非常不錯,需要的朋友參考下
    2016-12-12
  • JavaScript實現(xiàn)自動生成帶水印的圖片

    JavaScript實現(xiàn)自動生成帶水印的圖片

    這篇文章主要來和大家一起討論如何利用JavaScript實現(xiàn)一個復(fù)雜功能,該功能可以自動為圖片添加水印,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • JQuery 前臺切換網(wǎng)站的樣式實現(xiàn)

    JQuery 前臺切換網(wǎng)站的樣式實現(xiàn)

    本文說的是在WordPress中怎樣利用JQuery在網(wǎng)站的前臺切換樣式的方法?;蛘哌@篇文章的方法大家可能不是太需要,因為我覺得這是解決我被主題樣式折騰到差不多分裂的原因及結(jié)果的最后手段。
    2009-06-06
  • React?diff算法面試考點超詳細講解

    React?diff算法面試考點超詳細講解

    渲染真實DOM的開銷很大,有時候我們修改了某個數(shù)據(jù),直接渲染到真實dom上會引起整個dom樹的重繪和重排。我們希望只更新我們修改的那一小塊dom,而不是整個dom,diff算法就幫我們實現(xiàn)了這點。diff算法的本質(zhì)就是:找出兩個對象之間的差異,目的是盡可能做到節(jié)點復(fù)用
    2022-12-12
  • 弱類型語言javascript中 a,b 的運算實例小結(jié)

    弱類型語言javascript中 a,b 的運算實例小結(jié)

    這篇文章主要介紹了弱類型語言javascript中 a,b 的運算,結(jié)合實例形式總結(jié)分析了js閉包函數(shù)中布爾值與字符串的a,b運算相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • layui多iframe頁面控制定時器運行的方法

    layui多iframe頁面控制定時器運行的方法

    今天小編就為大家分享一篇layui多iframe頁面控制定時器運行的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 理解JavaScript事件對象

    理解JavaScript事件對象

    這篇文章主要為大家介紹了JavaScript事件對象,了解JavaScript事件
    2016-01-01
  • JS中如何設(shè)置readOnly的值

    JS中如何設(shè)置readOnly的值

    本篇文章主要是對JS中設(shè)置readOnly值的方法進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • JSON+JavaScript處理JSON的簡單例子

    JSON+JavaScript處理JSON的簡單例子

    JSON+JavaScript處理JSON的簡單例子,需要的朋友可以參考一下
    2013-03-03
  • js以對象為索引的關(guān)聯(lián)數(shù)組

    js以對象為索引的關(guān)聯(lián)數(shù)組

    在代碼邏輯中更多的是用關(guān)聯(lián)數(shù)組的方式。但即使是這樣我們也很少使用對象類型作為鍵值對的鍵名。
    2010-07-07

最新評論