最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡(jiǎn)單談?wù)凜ommonsChunkPlugin抽取公共模塊

 更新時(shí)間:2017年12月31日 10:04:21   作者:wonyun  
下面小編就為大家分享一篇簡(jiǎn)單談?wù)凜ommonsChunkPlugin抽取公共模塊,具有很的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

引言

webpack插件CommonsChunkPlugin的主要作用是抽取webpack項(xiàng)目入口chunk的公共部分,具體的用法就不做過(guò)多介紹,不太了解可以參考webpack官網(wǎng)介紹;

該插件是webpack項(xiàng)目常用的一個(gè)優(yōu)化功能,幾乎在每個(gè)webpack項(xiàng)目中都會(huì)用到。使用該插件帶來(lái)的好處:

提升webpack打包速度和項(xiàng)目體積:將webpack入口的chunk文件中所有公共的代碼提取出來(lái),減少代碼體積;同時(shí)提升webpack打包速度。

利用緩存機(jī)制:依賴(lài)的公共模塊文件一般很少更改或者不會(huì)更改,這樣獨(dú)立模塊文件提取出可以長(zhǎng)期緩存。

但是在項(xiàng)目中,若插件打開(kāi)方式不正確的話(huà),上面的第二點(diǎn)其實(shí)是無(wú)法實(shí)現(xiàn),因?yàn)檫@種情況下:

沒(méi)有被修改過(guò)的公有代碼或庫(kù)代碼打包出的Entry Chunk,會(huì)隨著其他業(yè)務(wù)代碼的變化而變化,導(dǎo)致頁(yè)面上的長(zhǎng)緩存機(jī)制失效。

那么,下面就來(lái)開(kāi)啟CommonsChunkPlugin正確的打開(kāi)方式。

CommonsChunkPlugin不正確用法

假如將我們項(xiàng)目的公共庫(kù)如react、react-dom、react-router與業(yè)務(wù)代碼隔離,將其提取為vendor chunk,webpack配置如下:

const webpack = require("webpack");
const path = require('path');
module.exports = {
 entry: {
 app: "./app.js",
 vendor: ["react","react-dom", "redux", "react-redux", "react-router-redux"]
 },
 output: {
 path: path.resolve(__dirname, 'output'),
 filename: "[name].[chunkhash].js"
 },
 plugins: [
 new webpack.optimize.CommonsChunkPlugin({names: ["vendor"]})
 ]
};

上面將項(xiàng)目一些基礎(chǔ)庫(kù)打包成一個(gè)名為vendor的chunk中,并將業(yè)務(wù)相關(guān)的代碼打包到一個(gè)名為app的chunk中;

webpack打包編譯后的結(jié)果如下:

我們對(duì)其中的業(yè)務(wù)代碼app.js進(jìn)行修改后,重新編譯結(jié)果如下:

可以發(fā)現(xiàn),在CommonsChunkPlugin這種配置下,當(dāng)業(yè)務(wù)代碼app發(fā)生變化,而庫(kù)代碼也跟著變化,vender的chunkhash也跟著變化,這樣vendor的引用的名稱(chēng)跟著變化,導(dǎo)致瀏覽器端的長(zhǎng)緩存機(jī)制失效。

引起問(wèn)題的原因

引起webpack每次打包編譯時(shí)vendor跟著變化的原因:

webpack每次build的時(shí)候都會(huì)生成一些運(yùn)行時(shí)代碼。當(dāng)只有一個(gè)文件時(shí),運(yùn)行時(shí)代碼直接塞到這個(gè)文件中。當(dāng)有多個(gè)文件時(shí),運(yùn)行時(shí)代碼會(huì)被提取到公共文件中,也就是上面CommonsChunkPlugin配置的vendor chunk中。

webpack每次編譯時(shí)產(chǎn)生的運(yùn)行時(shí)代碼,包括全局webpackJsonp方法的定義和維護(hù)模塊依賴(lài)關(guān)系,具體可以參考這里的commons.js。

所以,上面webpack的CommonsChunkPlugin配置中,每次編譯時(shí)這些代碼都會(huì)打包到vendor中,導(dǎo)致每次vendor的chunkhash每次都會(huì)變化。

那么,我們可以在對(duì)vendor chunk進(jìn)行配置,抽取其中的公共代碼,即webpack運(yùn)行時(shí)代碼,這樣就可以將項(xiàng)目依賴(lài)的基礎(chǔ)庫(kù)模塊與業(yè)務(wù)模塊隔離開(kāi)來(lái),因?yàn)椴粫?huì)對(duì)這些文件進(jìn)行修改,所以這些文件可達(dá)到長(zhǎng)緩存的作用。具體配置如下:

module.exports = {
 entry: {
 app: "./app.js",
 vendor: ["react","react-dom", "redux", "react-redux", "react-router-redux"]
 },
 ....
 plugins: [
 new webpack.optimize.CommonsChunkPlugin({names: ["vendor"]}),
 new webpack.optimize.CommonsChunkPlugin({
 name: 'manifest',
 chunks: ['vendor']
 })
 ]
};

這樣,即使修改業(yè)務(wù)app代碼,項(xiàng)目依賴(lài)的基礎(chǔ)庫(kù)vendor chunk也不會(huì)發(fā)生變化;只是抽取的manifest chunk每次還會(huì)變化,但是這個(gè)文件體積非常小,相比vendor來(lái)說(shuō)這種方式的收益更大。如下圖:

修改app代碼后的打包編譯結(jié)果如下,可以看到vendor的chunkhash沒(méi)有變化

在webpack中配置CommonsChunkPlugin時(shí)需要注意一點(diǎn):

配置webpack的output項(xiàng)時(shí),其filename和chunkFilename必須使用chunkhash。不要使用hash,否則即使按照上面的配置也不能達(dá)到預(yù)期的效果。至于hash與chunkhash的區(qū)別,可參考github的回答

以上這篇簡(jiǎn)單談?wù)凜ommonsChunkPlugin抽取公共模塊就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript和jquery獲取父級(jí)元素、子級(jí)元素、兄弟元素的方法

    JavaScript和jquery獲取父級(jí)元素、子級(jí)元素、兄弟元素的方法

    本文給大家簡(jiǎn)單總結(jié)了下JavaScript和jquery獲取父級(jí)元素、子級(jí)元素、兄弟元素的方法,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下
    2016-06-06
  • js字符串中空格和換行符(\r,\s,\n,\r\n)淺析

    js字符串中空格和換行符(\r,\s,\n,\r\n)淺析

    我們?cè)谑褂米址畷r(shí)經(jīng)常會(huì)遇到換行問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于js字符串中空格和換行符(\r,\s,\n,\r\n)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 在JS中判斷兩個(gè)對(duì)象是否相等方法詳解

    在JS中判斷兩個(gè)對(duì)象是否相等方法詳解

    在JavaScript中,判斷兩個(gè)對(duì)象是否相等有多種方法,取決于你對(duì)相等的定義以及對(duì)象屬性的類(lèi)型,本文將介紹幾種常見(jiàn)的方法,感興趣的同學(xué)可以參考閱讀
    2023-05-05
  • JavaScript加載速度優(yōu)化方法

    JavaScript加載速度優(yōu)化方法

    通過(guò)使用CDN、壓縮、異步加載、盡可能的減少JavaScript文件大小、利用緩存機(jī)制、使用Vanilla?JS、使用ES6特性、將JavaScript文件放到底部、減少對(duì)DOM的訪(fǎng)問(wèn)以及避免重復(fù)代碼等方法,可以?xún)?yōu)化JavaScript文件的加載和執(zhí)行速度,提供更好的用戶(hù)體驗(yàn)和更高的性能
    2023-08-08
  • JavaScript字符串對(duì)象(string)基本用法示例

    JavaScript字符串對(duì)象(string)基本用法示例

    這篇文章主要介紹了JavaScript字符串對(duì)象(string)基本用法,結(jié)合實(shí)例形式分析了js字符串的添加、計(jì)算、獲取、替換等操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-01-01
  • 微信小程序scroll-view仿拼多多橫向滑動(dòng)滾動(dòng)條

    微信小程序scroll-view仿拼多多橫向滑動(dòng)滾動(dòng)條

    這篇文章主要為大家詳細(xì)介紹了微信小程序scroll-view仿拼多多橫向滑動(dòng)滾動(dòng)條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • js獲取上傳文件的絕對(duì)路徑實(shí)現(xiàn)方法

    js獲取上傳文件的絕對(duì)路徑實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇js獲取上傳文件的絕對(duì)路徑實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • JavaScript實(shí)現(xiàn)N皇后問(wèn)題算法謎題解答

    JavaScript實(shí)現(xiàn)N皇后問(wèn)題算法謎題解答

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)N皇后問(wèn)題算法謎題解答,N皇后問(wèn)題是指將N個(gè)皇后放置在NxN的國(guó)際象棋棋盤(pán)上,其中沒(méi)有任何兩個(gè)皇后處于同一行、同一列或同一對(duì)角線(xiàn)上,以使得它們不能互相攻擊,需要的朋友可以參考下
    2014-12-12
  • D3.js實(shí)現(xiàn)繪制柱狀圖的教程詳解

    D3.js實(shí)現(xiàn)繪制柱狀圖的教程詳解

    這篇文章主要為大家詳細(xì)介紹了如何通過(guò)D3.js實(shí)現(xiàn)繪制柱狀圖,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)D3.js有一定的幫助,需要的可以參考一下
    2022-11-11
  • JS實(shí)現(xiàn)三個(gè)層重疊點(diǎn)擊互相切換的方法

    JS實(shí)現(xiàn)三個(gè)層重疊點(diǎn)擊互相切換的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)三個(gè)層重疊點(diǎn)擊互相切換的方法,涉及JavaScript動(dòng)態(tài)操作頁(yè)面定位屬性的相關(guān)技巧,需要的朋友可以參考下
    2015-10-10

最新評(píng)論

灌南县| 瑞金市| 新乐市| 旬阳县| 曲水县| 南丹县| 安平县| 阳新县| 中方县| 上蔡县| 襄樊市| 蓬溪县| 枝江市| 安化县| 常山县| 正阳县| 华容县| 耒阳市| 萝北县| 长汀县| 阿拉善盟| 永靖县| 乐亭县| 彰化市| 陈巴尔虎旗| 上思县| 张家川| 宁阳县| 吉隆县| 吉安市| 华亭县| 桦川县| 甘洛县| 昌平区| 烟台市| 大兴区| 平潭县| 南郑县| 岢岚县| 泰和县| 汉川市|