1. 程式人生 > >webpack4.x的變化(二)

webpack4.x的變化(二)

我之前寫過一篇文章webpack4帶來了什麼,這篇文章優點照貓畫虎的意思,文章中說明了一些什麼,但好像是還沒有說透,感覺不是那麼好,所以下定決心,在寫一篇,可能這一篇也有不足,但後續還會繼續補充。話不多說,下面進入正文。

webpack4.x提出的一個口號是實現0配置,也就是說,我們不用新增配置檔案webpack.config.js,就可以實現構建打包的目的。因為,webpack4.x之前的版本,因為要實現構建就需要自己手動來新增配置檔案,不管是大型應用,還是小應用,這一點增加了使用的複雜度,同時也讓學習曲線變得更加陡峭。所以webpack4.x的出現就像一道清流,受人追捧,但同時也帶來了一些

問題,最主要的就是遷移和使用習慣的變化。

webpack4.x的mode選項和optimization外掛

webpack4.x之前,我們需要自己配置mode(mode有三個選項值,developmentproductionnone),然後針對性的配置相應的配置檔案。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
    (注意:windows安裝webapck-cli注意路徑問題);
  • 它啟用了 NamedChunksPluginNamedModulesPlugin 兩個外掛。這兩個外掛時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-mapcheap-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

參考資料