前端開發-模組打包工具WebPack

概念

本質上,

webpack

是一個用於現代 JavaScript 應用程式的_靜態模組打包工具_。當 webpack 處理應用程式時,它會在內部構建一個 依賴圖(dependency graph),此依賴圖對應對映到專案所需的每個模組,並生成一個或多個

bundle

入口(entry)

入口起點(entry point)

指示 webpack 應該使用哪個模組,來作為構建其內部 依賴圖(dependency graph) 的開始。進入入口起點後,webpack 會找出有哪些模組和庫是入口起點(直接和間接)依賴的。

預設值是 。/src/index。js,但你可以透過在 webpack configuration 中配置 entry 屬性,來指定一個(或多個)不同的入口起點。例如:

webpack.config.js

module。exports = { entry: ‘。/path/to/my/entry/file。js’,};

輸出(output)

output

屬性告訴 webpack 在哪裡輸出它所建立的

bundle

,以及如何命名這些檔案。主要輸出檔案的預設值是 。/dist/main。js,其他生成檔案預設放置在 。/dist 資料夾中。

你可以透過在配置中指定一個 output 欄位,來配置這些處理過程:

webpack.config.js

const path = require(‘path’);module。exports = { entry: ‘。/path/to/my/entry/file。js’, output: { path: path。resolve(__dirname, ‘dist’), filename: ‘my-first-webpack。bundle。js’, },};

在上面的示例中,我們透過 output。filename 和 output。path 屬性,來告訴 webpack bundle 的名稱,以及我們想要 bundle 生成(emit)到哪裡。可能你想要了解在程式碼最上面匯入的 path 模組是什麼,它是一個 Node。js 核心模組,用於操作檔案路徑。

loader

webpack 只能理解 JavaScript 和 JSON 檔案,這是 webpack 開箱可用的自帶能力。

loader

讓 webpack 能夠去處理其他型別的檔案,並將它們轉換為有效 模組,以供應用程式使用,以及被新增到依賴圖中。

在更高層面,在 webpack 的配置中,

loader

有兩個屬性:

test 屬性,識別出哪些檔案會被轉換。

use 屬性,定義出在進行轉換時,應該使用哪個 loader。

webpack.config.js

const path = require(‘path’);module。exports = { output: { filename: ‘my-first-webpack。bundle。js’, }, module: { rules: [{ test: /\。txt$/, use: ‘raw-loader’ }], },};

以上配置中,對一個單獨的 module 物件定義了 rules 屬性,裡面包含兩個必須屬性:test 和 use。這告訴 webpack 編譯器(compiler) 如下資訊:

外掛(plugin)

loader 用於轉換某些型別的模組,而外掛則可以用於執行範圍更廣的任務。包括:打包最佳化,資源管理,注入環境變數。

webpack.config.js

const HtmlWebpackPlugin = require(‘html-webpack-plugin’); // 透過 npm 安裝const webpack = require(‘webpack’); // 用於訪問內建外掛module。exports = { module: { rules: [{ test: /\。txt$/, use: ‘raw-loader’ }], }, plugins: [new HtmlWebpackPlugin({ template: ‘。/src/index。html’ })],};

在上面的示例中,html-webpack-plugin 為應用程式生成一個 HTML 檔案,並自動注入所有生成的 bundle。

在 webpack 配置中使用外掛是簡單直接的。然而,也有很多值得我們進一步探討的用例。檢視這裡瞭解更多。

模式(mode)

透過選擇 development, production 或 none 之中的一個,來設定 mode 引數,你可以啟用 webpack 內建在相應環境下的最佳化。其預設值為 production。

module。exports = { mode: ‘production’,};

瀏覽器相容性(browser compatibility)

webpack 支援所有符合 ES5 標準 的瀏覽器(不支援 IE8 及以下版本)。webpack 的 import() 和 require。ensure() 需要 Promise。如果你想要支援舊版本瀏覽器,在使用這些表示式之前,還需要 提前載入 polyfill。

環境(environment)

webpack 5 運行於 Node。js v10。13。0+ 的版本

起步

webpack 用於編譯 JavaScript 模組。一旦完成 安裝,你就可以透過 webpack CLI 或 API 與其配合互動。如果你還不熟悉 webpack,請閱讀 核心概念 和 對比,瞭解為什麼要使用 webpack,而不是社群中的其他工具。

基本安裝

首先我們建立一個目錄,初始化 npm,然後 在本地安裝 webpack,接著安裝

webpack-cli

(此工具用於在命令列中執行 webpack):

mkdir webpack-democd webpack-demonpm init -ynpm install webpack webpack-cli ——save-dev

在整個指南中,我們將使用 diff 塊,來展示對目錄、檔案和程式碼所做的修改。例如:

+ this is a new line you shall copy into your code- and this is a line to be removed from your code and this is a line not to touch。

現在,我們將建立以下目錄結構、檔案和內容:

project

webpack-demo |- package。json+ |- index。html+ |- /src+ |- index。js

src/index.js

function component() { const element = document。createElement(‘div’); // lodash(目前透過一個 script 引入)對於執行這一行是必需的 element。innerHTML = _。join([‘Hello’, ‘webpack’], ‘ ’); return element;}document。body。appendChild(component());

index.html

<!DOCTYPE html> 起步

我們還需要調整 package。json 檔案,以便確保我們安裝包是 private(私有的),並且移除 main 入口。這可以防止意外發布你的程式碼。

package.json

{ “name”: “webpack-demo”, “version”: “1。0。0”, “description”: “”,- “main”: “index。js”,+ “private”: true, “scripts”: { “test”: “echo \”Error: no test specified\“ && exit 1” }, “keywords”: [], “author”: “”, “license”: “ISC”, “devDependencies”: { “webpack”: “^5。4。0”, “webpack-cli”: “^4。2。0” } }

在此示例中, - +

在這個設定中,index。js 顯式要求引入的 lodash 必須存在,然後將它繫結為 _(沒有全域性作用域汙染)。透過宣告模組所需的依賴,webpack 能夠利用這些資訊去構建依賴圖,然後使用圖生成一個最佳化過的 bundle,並且會以正確順序執行。

可以這樣說,執行 npx webpack,會將我們的指令碼 src/index。js 作為 入口起點,也會生成 dist/main。js 作為 輸出。Node 8。2/npm 5。2。0 以上版本提供的 npx 命令,可以執行在初次安裝的 webpack package 中的 webpack 二進位制檔案(即 。/node_modules/。bin/webpack):

$ npx webpack[webpack-cli] Compilation finishedasset main。js 69。3 KiB [emitted] [minimized] (name: main) 1 related assetruntime modules 1000 bytes 5 modulescacheable modules 530 KiB 。/src/index。js 257 bytes [built] [code generated] 。/node_modules/lodash/lodash。js 530 KiB [built] [code generated]webpack 5。4。0 compiled successfully in 1851 ms

模組

ES2015 中的

import

export

語句已經被標準化。雖然大多數瀏覽器還無法支援它們,但是 webpack 卻能夠提供開箱即用般的支援。

事實上,webpack 在幕後會將程式碼 “

轉譯

”,以便舊版本瀏覽器可以執行。如果你檢查 dist/main。js,你可以看到 webpack 具體如何實現,這是獨創精巧的設計!除了 import 和 export,webpack 還能夠很好地支援多種其他模組語法,更多資訊請檢視 模組 API。

注意,webpack 不會更改程式碼中除 import 和 export 語句以外的部分。如果你在使用其它 ES2015 特性,請確保你在 webpack loader 系統 中使用了一個像是 Babel 或 Bublé 的 transpiler(轉譯器)。

使用一個配置檔案

在 webpack v4 中,可以無須任何配置,然而大多數專案會需要很複雜的設定,這就是為什麼 webpack 仍然要支援 配置檔案。這比在 terminal(終端) 中手動輸入大量命令要高效的多,所以讓我們建立一個配置檔案:

project

webpack-demo |- package。json+ |- webpack。config。js |- /dist |- index。html |- /src |- index。js

webpack.config.js

const path = require(‘path’);module。exports = { entry: ‘。/src/index。js’, output: { filename: ‘main。js’, path: path。resolve(__dirname, ‘dist’), },};

現在,讓我們透過新的配置檔案再次執行構建:

$ npx webpack ——config webpack。config。js[webpack-cli] Compilation finishedasset main。js 69。3 KiB [compared for emit] [minimized] (name: main) 1 related assetruntime modules 1000 bytes 5 modulescacheable modules 530 KiB 。/src/index。js 257 bytes [built] [code generated] 。/node_modules/lodash/lodash。js 530 KiB [built] [code generated]webpack 5。4。0 compiled successfully in 1934 ms

比起 CLI 這種簡單直接的使用方式,配置檔案具有更多的靈活性。我們可以透過配置方式指定 loader 規則(loader rule)、plugin(外掛)、resolve 選項,以及許多其他增強功能。更多詳細資訊請檢視 配置文件。

npm scripts

考慮到用 CLI 這種方式來執行本地的 webpack 副本並不是特別方便,我們可以設定一個快捷方式。調整

package。json

檔案,新增一個 npm script:

package.json

{ “name”: “webpack-demo”, “version”: “1。0。0”, “description”: “”, “private”: true, “scripts”: {- “test”: “echo \”Error: no test specified\“ && exit 1”+ “test”: “echo \”Error: no test specified\“ && exit 1”,+ “build”: “webpack” }, “keywords”: [], “author”: “”, “license”: “ISC”, “devDependencies”: { “webpack”: “^5。4。0”, “webpack-cli”: “^4。2。0” }, “dependencies”: { “lodash”: “^4。17。20” } }

現在,可以使用 npm run build 命令,來替代我們之前使用的 npx 命令。注意,使用 npm scripts,我們可以像使用 npx 那樣透過模組名引用本地安裝的 npm packages。這是大多數基於 npm 的專案遵循的標準,因為它允許所有貢獻者使用同一組通用指令碼。

現在執行以下命令,然後看看你的指令碼別名是否正常執行:

$ npm run build。。。[webpack-cli] Compilation finishedasset main。js 69。3 KiB [compared for emit] [minimized] (name: main) 1 related assetruntime modules 1000 bytes 5 modulescacheable modules 530 KiB 。/src/index。js 257 bytes [built] [code generated] 。/node_modules/lodash/lodash。js 530 KiB [built] [code generated]webpack 5。4。0 compiled successfully in 1940 ms

project

webpack-demo|- package。json|- webpack。config。js|- /dist |- main。js |- index。html|- /src |- index。js|- /node_modules

覺得效果不錯的請幫忙加個關注點個贊,每天分享前端實用開發技巧