成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Webpack CommonsChunkPlugin 理解

YJNldm / 3562人閱讀

摘要:未定義時(shí)使用作為文件名。表示公共創(chuàng)建所需要的所有模塊的最小體積。如果設(shè)置為,公共的所有子模塊將會(huì)被選中。使用來(lái)命名文件,實(shí)現(xiàn)文件緩存的功能。當(dāng)文件內(nèi)容發(fā)生變化,文件名會(huì)隨之改變。代碼中再次使用了,從中提取出了名為的運(yùn)行時(shí)代碼。

CommonsChunkPlugin配置簡(jiǎn)介

最近讀了一下webpack的文檔,讀到CommonsChunkPlugin這個(gè)插件,深深折服于webpack的強(qiáng)大,同時(shí)也產(chǎn)生了一些自己的疑問。

首先,CommonsChunkPlugin這個(gè)插件是用來(lái)提取公共代碼的,通過將公共模塊提取出來(lái),只在頁(yè)面加載的時(shí)候引入一次,提升應(yīng)用的加載效率。

順便提一下,chunk其實(shí)就是代碼塊的意思,可能是一個(gè)或多個(gè)模塊,一般提取后就是一個(gè)js文件。

CommonsChunkPlugin有中文翻譯的文檔,但是感覺并不是很通順,英文文檔看完也有一些疑惑,比如minChunks到底是做什么用的,怎么用?chunks是什么?

配置項(xiàng)

首先貼一下文檔。

{
  name: "string",
  names: "string[]",
  filename: "string",
  minChunks: "number|Infinity|function(module, count) -> boolean",
  chunks: "string[]",
  children: "boolean",
  async: "boolean|string",
  minSize: "number"
}

name和names:chunk的名稱,如果這個(gè)chunk已經(jīng)在entry中定義,該chunk會(huì)被直接提??;如果沒有定義,則生成一個(gè)空的chunk來(lái)提取其他所有chunk的公共代碼。

filename:可以指定提取出的公共代碼的文件名稱,可以使用output配置項(xiàng)中文件名的占位符。未定義時(shí)使用name作為文件名。

chunks:可以指定要提取公共模塊的源chunks,指定的chunk必須是公共chunk的子模塊,如果沒有指定則使用所有entry中定義的入口chunk。

minChunks:在一個(gè)模塊被提取到公共chunk之前,它必須被最少minChunks個(gè)chunk所包含(通俗的說就是一個(gè)模塊至少要被minChunks個(gè)模塊所引用,才能被提取到公共模塊。)。minChunks參數(shù)有三點(diǎn)需要說明:

該數(shù)字必須不小于2或者不大于chunks的個(gè)數(shù)。默認(rèn)值等于chunks的個(gè)數(shù)。

如果指定了Infinity,則創(chuàng)建一個(gè)公共chunk,但是不包含任何模塊,內(nèi)部是一些webpack生成的runtime代碼和chunk自身包含的模塊(如果chunk存在的話)。

用戶也可以定制自己的邏輯去生成代碼。

minSize:表示公共chunk創(chuàng)建所需要的所有模塊的最小體積。

async:如果設(shè)置為true,一個(gè)異步的公共chunk將會(huì)作為options.name的子塊和options.chunks的兄弟塊被創(chuàng)建。該chunk會(huì)與options.chunks并行加載。你也可以使用該參數(shù)指定輸出的文件名。

children:如果設(shè)置為true,公共chunk的所有子模塊將會(huì)被選中。

例子

我們看一個(gè)簡(jiǎn)單的例子。

module.exports = {
    entry: {
        app: "./src/index.js",
        vender: [
            "lodash",
            "otherlib"
        ]
    },
    plugins: [
        new webpack.optimize.CommonsChunkPlugin({
            name: "vender"
        })
    ],
    output: {
        // 使用Hash來(lái)命名文件,實(shí)現(xiàn)文件緩存的功能。當(dāng)文件內(nèi)容發(fā)生變化,文件名會(huì)隨之改變。
        filename: "[name].[chunkhash].js", 
        path: path.resolve(__dirname, "dist")
    }
};

上面的代碼中定義了兩個(gè)入口,app和vender(公共庫(kù)),plugins中使用CommonsChunkPlugin提取vender。

vender是我們提取出來(lái)的公共chunk,通常不會(huì)被修改,所以理應(yīng)在每次編譯后文件名保持一致。然而,我們嘗試修改入口文件index.js會(huì)發(fā)現(xiàn),vender的文件名會(huì)發(fā)生變化。

原因呢上面提到過,由于每次編譯會(huì)導(dǎo)致vender的module.id發(fā)生變化,內(nèi)部的runtime代碼隨之發(fā)生改變。

解決方案有以下幾種:

使用NamedModulesPlugin插件,用文件路徑而非默認(rèn)的數(shù)字ID來(lái)作為模塊標(biāo)識(shí)。

使用HashedModuleIdsPlugin插件,用相對(duì)路徑的Hash值來(lái)作為模塊標(biāo)識(shí)。推薦在生產(chǎn)環(huán)境中使用。

將runtime部分的代碼提取到一個(gè)多帶帶的文件中,代碼如下。

module.exports = {
    entry: {
        app: "./src/index.js",
        vender: [
            "lodash"
        ]
    },
    plugins: [
        new webpack.optimize.CommonsChunkPlugin({
            name: "vender",
            minChunks: Infinity
        }),
        new webpack.optimize.CommonsChunkPlugin({
            name: "manifest",
            chunks: ["vender"]
        })
    ],
    output: {
        filename: "[name].[chunkhash].js",
        path: path.resolve(__dirname, "dist")
    }
};

代碼中再次使用了CommonsChunkPlugin,從vender中提取出了名為manifest的運(yùn)行時(shí)代碼。

分析Vue的使用方式

Vue在production模式中使用如下配置

// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
  name: "vendor",
  minChunks: function (module, count) {
    // any required modules inside node_modules are extracted to vendor
    return (
      module.resource &&
      /.js$/.test(module.resource) &&
      module.resource.indexOf(
        path.join(__dirname, "../node_modules")
      ) === 0
    )
  }
}),
// extract webpack runtime and module manifest to its own file in order to
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
  name: "manifest",
  chunks: ["vendor"]
})
自定義minChunks

minChunks配置項(xiàng)有兩個(gè)參數(shù),module為當(dāng)前要提取的源chunk中所包含的模塊,count表示模塊的個(gè)數(shù)。
自定義函數(shù)會(huì)被循環(huán)調(diào)用,直到遍歷完所有模塊。

module.resource為模塊的絕對(duì)路徑,所以這段代碼判斷了模塊是否在node_modules下,是的話則打包到vender中。

后面一個(gè)CommonsChunkPlugin從vender中提取了運(yùn)行時(shí)代碼,避免每次打包vender的Hash值都發(fā)生變化導(dǎo)致緩存無(wú)效。

如有問題,歡迎指正。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89000.html

相關(guān)文章

  • Webpack 4.0 CommonsChunkPlugin 和 optimization spli

    摘要:可以通過配置屬性進(jìn)行修改,默認(rèn)將會(huì)自動(dòng)創(chuàng)建個(gè)庫(kù)文件僅含有依然會(huì)創(chuàng)建個(gè)庫(kù)文件僅含有假設(shè)所有的體積都大于將會(huì)創(chuàng)建一個(gè)庫(kù)文件和一個(gè)通用組件文件僅含有當(dāng)這些體積小于是,會(huì)故意將該模塊復(fù)制到三個(gè)文件中。 該文章內(nèi)容大致翻譯自 webpack 4: Code Splitting, chunk graph and the splitChunks optimization 原有的問題 webpack...

    Caizhenhao 評(píng)論0 收藏0
  • 從零開始的webpack生活-0x007:CommonsChunkPlugin基本用法

    摘要:概述上一章講的是,和這一章依舊沒有絲毫關(guān)系,這一章講的是說實(shí)在的,這個(gè)插件略復(fù)雜,我還沒完全搞懂,大概是還沒到那么深我就已經(jīng)選擇其他解決方案了吧,所以這里只講一些基本用法。直接打包幾個(gè)包當(dāng)然還有許多更加復(fù)雜的用法,還請(qǐng)看關(guān)于章節(jié)資源源代碼 0x001 概述 上一章講的是providerPlugin,和這一章依舊沒有絲毫關(guān)系,這一章講的是CommonsChunkPlugin,說實(shí)在的,這...

    Sleepy 評(píng)論0 收藏0
  • 前端臨床手札——webpack構(gòu)建逐步解構(gòu)(下)

    摘要:續(xù)前端臨床手札構(gòu)建逐步解構(gòu)上工作流程案例最近添加了雪碧圖功能,并把替換成的,詳細(xì)可以看分支構(gòu)建生產(chǎn)上一篇說完了本地測(cè)試和是如何工作,接下來(lái)分析構(gòu)建生產(chǎn)模式下配置如何配置和每個(gè)模塊干了什么。 續(xù) 前端臨床手札——webpack構(gòu)建逐步解構(gòu)(上) 工作流程 showImg(https://segmentfault.com/img/bVCXjo?w=793&h=410); 案例:multip...

    TerryCai 評(píng)論0 收藏0
  • webpack.optimize.CommonsChunkPlugin的minChunks解析

    摘要:,顧名思義,是用來(lái)把公用模塊打包到一起的插件,以減小打包后文件的體積。令人迷惑的中文社區(qū)和官網(wǎng)都對(duì)此屬性語(yǔ)焉不詳。官網(wǎng)的解釋我實(shí)在看不懂在被放到共同之前需要包含模塊的的最小數(shù)量。當(dāng)大于等于設(shè)定的值時(shí),該模塊就會(huì)被打包到公用包中。 CommonsChunkPlugin, 顧名思義,是用來(lái)把公用模塊打包到一起的插件,以減小打包后js文件的體積。 令人迷惑的minChunks 中文社區(qū)和官網(wǎng)...

    lavor 評(píng)論0 收藏0
  • webpack: 從指定入口文件中提取公共文件

    摘要:通過函數(shù),指定三個(gè)入口文件為,同時(shí)我們還要設(shè)置為,表示指定三個(gè)入口文件中提取出的公共文件,最少要被三個(gè)不同的入口文件引用。所以就是從三個(gè)入口文件中提取公共的文件。從兩個(gè)公共文件中,再提取公共部分先說一下,這是什么意思有個(gè)公共文件。 在不明白CommonsChunkPlugin的使用情況下,直接上手webpack4的splitChunks,實(shí)在是難上加難。為了能更好的理解splitChu...

    tuomao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<