date: 2018-03-19 16:01:31javascript
標籤(空格分隔): webpackcss
P.S. 如下全部代碼演示代碼都是基於 webpack 4.0.0-beta.0html
若是你使用yarn yarn add webpack@next webpack-cli --dev
若是你使用npm npm install webpack@next webpack-cli --save-dev
前端
下面是一些你確定會感興趣的新特性。在閱讀完本章以後,若是你以爲不過癮,完整的修改列表請查看官方修改日誌 github.com/webpack/web…java
本章將從如下幾部分來介紹 webpack 4.0。node
webpack 運行環境升級。已經不支持 Node.js 4 版本。源碼升級到更高的 ECMAScript 版本。react
根據 webpack package.json 配置中顯示 Node.js 最低支持版本:"node": ">=6.11.5"webpack
長久以來,JS是webapck中惟一的模塊類型。正所以,開發者沒法有效地打包其它類型的文件。目前,webpack實現了五種模塊類型,它們各有本身的優點,可按須要使用(後面會詳細說明)。git
javascript/auto
: (webpack3中默認)支持全部的JS模塊系統:CommonJS、AMD、ESM。javascript/esm
: EcmaScript模塊,全部其餘模塊系統不可用(.mjs文件中默認)。javascript/dynamic
: 不支持CommonJS和EcmaScript模塊。json
: JSON數據,能夠經過require和import導入(.json文件默認)。webassembly/experimental
: WebAssembly模式(目前處於實驗性階段,.wasm文件默認)。用法: module.rules 中的 type 就是新增長的屬性,用來支持不一樣的模塊類型。github
module: {
rules: [{
test: /\.special\.json$/,
type: "javascript/auto",
use: "special-loader"
}]
}
複製代碼
此外,如今webpack 按照 .wasm, .mjs, .js, 以及 .json 等擴展名的順序來解析。
javascript/esm
相比於 javascript/auto
處理ESM更加嚴格咱們說既然有了 javascript/auto
爲何還要細分那麼多其餘類型呢?這是由於每種類型都有本身獨特的處理優點。具體表如今兩個方面:
none
,能夠禁用一切功能)。
webpack-cli
中,你須要經過安裝 webpack-cli
使用 CLI。optimization.*
標誌來配置本身的自定義模式。webpackInclude
和 webpackExclude
能夠經過神奇的註釋來支持 import()
,他們容許在使用動態表達式時過濾文件。System.import()
會發出警告:
Rule.parser.system: true
關閉警告。Rule.parser.system: false
關閉 System.import()
。ProgressPlugin
如今顯示插件名稱。type: "javascript/auto"
。固然,不用 loader webpack 依然能夠正常工做。NoEmitOnErrorsPlugin
-> optimization.noEmitOnErrors
(生產模式默認)ModuleConcatenationPlugin
-> optimization.concatenateModules
(生產模式默認)NamedModulesPlugin
-> optimization.namedModules
(開發模式默認)CommonsChunkPlugin
-> optimization.splitChunks
**對於那些須要細粒度控制緩存策略的人,能夠經過 optimization.splitChunks和optimization.runtimeChunk。optimization.minimize
用於控制minimizing的開關。
optimization.minimizer
用於配置minimizers和選項。options.dependencies
配置如今會拋出異常。sideEffects
能夠經過 module.rules
覆蓋。output.globalObject
配置選項以容許在運行時選擇全局對象引用。sideEffects: false
。當設置這個字段以後,標識在使用的庫裏沒有任何反作用。這意味着webpack能夠從代碼中安全地清除任何re-exports。optimization.splitChunks
選項。如下是一些內部優化:
buildMeta.exportsType: "default"
Parser (parserStringArray, parserCalculatedStringArray)
中未使用的方法Compiler.hooks.xxx.tap(<plugin name>, fn)
Chunk.chunks/parents/blocks
再也不是數組。在內部使用一個集合,而且有方法來訪問它。Parser.scope.renames
和 Parser.scope.definitions
再也不是對象/數組,而是Map/Set。StackedSetMap
(相似於LevelDB的數據結構)而不是數組。Compiler.options
。options
合併到 ContextModule
和 resolveDependencies
的 options
對象中.import()
的依賴關係Compiler.resolvers
移入可經過插件訪問的 Compiler.resolverFactory
中。Dependency.isEqualResource
已被替換爲 Dependency.getResourceIdentifier
Template
方法都是靜態的。RuntimeTemplate
類,outputOptions
和 requestShortener
已經被移動到這個類中。
RuntimeTemplate
的使用。loaderContext.rootContext
。loaders
可使用它來建立相對於應用程序根目錄的東西。this.hot
標誌添加到 loader 上下文中。buildMeta.harmony
已被替換爲 buildMeta.exportsType:namespace
。★★ 注意:以上內容都是關於 loaders、plugins 重大的變化。
直到今日,webpack 老是要求顯式地設置 entry
和 output
屬性。webpack4 中,webpack 會自動設定你的 entry
屬性爲 ./src
以及 output
的屬性爲 ./dist
。 這意味着您再也不須要配置文件來啓動 webpack。接下來咱們爲你演示 webpack 4 的便捷操做:
一、咱們須要安裝好 webpack 以後,在 package.json 中添加以下腳本便可啓動:
"scripts": {
"build": "webpack"
},
複製代碼
二、在工程中添加簡單示例代碼以下圖(整個工程沒有 webpack 配置文件,便可運行打包):
三、打包過程當中咱們發現有新特性的提示:
WARNING in configuration
The 'mode' option has not been set. Set 'mode' option to 'development' or 'production' to enable defaults for this environment.
複製代碼
這就是咱們下節要說的內容模式設置。
★★ 注意:入口默認爲 ./src
若是缺乏此文件夾會報錯!
> webpack --mode production
ERROR in Entry module not found: Error: Can't resolve './src' in 'D:\workspace\github\Webpack-Example' 複製代碼
以往的項目使用 webpack3 腳手架生成項目初始模板都會有兩個甚至三個配置文件,好比 webpack.base.conf.js
、webpack.prod.conf.js
、webpack.dev.conf.js
而如今能夠作到一個配置文件都不須要,直接在啓動命令中傳入參數 --mode development | production
達到區分不一樣模式的效果。
接下來修改 package.json 設置不一樣的模式:
"scripts": {
"dev": "webpack --mode development",
"build": "webpack --mode production"
},
複製代碼
從新執行 npm run dev
或 npm run build
便可看到不一樣的打包結果:
接下來這個配置是最經常使用到的,咱們使用 webpack 的主要目的之一就是爲了更好的支撐前段模塊化的能力,既然須要模塊化固然少不了代碼分割,目前代碼分割有如下幾種:
entry
分割不一樣入口,經常使用於多頁應用;CommonsChunkPlugin
插件來分割不一樣功能模塊;import
來分割。 下面咱們主要講解 webpack 4 版本的重大變化刪除了 CommonsChunkPlugin
插件。webpack 4 刪除了
CommonsChunkPlugin
,以支持兩個新的選項(optimization.splitChunks
和optimization.runtimeChunk
)。
從 4.0 開始分割 Chunk
將不在使用 CommonsChunkPlugin
插件,而是使用 optimization
配置項,具體的實現原理能夠參考:gist.github.com/sokra/1522d…
因爲尚未正式官方文檔出來,如下是咱們經過實踐出的 optimization
配置方法: 其中用到了新增的 splitChunks
屬性,此屬性看字面意思就明白是分割代碼塊的選項,其下可配置項已在下面示例代碼中列出(有興趣的朋友能夠自行實踐):
entry: {
vendor: ['lodash']
},
...
optimization: {
splitChunks: {
chunks: "initial", // 必須三選一: "initial" | "all"(默認就是all) | "async"
minSize: 0, // 最小尺寸,默認0
minChunks: 1, // 最小 chunk ,默認1
maxAsyncRequests: 1, // 最大異步請求數, 默認1
maxInitialRequests : 1, // 最大初始化請求書,默認1
name: ()=>{}, // 名稱,此選項課接收 function
cacheGroups:{ // 這裏開始設置緩存的 chunks
priority: "0", // 緩存組優先級
vendor: { // key 爲entry中定義的 入口名稱
chunks: "initial", // 必須三選一: "initial" | "all" | "async"(默認就是異步)
test: /react|lodash/, // 正則規則驗證,若是符合就提取 chunk
name: "vendor", // 要緩存的 分隔出來的 chunk 名稱
minSize: 0,
minChunks: 1,
enforce: true,
maxAsyncRequests: 1, // 最大異步請求數, 默認1
maxInitialRequests : 1, // 最大初始化請求書,默認1
reuseExistingChunk: true // 可設置是否重用該chunk(查看源碼沒有發現默認值)
}
}
}
},
複製代碼
以上就是 optimization.splitChunks
的全部可用的配置項屬性。
以上就是咱們初步整理的關於 webpack 4 的新特性,包含了一部分的官方更新日誌的翻譯,還有咱們本身試驗的一些屬性。固然若是你有興趣,也能夠等到正式的官方文檔發佈以後進行實踐。
若是上面的信息不可以徹底知足你的興趣,還請關注官方日誌。在將來不到一個月的時間裏,webpack 將對插件、加載器以及整個生態系統進行更加嚴格的測試,併發布最終的官方穩定版本。若是你喜歡 webpack,你能夠參與使用 webpack4.0.0.beta,若是提出的問題越多,即可覺得你們提供更加穩定的版本。
webpack 4 beta — try it today! . Sean T. Larkin