1. 什麼是 JavaScript 模組?
JavaScript 模組(Module)是一種將程式碼拆分成多個獨立文件,並在不同文件間共享和管理程式碼的方式。透過模組化的設計,可以讓程式碼更具結構性、可讀性與可維護性。
在 ES6(ECMAScript 2015)之前,JavaScript 主要透過 IIFE(立即執行函式)、CommonJS 或 AMD 來模組化程式碼。而 ES6 之後,JavaScript 原生支援 ES Modules(ESM),提供 import
和 export
來管理模組。
2. 為什麼需要模組?
- 避免全域變數污染
- 提高可維護性
- 支援程式碼重用
- 支援延遲載入(Lazy Loading)
- 透過動態
import()
,按需載入模組,提高效能。
3. ES6 模組語法
在 ES6 中,我們主要使用 export
和 import
來定義和載入模組。
(1) export
的使用
命名匯出(Named Export)
export const pi = 3.14159; export function add(a, b) { return a + b; } export function subtract(a, b) { return a - b; }
|
預設匯出(Default Export)
export default function sayHello(name) { return `Hello, ${name}!`; }
|
(2) import
的使用
匯入命名匯出
import { pi, add, subtract } from "./math.js";
console.log(pi); console.log(add(5, 3)); console.log(subtract(10, 4));
|
匯入預設匯出
import sayHello from "./greeting.js";
console.log(sayHello("Alice"));
|
匯入所有模組內容
import * as math from "./math.js";
console.log(math.pi); console.log(math.add(2, 3));
|
使用 as
重新命名
import { add as sum, subtract as minus } from "./math.js";
console.log(sum(10, 5)); console.log(minus(10, 5));
|
4. ES 模組的特性
靜態解析(Static Analysis)
import
和 export
必須在頂層作用域,不能在條件語句或函式內部。
- 在編譯時(compile time)解析模組,而不是執行時(runtime)。
模組作用域
- 每個模組都有自己的作用域,變數不會污染全域作用域。
自動使用嚴格模式(Strict Mode)
- ES6 模組內部自動啟用
"use strict"
,無需手動指定。
5. 動態載入模組
有時候我們希望在特定條件下載入模組,而不是在程式開始時就載入所有模組。這時可以使用 import()
來動態載入。
if (true) { import("./math.js").then((math) => { console.log(math.add(5, 10)); }); }
|
import()
回傳一個 Promise,當模組載入完成後執行回調函式。
- 這種方式適合懶加載(Lazy Loading)與條件性載入。
6. var
、let
在模組中的行為
在模組內,變數 var
仍然會被提升(Hoisting),但 let
和 const
具有區塊作用域。
var globalVar = "I am global"; let localVar = "I am local";
|
import "./module.js";
console.log(globalVar); console.log(localVar);
|
7. 在瀏覽器與 Node.js 環境使用 ES 模組
(1) 瀏覽器
在 HTML 文件中,使用 <script type="module">
來載入 ES6 模組。
<script type="module"> import { add } from "./math.js"; console.log(add(10, 5)); </script>
|
(2) Node.js
Node.js 14+ 版本支援 ES 模組,但需要:
- 檔案副檔名改為
.mjs
- 在
package.json
設定 "type": "module"
export function multiply(a, b) { return a * b; }
|
import { multiply } from "./math.mjs"; console.log(multiply(4, 5));
|
8. 模組引入方式整理
環境 |
引入方式 |
瀏覽器(ESM) |
<script type="module"> |
Node.js(ESM) |
import { foo } from './module.mjs' |
Node.js(CommonJS) |
const foo = require('./module.js') |
動態載入(Lazy Load) |
import('./module.js').then(...) |
重新命名 |
import { foo as newFoo } from './module.js' |
匯入所有內容 |
import * as mod from './module.js' |
9. 結論
- ES 模組是 JavaScript 原生模組系統,使用
import
和 export
來管理程式碼。
- 模組有助於提升可讀性與可維護性,避免全域變數污染。
- 動態載入(import())可以優化效能,適合延遲載入模組。
- 瀏覽器與 Node.js 都支援 ES6 模組,但 Node.js 需要
.mjs
或 package.json
設定 "type": "module"
。
- 模組可以透過不同方式引入,根據環境選擇適合的方法。
掌握 JavaScript 模組的概念,能夠讓你更有效地開發與維護大型專案。
Comments