前端模組化與打包工具指南 定義 IIFE 與現代打包工具之建置流程優化

me
林彥成
2022-10-05 | 3 min.
文章目錄
  1. 1. 什麼是前端模組化與打包工具?
  2. 2. 前端模組化載入:從 AMD 到 ES Module
    1. 2.1. IIFE (Immediately Invoked Function Expression)
    2. 2.2. Module Pattern
  3. 3. 前端打包工具:Webpack、Rollup 與 Parcel 對比
    1. 3.1. Webpack:功能全面的模組打包首選
    2. 3.2. Rollup:專為函式庫開發設計的封裝工具
    3. 3.3. Parcel:零配置的快速打包解決方案
  4. 4. FAQ:前端打包工具常見問題
    1. 4.1. Q1:我該選擇 Webpack 還是 Rollup?
    2. 4.2. Q2:什麼是 Tree-shaking?它真的有用嗎?
    3. 4.3. Q3:Vite 也是打包工具嗎?它與 Webpack 有什麼關係?

什麼是前端模組化與打包工具?

前端模組化 是指將龐大的 JavaScript 程式碼拆分為多個獨立、可重用且具備特定職責的「模組」的開發模式。其演進從早期利用 IIFE(立即執行函式)隔離作用域,發展到 CommonJSES Module (ESM) 等標準規範。而 打包工具 (Bundlers)(如 Webpack, Rollup, Parcel)則是負責將這些零散的模組、樣式與圖片資源,根據相依性進行整合、轉譯與壓縮,最終產出瀏覽器能高效執行的 Bundle 檔案。透過 Tree-shaking 移除無用程式碼與 Code Splitting 拆分載入,打包工具是現代前端建置流程中優化網頁效能的核心。


前端模組化 可以理解是在情場小白在跟女孩相處的過程中卻意外擁有把妹高手前同事提供的「教戰守則」,同事總會在一些時間、情境時告訴你一些小撇步讓男女之間感情升溫。

打包工具 則是在這些「鍛鍊」的過程中,讓「教戰守則」能夠自然且最佳化的融入到自身,進而能夠靈活的運用。這份指南將帶您深入了解現代網頁開發中的 前端建置流程

前端模組化載入:從 AMD 到 ES Module

封裝元件最簡單的方式是透過 IIFEModule Pattern 來產生元件模組。這也是 前端模組化 的基礎。

在網路上一篇關於模組化載入 的文章中介紹:

  • AMD (Asynchronous Module Definition): 非同步模組定義,適用於 RequireJS 這類工具供瀏覽器使用。
  • CMD (Common Module Definition): 通用模組定義。
    • CommonJS: 非瀏覽器的環境中 Node 和 Browserify/Webpack。
  • Universal Module Definition (UMD): jQuery 可以看得出來就是運用 UMD 來封裝。
  • ES Module: ES6 支援的模組語法,原生寫法就可以達到相同效果。

IIFE (Immediately Invoked Function Expression)

IIFE 是一個定義完馬上就執行的 JavaScript function,適合像是透過非同步 CDN 載入的模組使用。

1
2
3
4
5
6
var returnValueOfIIFE = (function () {
var value = "Hello";
return value;
})();
// output:
returnValueOfIIFE; // "Hello"

Module Pattern

搭配閉包 (Closure) 和作用域的特性而產生出來的設計模式,將方法和變數限制在一個範圍內存取與使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const moduleCounter = (function () {
let count = 0;
return {
getValue: function () { return count; },
increment: function () { return ++count; },
reset: function () {
console.log("reset:" + count);
count = 0;
},
};
})();

moduleCounter.getValue();
moduleCounter.increment();

前端打包工具:Webpack、Rollup 與 Parcel 對比

當載入和打包模組時就需要 打包工具,常見解決方案為 WebpackRollupParcel 三種。這些工具能有效進行 網頁效能優化

前端的專案通常在部署之前都需要先建置 (Build),主要協助的工作像是:

  • Tree-shaking:只加入有用到的部分。
  • Dead Code elimination:移除不會使用的程式碼。
  • Code Splitting:程式碼拆分以優化載入。
  • Minify:程式碼最小化。

Webpack:功能全面的模組打包首選

Webpack 是目前開源主流的 打包工具,提供 Hot Reload 與各式 Loader 支援。

1
2
3
4
5
6
7
8
9
// webpack.config.js 範例
const path = require("path");
module.exports = {
entry: "./src/index.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js",
},
};

Rollup:專為函式庫開發設計的封裝工具

Rollup 主要是用來封裝函式庫,支援多種輸出格式:

  • amd: 用於 RequireJS。
  • cjs: CommonJS,用於 Node。
  • es: 原生 ES 模組。
  • iife: 自執行模塊。
  • umd: 通用定義。

Parcel:零配置的快速打包解決方案

Parcel 以「零配置」(Zero Configuration) 聞名,適合快速開發:

  1. npm install --save-dev parcel
  2. npx parcel src/index.html

FAQ:前端打包工具常見問題

Q1:我該選擇 Webpack 還是 Rollup?

A:如果您是在開發一個「終端應用程式 (App)」,需要處理大量的靜態資源(CSS, 圖片, 字體)與多樣化的依賴,Webpack 是最強大的選擇;如果您是在開發一個「JavaScript 函式庫 (Library)」,Rollup 生成的程式碼更簡潔且對 Tree-shaking 支援更佳。

Q2:什麼是 Tree-shaking?它真的有用嗎?

A:Tree-shaking 是打包工具透過靜態分析(Static Analysis)識別並移除專案中「未被引用」程式碼的過程。它非常有用,能顯著減少最終 Bundle 的體積,特別是當您引用了大型函式庫(如 lodash)卻只使用其中一兩個方法時。

Q3:Vite 也是打包工具嗎?它與 Webpack 有什麼關係?

A:Vite 嚴格來說是一個開發工具鏈。在開發模式下,它利用瀏覽器原生的 ES Module 達成「即時啟動」;在生產環境則使用 Rollup 進行打包。Vite 的出現是為了改善 Webpack 在大型專案中開發啟動速度過慢的痛點。


掌握了 前端打包工具 的原理,您就能更靈活地架構您的開發流程。持續探索這些工具的進階配置,將為您的網頁效能帶來質的飛躍!


喜歡這篇文章,請幫忙拍拍手喔 🤣