webpack4.x的變化(二)
我之前寫過一篇文章webpack4帶來了什麼,這篇文章優點照貓畫虎的意思,文章中說明了一些什麼,但好像是還沒有說透,感覺不是那麼好,所以下定決心,在寫一篇,可能這一篇也有不足,但後續還會繼續補充。話不多說,下面進入正文。
webpack4.x提出的一個口號是實現0配置
,也就是說,我們不用新增配置檔案webpack.config.js
,就可以實現構建打包的目的。因為,webpack4.x之前的版本,因為要實現構建就需要自己手動來新增配置檔案,不管是大型應用,還是小應用,這一點增加了使用的複雜度,同時也讓學習曲線變得更加陡峭。所以webpack4.x的出現就像一道清流,受人追捧,但同時也帶來了一些
webpack4.x的mode選項和optimization外掛
webpack4.x之前,我們需要自己配置mode(mode有三個選項值,development
、production
和none
),然後針對性的配置相應的配置檔案。webpack4.x中的mode的出現,可以讓我們沒有省去一些不必要的配置(如何要實現精細化的控制,還是需要自定義配置檔案)。很明顯,webpack4.x讓我們省去了一些配置,那麼為了更好的使用webpack4.x,便於以後的擴充套件,或者實現細粒度的控制,你就需要了解不同的mode。
mode: development
也就是之前,我們要自己配置的開發模式,省去了webpack.config.dev.js
配置檔案。
新特性:
- 方便於瀏覽器除錯的工具;
- 可以快速的對增加的內容進行編譯;
- 提供了更精確、更有用的執行時錯誤提示機制
功能:
- 不用設定npm指令碼命令中
webpack --env development
,webapck會自動將development
傳遞給process.env.NODE_ENV
。當然,這裡我們使用的時mode
選項,我們可以在npm指令碼命令為"dev": "webpack --mode development"
,也可以命令列中輸入webpack --mode development
- 它啟用了
NamedChunksPlugin
和NamedModulesPlugin
兩個外掛。這兩個外掛時webapck的內建外掛,在webpack lib目錄
下可以找到。它的作用就是給所有的模組(原始檔)和塊(構建輸出檔案)定義一個名字。
注:在webpack中,如果要使用webpack的內建外掛,需要const webapck = require('webpack')
這樣先引入webapck,然後像 webapck.HotModuleReplacementPlugin()
這樣,啟用啟用內建的熱替換外掛。而webapck內建外掛中有一類優化外掛會經常用到,我們可以 webpack.optimize.uglifyjsplugin()
(這個外掛在webapck4.x中移除了)。
mode: production
也就是之前,我們要自己配置的開發模式,省去了webpack.config.pro.js
配置檔案。
新特性:
- 自動壓縮構建輸出的檔案
- 快速的執行時處理
- 不暴露原始碼和原始檔的路徑
- 快速的靜態資源輸出
功能:
- 不用設定npm指令碼命令中
webpack --env production
,webapck會自動將production
傳遞給process.env.NODE_ENV
。當然,這裡我們使用的時mode
選項,我們可以在npm指令碼命令為"dev": "webpack --mode production"
,也可以命令列中輸入webpack --mode production
。 - 它啟用了
FlagDependencyUsagePlugin
,FlagIncludedChunksPlugin
,ModuleConcatenationPlugin
,NoEmitOnErrorsPlugin
,OccurrenceOrderPlugin
,SideEffectsFlagPlugin
,它們是內建外掛,還啟用了TerserPlugin
這個外掛(它不是webapck內建外掛)。
優化類的外掛:
FlagIncludedChunksPlugin: 檢測並標記模組之間的從屬關係。
ModuleConcatenationPlugin: 可以讓webpack根據模組間的關係依賴圖中,將所有的模組連線成一個模組。
SideEffectsFlagPlugin: 告訴webapck去清除一個大的模組檔案中的未使用的程式碼,這個大的檔案模組可以是自定義的,也可以是第三方的(注意:一定要`package.json`檔案中新增`"sideEffects": false`)。
OccurrenceOrderPlugin: 告訴webapck各個模組間的先後順序,這樣可以實現最優的構建輸出。
TerserPlugin: 它替代了uglifyjs-webpack-plugin外掛。它的作用依然是對構建輸出的程式碼進行壓縮。
mode: none
這種模式下,webpack不做任何優化處理(相較於development和production模式)。webapck4.x所有內建的優化外掛。
優化類的內建外掛有哪些呢?你可以參考 webpack 的optmize目錄
從上面的描述可以看出,webapck4.x的特點就是:上手簡單,構建速度快,良好的開發體驗。
webpack4.x的devtool
它主要使用在development模式下,但也可以作用於production模式下。
development:
預設的配置值是eval
,它的速度快,但效果不好,也可以考慮使用 cheap-eval-source-map
或 cheap-module-eval-source-map
。
production:
可以使用source-map
或者cheap-source-map
webpack4.x的loader和plugin
由於webpack4.x的新特性和新功能,使它形成了新的loader和plugin生態系統。
loader
webpack4.x移除了 this.options
,這個在loader中經常使用的上下文,如果要使用this.options.context
,現在可以通過this.rootContext
。
this.hot
被新增到了loader的上下文中,所以我們可以給指定的程式碼啟動HMR功能。
同樣現在可以將AST
傳遞給loader,而不會出現原來的雙重解析問題。
plugin
webpack4.x的外掛生態系統變化較大,有興趣的可參考tapable。