本系列文章經過重新編排和擴充,已出書為ECMAScript關鍵30天。原始文章因當時準備時程緊迫,多少有些許錯誤。為了避免造成讀者的困擾,以及配合書籍的內容規劃,將會陸續更新本系列文章。
本篇文章在 2021/11/2 已更新。
ES2015以前,JavaScript並沒有一致的模組化規範,也沒有內建支援的相關語法。因此在社群中,發展了幾個知名的模組化定義和函式庫。每個規範有自己獨特的語法、程式架構和使用環境。
模組名稱 | 運行環境 | 說明 |
---|---|---|
AMD | 瀏覽器 | RequireJS定義的規範 |
CommonJS(CJS) | Node.js | 使用關鍵字module.exports 把變數或函式轉為可匯出的模組 |
UMD | 瀏覽器 & Node.js | 透過各模組規範的支援度進行條件判斷,決定模組的實現方式 |
目前在各瀏覽器與Node.js的較新版本都有內建相關語法,所以往後的模組化開發,再也不需要使用額外的函示庫才能支援。
export
主要是由export
跟default
這兩個關鍵字組成。export
後面接匯出的對象,而default
是個選擇性的關鍵字,可以把對象設定為預設的匯出。
以下提供幾種匯出模組的方式,可以根據自己的開發習慣,或是模組的使用情境來選擇適合的寫法。
export const magicNumber = 1000;
export function printMsg(msg) {
console.log('ESM 範例程式: ', msg);
}
export class myClass {}
const magicNumber = 1000;
function printMsg(msg) {
console.log('ESM 範例程式:', msg);
}
class myClass {}
export { magicNumber, printMsg, myClass };
as
關鍵字為對象重新命名export { magicNumber as myNumber, printMsg as myPrint };
export default myClass;
export { magicNumber, printMsg };
import
由import 跟 from這兩個關鍵字組成。import後面接模組名稱,而from後面接檔案路徑的字串,通常會是相對路徑的寫法。
其中,模組名稱會因為使用情境不同而有多種寫法。
import { printMsg, magicNumber } from './myMudle';
console.log('magicNumber:', magicNumber);
printMsg('Hi!'); // ESM 範例程式: Hi!
as
關鍵字為對象重新命名import {
printMsg as myPrintMsg,
magicNumber as myMagicNumber,
} from './myMudle';
const magicNumber = 2000;
console.log('myMagicNumber / magicNumber:', myMagicNumber, '/', magicNumber);
// myMagicNumber / magicNumber: 2000 / 1000
myPrintMsg('Hi!'); // ESM 範例程式: Hi!
* as
關鍵字為模組設定命名空間import * as MyModule from './myMudle';
console.log('magicNumber:', MyModule.magicNumber);
MyModule.printMsg('Hi!'); // ESM 範例程式: Hi!
// ... 還需要用到 myMudle 裡的其他對象 ...
import myClass, { magicNumber } from './myMudle';
console.log('magicNumber:', magicNumber);
const myObject = myClass();