国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

CommonsChunkPlugin抽取公共模塊的示例分析

發(fā)布時(shí)間:2021-07-27 11:48 來(lái)源:億速云 閱讀:0 作者:小新 欄目: web開(kāi)發(fā)

小編給大家分享一下CommonsChunkPlugin抽取公共模塊的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

引言

webpack插件CommonsChunkPlugin的主要作用是抽取webpack項目入口chunk的公共部分

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

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

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

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

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

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

CommonsChunkPlugin不正確用法

假如將我們項目的公共庫如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"]})
 ]
};

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

webpack打包編譯后的結果如下:

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

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

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

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

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

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

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

那么,我們可以在對vendor chunk進(jìn)行配置,抽取其中的公共代碼,即webpack運行時(shí)代碼,這樣就可以將項目依賴(lài)的基礎庫模塊與業(yè)務(wù)模塊隔離開(kāi)來(lái),因為不會(huì )對這些文件進(jìn)行修改,所以這些文件可達到長(chá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代碼,項目依賴(lài)的基礎庫vendor chunk也不會(huì )發(fā)生變化;只是抽取的manifest chunk每次還會(huì )變化,但是這個(gè)文件體積非常小,相比vendor來(lái)說(shuō)這種方式的收益更大。如下圖:

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

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

配置webpack的output項時(shí),其filename和chunkFilename必須使用chunkhash。不要使用hash,否則即使按照上面的配置也不能達到預期的效果。

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系站長(cháng)郵箱:ts@56dr.com進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

无遮挡十八禁污污网站在线观看| 肥老熟妇伦子伦456视频| 一本久久精品一区二区| 曰本大码熟中文字幕| 亚洲大尺度无码专区尤物| 吃奶呻吟打开双腿做受在线视频|