模塊化是將代碼分成更小的、可重用的部分(模塊),這樣作能夠使代碼更加清晰、可維護且易於測試。隨著應用程序的增長,模塊化可以幫助我們組織代碼,避免命名衝突,並提高代碼的可維護性。在JavaScript 中,ES6引入了原生的模塊系統,允許開發者通過import和export來管理模塊。這一特性對於大型應用開發尤其有用。
模塊 (Module):模塊是一個單獨的文件,裡面可以包含變量、函數、類等。每個模塊都有自己的作用域,模塊中的變量和函數默認是私有的,只有明確通過export出的內容才能被其他模塊使用。
使用export將模塊中的變量、函數、類導出,使其可以在其他模塊中使用。有兩種導出方式:具名導出 和 默認導出。
// math.js
export const PI = 3.14;
export function add(a, b) {
return a + b;
}
export function subtract(a, b) {
return a - b;
}
這裡我們導出了常量PI和兩個函數add和subtract。它們可以被其他模塊導入和使用。
// greet.js
export default function greet(name) {
return `Hello, ${name}!`;
}
在這裡,我們導出了一個默認函數 greet,這個模塊沒有其他具名導出。
模塊的導入 (import)
// main.js
import { PI, add, subtract } from './math.js';
console.log(PI); // 3.14
console.log(add(2, 3)); // 5
console.log(subtract(5, 2)); // 3
在這裡,我們從 math.js文件中導入了三個具名導出內容PI、add和subtract。
// main.js
import greet from './greet.js';
console.log(greet('Alice')); // Hello, Alice!
這裡我們從 greet.js 文件中導入了默認導出內容 greet 函數。
// math.js
export const PI = 3.14;
export default function multiply(a, b) {
return a * b;
}
// main.js
import multiply, { PI } from './math.js';
console.log(PI); // 3.14
console.log(multiply(2, 3)); // 6
在這裡,我們同時導入了 PI(具名導出)和 multiply(默認導出)。
模塊可以在導出或導入時對名稱進行重命名,這在名稱衝突或想要使用更具描述性的名稱時非常有用。
// math.js
const PI = 3.14;
function add(a, b) {
return a + b;
}
export { PI as CirclePI, add as sum };
這裡我們將 PI 重命名為 CirclePI,add 重命名為 sum。
// main.js
import { CirclePI, sum } from './math.js';
console.log(CirclePI); // 3.14
console.log(sum(2, 3)); // 5
在這裡,我們按重命名後的名稱導入了 CirclePI 和 sum。
你還可以將從其他模塊導入的內容再導出,這樣可以創建一個「聚合模塊」,將多個模塊中的內容合併在一起。
// additionalMath.js
export { PI, add } from './math.js';
export const multiply = (a, b) => a * b;
在這裡,我們從 math.js 模塊中導入 PI 和 add,並再次導出它們,還導出了一個新的 multiply 函數。
動態導入
除了靜態導入(在代碼頂部使用 import),ES2020 引入了動態導入 (import()),允許在需要的時候動態加載模塊。這對於按需加載(例如懶加載或路由)非常有用。
// main.js
import('./math.js').then(math => {
console.log(math.add(2, 3)); // 5
});
這裡我們在需要時動態加載 math.js,並在加載完成後執行其中的 add 函數。