摘要:默認出入口在中,不再強制要求指定和路徑。構建模式提供了兩種構建模式可供選擇和選項描述會將的值設為。如果是,那就會開啟。默認只會對按需加載的代碼做分割。在或更低版本中,如果你想為一個推導出來的定制選項,你不得不在自己的選項中將它重復一遍。
前言
現在距離2018年2月15號webpack4.0.0出來已經有一段時間了,現在已經出了 @vue/cli 3.0,但是樓主還沒試過,聽說很強大,想要試水的可以看文檔 @vue/cli,官方腳手架都用上webpack4了,你項目還停留在webpack3,甚至webpack2,是不是覺得落伍了。
受號稱0配置的parcel啟發,webpack4 增加了一些默認配置,摒棄掉了一些難懂的配置,對用戶更加友好,下面我來講一講比較大的一些變化
不再支持 Node.js 4。
默認出入口在 Webpack 4 中,不再強制要求指定 entry 和 output 路徑。webpack 4 會默認 entry 為 ./src,output 為 ./dist,當然了,這只是開胃菜。
mode 構建模式webpack 提供了兩種構建模式可供選擇 development 和 production
選項 | 描述 |
---|---|
development | 會將 process.env.NODE_ENV 的值設為 development。啟用 NamedChunksPlugin(固化 runtime 內以及在使用動態加載時分離出的 chunk 的 chunk id) 和 NamedModulesPlugin(開啟 HMR[熱重載]的時候使用該插件會顯示模塊的相對路徑)。 |
production | 會將 process.env.NODE_ENV 的值設為 production。啟用 FlagDependencyUsagePlugin, FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, OccurrenceOrderPlugin, SideEffectsFlagPlugin 和 UglifyJsPlugin. |
也就是說如果 mode 為development 時候官方腳手架可以砍掉的代碼
// webpack.development.config.js module.exports = { + mode: "development" - plugins: [ - new webpack.NamedModulesPlugin(), - new webpack.DefinePlugin({ - "process.env": require("../config/dev.env") - }), - ] }
如果 mode 為production 時候官方腳手架可以砍掉的代碼
// webpack.production.config.js module.exports = { + mode: "production", - plugins: [ - new UglifyJsPlugin(/* ... */), - new webpack.DefinePlugin({ - "process.env": require("../config/dev.env") - }), - new webpack.optimize.ModuleConcatenationPlugin() - ] }import(): 動態導入
在 webpack 4 中,import() 會返回一個帶命名空間(namespace)的對象,這對 ES Module 不會有影響,但對于遵循 commonjs 規范的模塊則會加一層包裹:
// webpack 2/3 import("./commonjs").then(exports => { // ... }) // webpack 4 import("./commonjs").then({default: exports}=> { // ... })optimization 配置項
配置項新增了 optimization 選項,智能的根據所選模式mode為做運行優化。
使用這個配置的時候之前的一些插件可以使用 optimization 里的配置代替
NoEmitOnErrorsPlugin 替換為 optimization.noEmitOnErrors (默認只在 production 模式)
ModuleConcatenationPlugin 替換為 optimization.concatenateModules(默認只在 production 模式)
NamedModulesPlugin 替換為 optimization.namedModules(默認只在 develoment 模式)
CommonsChunkPlugin 插件被棄用,使用 optimization.splitChunks, optimization.runtimeChunk 代替
// webpack.prod.conf.js const config = { // ... plugins: [ - new webpack.NoEmitOnErrorsPlugin(), - new webpack.optimize.ModuleConcatenationPlugin(), // 預編譯 - new webpack.optimize.CommonsChunkPlugin({ - name: "vendor", - minChunks (module) { - // any required modules inside node_modules are extracted to vendor - return ( - module.resource && - /.js$/.test(module.resource) && - module.resource.indexOf( - path.join(__dirname, "../node_modules") - ) === 0 - ) - } - }), - new webpack.optimize.CommonsChunkPlugin({ - name: "manifest", - minChunks: Infinity - }), ], + optimization: { + noEmitOnErrors: true, + concatenateModules: true, + splitChunks: { + chunks: "all", + name: "common", + }, + runtimeChunk: { + name: "runtime" + } + } };
// webpack.dev.conf.js const config = { // ... plugins: [ - new webpack.NamedModulesPlugin() ] + optimization: { + namedModules: true + } };
optimization.splitChunks 默認是不用設置的。如果 mode 是 production,那 Webpack 4 就會開啟 Code Splitting。默認 Webpack 4 只會對按需加載的代碼做分割。如果我們需要配置初始加載的代碼也加入到代碼分割中,可以設置 splitChunks.chunks 為 "all"壓縮
webpack4 的mode 設置成 production 時,默認開啟代碼壓縮,但是我要敲黑板,劃重點了,uglifyjs-webpack-plugin 終于到 v1.0.0 版本了,支持多進程壓縮,緩存以及es6語法,無需多帶帶安裝轉換器。感動不感動。想看的話可以看這里順風車。想要覆蓋配置可以這樣
const UglifyJsPlugin = require("uglifyjs-webpack-plugin") module.exports = { // ... optimization: { minimizer: [ new UglifyJsPlugin() // 具體配置可看github ] } }移除的功能
移除了 module.loaders
移除了 loaderContext.options
移除了 Compilation.notCacheable
移除了 NoErrorsPlugin
移除了 Dependency.isEqualResource
移除了 NewWatchingPlugin
移除了 CommonsChunkPlugin
既然講了 webpack 做了比較大的更新,周邊的配套設施也不要不舍得,改換久換,由于我平時項目中使用vue,如果你也使用vue的話,那么針對vue的有幾個變化你要知道:
vue-loader什么?學不動了,只要用官網的腳手架不就好了?前端的知識不斷更新,固步自封,只會不進則退。但是你要相信,webpack也好,vue-loader 也好,api 會越來越好懂,性能也會更加高效,所以,扶我起來,我還能學。。。
Vue Loader v15 使用了一個不一樣的策略來推導語言塊使用的 loader。vue-loader v15
在 v14 或更低版本中,如果你想為一個推導出來的 loader 定制選項,你不得不在 Vue Loader 自己的 loaders 選項中將它重復一遍。在 v15 中你再也沒有必要這么做了。
拿官方腳手架來說, 可以看到兩個函數,用來生成 vue-loader 的 options 還有 module.rule, 我把他們摘出來,就可以看出來了。
// util.js exports.cssLoaders = function (options) { // ... } // Generate loaders for standalone style files (outside of .vue) exports.styleLoaders = function (options) { // ... }
// vue-loader-conf.js module.exports = { loaders: utils.cssLoaders({ sourceMap: sourceMapEnabled, extract: isProduction }), ... }
// webpack.dev.config const devWebpackConfig = merge(baseWebpackConfig, { module: { rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) }, ... }
我剛入腳手架的坑的時候都蒙了,為什么要這樣寫,為了德瑪西亞么?當然不是,是因為填 vue-loader v14 的坑
vue-loader v15版本只要寫一遍就好了,但是要注意請確保在你的 webpack 配置中添加 Vue Loader 的插件
// webpack.config.js const VueLoaderPlugin = require("vue-loader/lib/plugin") module.exports = { module: { rules: [ { test: /.vue$/, loader: "vue-loader" }, // ... ] }, plugins: [ // 請確保引入這個插件! new VueLoaderPlugin() ] }
然后由于生產和測試環境對 css 文件處理不同。在webpack.dev.config.js和webpack.prod.config.js里分別配置 less/scss css 的loader就好了:
{ module: { rules: [ // ... { test: /.less$/, use: [ "vue-style-loader", "css-loader", "less-loader" ] } ] } }mini-css-extract-plugin css 抽取
webpack v4 官方不在推薦使用 extract-text-webpack-plugin 了,改換 mini-css-extract-plugin
// webpack4 npm install -D mini-css-extract-plugin // webpack.config.js var MiniCssExtractPlugin = require("mini-css-extract-plugin") module.exports = { // 其它選項... module: { rules: [ // ... 忽略其它規則 { test: /.css$/, use: [ process.env.NODE_ENV !== "production" ? "vue-style-loader" : MiniCssExtractPlugin.loader, "css-loader" ] } ] }, plugins: [ // ... 忽略 vue-loader 插件 new MiniCssExtractPlugin({ filename: style.css }) ] }
// webpack3 npm install -D extract-text-webpack-plugin // webpack.config.js var ExtractTextPlugin = require("extract-text-webpack-plugin") module.exports = { // 其它選項... module: { rules: [ // ...其它規則忽略 { test: /.css$/, loader: ExtractTextPlugin.extract({ use: "css-loader", fallback: "vue-style-loader" }) } ] }, plugins: [ // ...vue-loader 插件忽略 new ExtractTextPlugin("style.css") ] }福利
對webpack3官方腳手架還不是很了解的同學可以看我根據自己理解寫的注釋,詳情點這里
覺得麻煩,不想自己搞?那也沒關系,我自己按照腳手架改了一套,感興趣的可以試試點這里
覺得不錯請star哦,另外,我準備在下一篇文章中將如何如優化webpack,喜歡的話可關注
webpack 文檔
webpack github release
Webpack 4 配置最佳實踐
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96035.html
摘要:對的工作流程有點模糊,以及據官方文檔稱的升級,性能得到了極大的提升,而還是用的,于是決定從頭開始搭建一個適合團隊的腳手架。保證各文件獲得一致的文件編碼和縮進效果。這些在后面文章中,都會一個個涉及到,此處不做詳細展開。 前言 寫前端項目這么久了,以前用的 dva 框架,后來用過 create-react-app 框架,都需要針對團隊做一些定制化的修改。對 webpack 的工作流程有點模...
摘要:后來經過排查你會發現是由于目前還沒有版本。可以使用該方式解決。這就是我為什么不推薦你使用創建腳手架的原因此文的受眾是想要進階中級的初級前端人員。 最近在知乎看到一個問題,原問題如下: 很奇怪,為什么現在能找到自己手動創建vue腳手架的文章非常少,而且大家似乎對webpack4的熱情并不高,對于想基于vue2.0+webpack4搭建一個腳手架的我來說資料真是少得可憐。難道現在一般的做...
摘要:官方已經于近日升級到了的穩定版本,對應的一些必備插件也陸續完成了更新支持,筆者在第一時間完成了項目由到的遷移,在此記錄一下升級過程中遇到的種種問題和對應的解決手段,方便后續入坑者及時查閱,減少重復工作,如果覺得本篇文章對你有幫助,歡迎點贊 webpack4官方已經于近日升級到了V4.5的穩定版本,對應的一些必備插件(webpack-contrib)也陸續完成了更新支持,筆者在第一時間完...
摘要:我們發布了新版本的插件系統,以便事件掛鉤和處理程序是單態的。倒計時按照承諾,我們將從今天開始等待一個月,然后再釋放穩定版。這為我們的插件,加載程序和集成生態系統提供了測試,報告和升級到的時間我們需要您幫助我們升級并測試此測試版。 自8月初以來—當我們將 nex branch?合并到webpack/webpack#master—我們看到了巨大的貢獻! showImg(https://se...
摘要:以為例,編寫來幫助我們完成重復的工作編譯壓縮我只要執行一下就可以檢測到文件的變化,然后為你執行一系列的自動化操作,同樣的操作也發生在這些的預處理器上。的使用是針對第三方類庫使用各種模塊化寫法以及語法。 showImg(https://segmentfault.com/img/bVbtZYK); 一:前端工程化的發展 很久以前,互聯網行業有個職位叫做 軟件開發工程師 在那個時代,大家可能...
閱讀 2722·2021-11-22 13:54
閱讀 1063·2021-10-14 09:48
閱讀 2292·2021-09-08 09:35
閱讀 1550·2019-08-30 15:53
閱讀 1166·2019-08-30 13:14
閱讀 606·2019-08-30 13:09
閱讀 2521·2019-08-30 10:57
閱讀 3334·2019-08-29 13:18