首頁 web前端 js教程 使用CommonsChunkPlugin如何做才能抽出公共模組

使用CommonsChunkPlugin如何做才能抽出公共模組

Jun 14, 2018 pm 03:18 PM
抽取

下面我就為大家分享一篇簡單談談CommonsChunkPlugin抽取公共模組,具有很的參考價值,希望對大家有幫助。

引言

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的回答

上面是我整理給大家的,希望今後會對大家有幫助。

相關文章:

有關Vue2.0父子元件間實作派發機制(詳細教學)

jQuery SpringMVC中的複選框選擇與傳值實例_jquery

在SpringMVC中post如何取得多選框value的值(程式碼實例)

##使用Vue如何設定多個Class

以上是使用CommonsChunkPlugin如何做才能抽出公共模組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1667
14
CakePHP 教程
1426
52
Laravel 教程
1328
25
PHP教程
1273
29
C# 教程
1255
24
JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在行動中:現實世界中的示例和項目 JavaScript在行動中:現實世界中的示例和項目 Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

了解JavaScript引擎:實施詳細信息 了解JavaScript引擎:實施詳細信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:社區,圖書館和資源 Python vs. JavaScript:社區,圖書館和資源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python vs. JavaScript:開發環境和工具 Python vs. JavaScript:開發環境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

See all articles