JavaScript 的模組匯出與匯入:如何在多檔案間使用函數與變數

更新日期: 2024 年 11 月 7 日

在現代 JavaScript 開發中,模組化是一種常用的程式碼管理方式,能將功能分解為多個檔案,並利用 importexport 將它們互相匯入、匯出來組成應用程式。

ES6(ECMAScript 2015)引入了模組系統,使得我們可以使用 importexport 來管理代碼間的依賴關係。

本文將探討模組化的使用方式,以及如何透過 named exportdefault export 來匯出與匯入模組的內容。

JavaScript 的模組化演進

在 ES6 引入模組語法前,JavaScript 並不支援原生的 importexport 語法。

在多檔案專案中,我們只能依賴 HTML 檔案中的 <script> 標籤,按順序引用各個 JavaScript 檔案,並根據其排列順序執行。例如:

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <!-- jquery -->
    <!-- 跑馬燈效果 -->
    <script src="a.js"></script>
    <script src="main.js"></script>
</head>

在這種情況下,瀏覽器會按照 HTML 中的引入順序執行 a.jsmain.js,因此 main.js 可以直接使用 a.js 中的變數或函數。

但這種方式會導致以下問題:

  • 順序依賴性強,一旦順序錯誤就會引發錯誤。
  • 全域空間污染,若不同檔案的變數或函數名稱相同,可能會覆蓋,導致難以維護。

ES6 模組化:使用 importexport 進行模組匯出與匯入

ES6 引入了模組化語法,提供了兩種主要的匯出方式:named exportdefault export

這讓我們能夠將功能區分為各個模組,並按需匯入,從而避免命名衝突並減少依賴順序問題。

Named Export 和 Named Import

named export 是指將模組內的函數、變數或物件以名稱匯出,使其他模組能夠精確地指定,並匯入這些名稱。

範例:Named Export

假設我們有一個 a.js 檔案,包含一個函數 abc 和變數 a,我們可以使用 named export 將它們匯出:

// a.js
function abc() {
  return 123;
}

const a = 1;

export { abc, a };

對應的 Named Import

main.js 中,我們可以透過 named importa.js 中的內容匯入,並必須使用大括號 {} 來引入:

// main.js
import { abc, a } from "./a.js";

console.log(abc()); // 123
console.log(a);     // 1

Default Export 和 Default Import

default export 用於匯出模組中的主要功能,一個模組檔案中只能有一個 default export

這種匯出方式在匯入時無需使用大括號 {},並且可以自由命名。

範例:Default Export

a.js 中匯出一個默認函數:

// a.js
export default function abc() {
  return 123;
}

對應的 Default Import

main.js 中,使用 default import 匯入函數 abc,且可以任意命名:

// main.js
import customFunction from "./a.js";

console.log(customFunction()); // 123

Named Export 和 Default Export 的比較

匯出方式匯入方式特性
Named ExportNamed Import支援多次匯出,名稱需精確匹配
Default ExportDefault Import每個模組僅支援一次,名稱可自定

解決命名衝突:as 關鍵字的應用

在匯入 named export 時,若遇到與本地變數同名的情況,可以使用 as 關鍵字來重命名匯入的變數或函數,避免衝突。

案例:使用 as 關鍵字解決命名衝突

假設在 main.js 中,我們既要使用本地變數 a,又要使用 a.js 中的變數 a,這時就可以使用 as 關鍵字進行重命名:

// a.js
export const a = 1;

// main.js
import { a as importedA } from "./a.js";

const a = 2;

console.log(a);         // 2,來自 main.js 的本地變數
console.log(importedA); // 1,來自 a.js 的匯入變數

這樣我們既保留了本地變數 a,又可以使用從 a.js 匯入的 importedA

使用模組化語法時的注意事項

當我們在 HTML 中引入 JavaScript 檔案並使用模組語法時,必須使用 type="module" 屬性告知瀏覽器這是一個模組檔案,否則會導致錯誤。

以下是正確的寫法:

<script src="main.js" type="module"></script>

這樣,瀏覽器就能正確解析 importexport 語法。

總結

ES6 引入的 importexport 提供了更靈活的模組化方法,使得多檔案間的共享變得簡單、高效且安全。

透過 named exportdefault export,我們可以按需匯出模組中的功能,並使用 as 關鍵字來解決命名衝突。

重點回顧

  1. 模組化:ES6 以前,JavaScript 的執行依賴 HTML 的引入順序,容易導致全域空間污染和依賴錯誤。
  2. Named Export 和 Default Export:前者支持多次匯出,必須精確匹配名稱;後者僅支援一次匯出,可自定名稱。
  3. 解決命名衝突as 關鍵字允許我們在匯入時重新命名,避免變數名衝突。
  4. 設置模組屬性:在 HTML 中引入 JavaScript 檔案時,必須加上 type="module"

藉由模組化的管理方式,我們可以將代碼劃分為易於維護的部分,提高專案的可讀性和可維護性。

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *