本質上,webpack 是一個現代 JavaScript 應用程序的靜態模塊打包工具。css
原生瀏覽器,不能很好的識別 ES6 以及更高版本中ES moudule
模塊引入方式。代碼中使用ES moudule
,能夠經過webpack進行打包編譯成瀏覽器識別的語法。html
// 全局安裝
npm install webpack -g
// 全局下打包
webpack index.js
複製代碼
// 本地項目安裝
npm install webpack --save-dev
// 本地項目打包
npx webapck index.js //直接執行 npx webpack 會調用默認配置文件 webpck.config.js
複製代碼
// scripts標籤使用
"scripts": {
"build": "webpack"
},
// 本地項目打包
npm run build
複製代碼
webpack處理js文件之外的文件時,就須要藉助loader了node
webpack 可使用 loader 來預處理文件。這容許你打包除 JavaScript 以外的任何靜態資源。webpack
將文件發送到輸出文件夾,並返回(相對)URL。 可打包:圖片、text等各類文件es6
像 file loader 同樣工做,但若是文件小於限制,能夠返回 data URL 若是小於limit
值,直接以base64形式打包到js中,大於和file-loader同樣,生成文件。配合使用,優化。web
將模塊的導出做爲樣式添加到 DOM 中npm
解析 CSS 文件後,使用 import 加載,而且返回 CSS 代碼
瀏覽器
// importLoaders 用於配置「css-loader 做用於 @import 的資源以前」有多少個 loader。
模塊化打包css文件
use: [
'style-loader',
{
loader: 'css-loader',
options: {
importLoaders: 2, // 0 => no loaders (default); 1 => postcss-loader; 2 => postcss-loader, sass-loader
},
},
'postcss-loader',
'sass-loader',
],
複製代碼
// modules 選項啓用/禁用css模塊規範和設置基本行爲。
options: {
modules: true,
},
複製代碼
使用 PostCSS 加載和轉譯 CSS/SSS 文件sass
webpack 有着豐富的插件接口(rich plugin interface)。webpack 自身的多數功能都使用這個插件接口。這個插件接口使 webpack 變得極其靈活。bash
clean-webpack-plugin
A webpack plugin to remove/clean your build folder(s).
HtmlWebpackPlugin
簡單建立 HTML 文件,用於服務器訪問
SplitChunksPlugin
此配置對象表示splitchunksplugin的默認行爲。
// webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
chunks: 'async', // 包括:all、async、initial(同步)
minSize: 30000,
maxSize: 0,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: '~',
automaticNameMaxLength: 30,
name: true,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
}
}
};
複製代碼
MiniCssExtractPlugin
這個插件將css提取到單獨的文件中。它爲每一個包含css的js文件建立一個css文件。它支持按需加載css和sourcemap。
它創建在新的webpack v4特性(模塊類型)之上,須要webpack 4才能工做。
與extract-text-webpack-plugin
相比:
TODO:
此選項控制是否生成,以及如何生成 source map。
// 最佳實踐:
development: cheap-module-eval-source-map
production: cheap-module-eval-source-map
複製代碼
webpack-dev-server 爲你提供了一個簡單的 web server,而且具備 live reloading(實時從新加載) 功能。
注意
:new HtmlWebpackPlugin( { // Also generate a test.html filename: 'index.html', // 使用webapck-dev-server打包至內存,須要index.html template: './index.html' } ),
模塊熱替換(hot module replacement 或 HMR)是 webpack 提供的最有用的功能之一。它容許在運行時更新全部類型的模塊,而無需徹底刷新。
babel-loader @babel/core
處理:@babel/preset-env
tree shaking 是一個術語,一般用於描述移除 JavaScript 上下文中的未引用代碼(dead-code)。它依賴於 ES2015 模塊語法的 靜態結構 特性,例如 import 和 export。這個術語和概念其實是由 ES2015 模塊打包工具 rollup 普及起來的。
代碼分離是 webpack 中最引人注目的特性之一。此特性可以把代碼分離到不一樣的 bundle 中,而後能夠按需加載或並行加載這些文件。代碼分離能夠用於獲取更小的 bundle,以及控制資源加載優先級,若是使用合理,會極大影響加載時間。
經常使用的代碼分離方法有三種
entry
配置手動地分離代碼。SplitChunksPlugin
去重和分離 chunk
。Code splitting這個概念一直都有,並不是webpack首創,只是如今webpack將此功能集成了。 注意: webapck在作代碼分割時,打包同步和異步引入的代碼是有區別的。
webpack
纔會將相似lodash
的庫文件和業務代碼作分割打包,不然會打包到一個文件中。// 同步引入
import _ from 'lodash'
_.join(['a', 'b'], '$$')
// webpack.config.js
optimization: {
splitChunks: {
chunks: "all"
}
},
複製代碼
webpack
也會默認將庫文件和業務代碼分開打包。// 異步引入
function getComponent() {
return import('lodash').then(({default: _}) => {
var element = document.createElement('div')
element.innerHTML = _.join(['a', 'b'], '$$$')
return element
})
}
getComponent().then(element => {
document.body.appendChild(element)
})
複製代碼
Prefetching/Preloading
webpack v4.6.0+ 添加了預取和預加載的支持。
在聲明 import 時,使用下面這些內置指令,可讓 webpack 輸出 "resource hint(資源提示)",來告知瀏覽器:
與 prefetch 指令相比,preload 指令有許多不一樣之處:
懶加載或者按需加載,是一種很好的優化網頁或應用的方式。這種方式其實是先把你的代碼在一些邏輯斷點處分離開,而後在一些代碼塊中完成某些操做後,當即引用或即將引用另一些新的代碼塊。這樣加快了應用的初始加載速度,減輕了它的整體體積,由於某些代碼塊可能永遠不會被加載。
Caching
?既然contenthash變了,爲何瀏覽器訪問,仍是不是最新的?Output Filenames
複製代碼
咱們能夠經過替換output.filename
中的 substitutions
設置,來定義輸出文件的名稱。webpack 提供了一種使用稱爲 substitution(可替換模板字符串)
的方式,經過帶括號字符串來模板化文件名。其中,[contenthash] substitution
將根據資源內容建立出惟一 hash
。當資源內容發生變化時,[contenthash]
也會發生變化。
Shimming
webpack
compiler 可以識別遵循 ES2015
模塊語法、CommonJS
或 AMD
規範編寫的模塊。然而,一些 third party(第三方庫)
可能會引用一些全局依賴(例如 jQuery
中的 $
)。所以這些 library
也可能會建立一些須要導出的全局變量。這些 "broken modules(不符合規範的模塊)
" 就是 shim(預置依賴)
發揮做用的地方。
Environment Variables
想要消除 開發環境 和 生產環境 之間的 webpack.config.js
差別,你可能須要環境變量(environment variable)
。
webpack
命令行 環境配置 的 --env
參數,能夠容許你傳入任意數量的環境變量。而在 webpack.config.js
中能夠訪問到這些環境變量。例如--env.production
或 --env.NODE_ENV=local
(NODE_ENV
一般約定用於定義環境類型,查看這裏)。
webpack --env.NODE_ENV=local --env.production --progress
複製代碼