JavaScript 的模組

JavaScript 的模組

本文說明了 JavaScript 中的模組。

YouTube Video

JavaScript 的模組

JavaScript 的模組是一種組織程式碼並將其分割為可重複使用的組件的方法。通過使用模組,可以提高程式碼的可讀性和維護性,並且相同的功能可以在其他專案中重複使用。在這裡我們將解釋各種模組系統,從模組的概念到具體的使用範例。

JavaScript 模組的概念

JavaScript 最初並沒有模組化系統。然而,隨著應用程式規模的增大,模組化變得越來越重要,可以將程式碼劃分為更小的單元以便重複使用。模組是一段具有特定功能的程式碼,可以獨立於其他程式碼進行管理,從而允許將其劃分為多個檔案。

模組的主要類型

JavaScript 中有幾種模組系統。最常見的是 ES 模組(ESM)和 CommonJS。

  • ES Modules 是在 ECMAScript 2015(ES6)引入的模組系統,使用 importexport 關鍵字來定義模組。此系統廣泛用於用戶端(瀏覽器)和伺服器端(Node.js)。

  • CommonJS 是一種主要用於 Node.js 的模組系統。模組使用 requiremodule.exports 來匯入和匯出檔案。

ES 模組(ESM)的詳細資料

ES 模組是 JavaScript 的標準模組系統,允許模組之間簡便地交換功能。在瀏覽器和 Node.js 中,此系統用於定義與匯入模組。

exportimport

export 是一個關鍵字,用於將模組中的功能向外部公開。import 用於匯入其他模組中定義的功能。

範例:模組匯出

可以如下方式在 ES Modules 中導出模組。

1// math.mjs
2export function add(a, b) {
3    return a + b;
4}
5export function subtract(a, b) {
6    return a - b;
7}

在這個 math.mjs 模組中,導出了 addsubtract 函式。這些函數可以從其他模組中匯入。

這裡,.mjs 是一個明確表示ES Modules 格式 JavaScript 檔案的副檔名。在 Node.js 中,檔案的副檔名會決定是 CommonJS 還是 ES Modules。但是,如果在 package.json 中指定了 type: "module",則副檔名為 .js 的檔案預設會被視為 ES Modules

範例:模組匯入

可以如下方式在 ES Modules 中導入模組。

1// main.mjs
2import { add, subtract } from './math.mjs';
3
4console.log(add(3, 5)); // 8
5console.log(subtract(10, 7)); // 3

通過使用 import,可以輕鬆地利用在其他檔案中定義的函數。

預設匯出和具名匯出

模組有兩種匯出方法。一種是 具名匯出,另一種是 預設匯出

  • 具名匯出 用於從模組中匯出多個函數或變數。可以多次匯出,匯入時可以通過指定名稱接收它們。
1// utils.mjs
2export function sum(a, b) {
3    return a + b;
4}
5export function multiply(a, b) {
6    return a * b;
7}
1// main.mjs
2import { sum, multiply } from './utils.mjs';
3
4console.log(sum(4, 6));       // 10
5console.log(multiply(3, 5));  // 15
  • 預設匯出 用於從模組中匯出單個函數或類別。匯入時可以用任何名稱接收。
1// greet.mjs
2export default function greet() {
3    return "Hello, World!";
4}
1// main.mjs
2import greet from './greet.mjs';
3
4console.log(greet()); // "Hello, World!"

每個模組只能有一個預設匯出,但具名匯出可以同時匯出多個元素。

用於客戶端(瀏覽器)時的範例。

範例:模組匯出

可以如下方式在 ES Modules 中導出模組。

1// utils.js
2export function sum(a, b) {
3    return a + b;
4}
5export function multiply(a, b) {
6    return a * b;
7}

在這個 utils.js 模組中,導出了 summultiply 函式。

範例:模組匯入

可以如下方式在客戶端導入模組。

 1<!DOCTYPE html>
 2<html lang="ja">
 3<head>
 4  <meta charset="UTF-8">
 5  <title>ES Modules Sample in HTML</title>
 6</head>
 7<body>
 8  <h1>ES Modules Sample</h1>
 9  <div id="result"></div>
10
11  <script type="module">
12    import { sum, multiply } from './utils.js';
13
14    const result = `
15      <p>sum(3, 5) = ${sum(3, 5)}</p>
16      <p>multiply(10, 7) = ${multiply(10, 7)}</p>
17    `;
18
19    document.getElementById('result').innerHTML = result;
20    console.log(sum(3, 5));      // 8
21    console.log(multiply(10, 7)); // 70
22  </script>
23</body>
24</html>
  • 通過將 <script> 標籤的 type 屬性設為 module可以在 HTML 中使用如 importexport 的 ES 模組語法
  • import 陳述式會加載外部的 utils.js 並顯示結果。

CommonJS 詳細說明

CommonJS 是一種主要用於 Node.js 的模組系統。模組通過 module.exportsrequire 進行匯出和匯入。

requiremodule.exports

在 CommonJS 中,使用 module.exports 匯出模組。此外,使用 require 來使用其他檔案的模組。

範例:模組匯出

可以如下方式在 CommonJS 中導出模組。

1// math.js
2module.exports = {
3    add: function(a, b) {
4        return a + b;
5    },
6    subtract: function(a, b) {
7        return a - b;
8    }
9};
範例:模組匯入

可以如下方式在 CommonJS 中導入模組。

1// main.js
2const math = require('./math.js');
3
4console.log(math.add(4, 7));      // 11
5console.log(math.subtract(9, 2)); // 7

在 Node.js 中,默認使用 CommonJS 作為模組系統,但也支援 ES 模組。

動態匯入

在 JavaScript 中,可以使用 import() 動態匯入模組。此方法採用非同步處理,在需要時載入模組。

可依下列方式執行動態導入。

1async function loadModule() {
2    const math = await import('./math.js');
3    console.log(math.add(5, 3)); // 8
4}
5
6loadModule();

動態匯入是提升應用程式性能的一種方式。因為可以按需載入模組,而不是在初次載入時載入所有模組,所以能提高頁面顯示速度。

模組的優勢

  • 程式碼重複利用性

    • 模組化的程式碼可以在其他專案中重複使用。通過創建具有通用功能的模組並在多個應用程式中使用,可以顯著提高開發效率。
  • 維護性提升

    • 將程式碼拆分成模組後,可以更容易地修改特定功能或部分。將代碼管理成小單元,使得發現和修復錯誤更加容易。
  • 避免命名空間衝突

    • 在全域範圍定義太多變數和函式會造成命名衝突,但模組化可以防止這種情況並保持程式碼庫的整潔。
  • 依賴管理

    • 使用模組可以讓你明確地管理應用程式的依賴關係。可以清楚地看到哪個模組依賴於其他模組,讓代碼結構更易於理解。

總結

JavaScript 的模組系統是一種強大的方式,用於組織代碼並將其分解為可重用的元件。通過理解 ES 模組和 CommonJS 之間的差異,並根據項目選擇適合的模組系統,可以提升代碼的可讀性和可維護性。此外,通過使用動態導入,可以優化應用程式的性能。

讓我們利用模組系統來構建更具擴展性和效率的 JavaScript 應用程式。

您可以在我們的 YouTube 頻道上使用 Visual Studio Code 來跟隨上述文章一起學習。 請也查看我們的 YouTube 頻道。

YouTube Video