国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

簡單談談CommonsChunkPlugin抽取公共模塊

2019-11-19 14:37:17
字體:
來源:轉載
供稿:網友

引言

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

該插件是webpack項目常用的一個優化功能,幾乎在每個webpack項目中都會用到。使用該插件帶來的好處:

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

利用緩存機制:依賴的公共模塊文件一般很少更改或者不會更改,這樣獨立模塊文件提取出可以長期緩存。

但是在項目中,若插件打開方式不正確的話,上面的第二點其實是無法實現,因為這種情況下:

沒有被修改過的公有代碼或庫代碼打包出的Entry Chunk,會隨著其他業務代碼的變化而變化,導致頁面上的長緩存機制失效。

那么,下面就來開啟CommonsChunkPlugin正確的打開方式。

CommonsChunkPlugin不正確用法

假如將我們項目的公共庫如react、react-dom、react-router與業務代碼隔離,將其提取為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"]}) ]};

上面將項目一些基礎庫打包成一個名為vendor的chunk中,并將業務相關的代碼打包到一個名為app的chunk中;

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

我們對其中的業務代碼app.js進行修改后,重新編譯結果如下:

可以發現,在CommonsChunkPlugin這種配置下,當業務代碼app發生變化,而庫代碼也跟著變化,vender的chunkhash也跟著變化,這樣vendor的引用的名稱跟著變化,導致瀏覽器端的長緩存機制失效。

引起問題的原因

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

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

webpack每次編譯時產生的運行時代碼,包括全局webpackJsonp方法的定義和維護模塊依賴關系,具體可以參考這里的commons.js。

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

那么,我們可以在對vendor chunk進行配置,抽取其中的公共代碼,即webpack運行時代碼,這樣就可以將項目依賴的基礎庫模塊與業務模塊隔離開來,因為不會對這些文件進行修改,所以這些文件可達到長緩存的作用。具體配置如下:

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'] }) ]};

這樣,即使修改業務app代碼,項目依賴的基礎庫vendor chunk也不會發生變化;只是抽取的manifest chunk每次還會變化,但是這個文件體積非常小,相比vendor來說這種方式的收益更大。如下圖:

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

在webpack中配置CommonsChunkPlugin時需要注意一點:

配置webpack的output項時,其filename和chunkFilename必須使用chunkhash。不要使用hash,否則即使按照上面的配置也不能達到預期的效果。至于hash與chunkhash的區別,可參考github的回答

以上這篇簡單談談CommonsChunkPlugin抽取公共模塊就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 华安县| 嫩江县| 应城市| 平乡县| 襄垣县| 儋州市| 朔州市| 阆中市| 化德县| 明溪县| 淮阳县| 邓州市| 大荔县| 达州市| 鹿邑县| 交口县| 彰化市| 岐山县| 公安县| 吉木萨尔县| 扬中市| 清苑县| 大邑县| 麻城市| 汶川县| 区。| 淮南市| 兴义市| 运城市| 桃江县| 保亭| 任丘市| 黑龙江省| 团风县| 鄢陵县| 文昌市| 土默特右旗| 辉南县| 昌平区| 江陵县| 榆中县|