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