コンテンツにスキップ

JavaScript/Asynchronous Module Definition

出典: フリー教科書『ウィキブックス(Wikibooks)』

Asynchronous Module Definition (AMD) は、JavaScript のモジュール化を実現する仕様の一つです。特に非同期でモジュールをロードすることに重点を置き、動的な依存関係の管理を可能にすることを目的としています。この記事では、AMD の背景、基本的な構文、実際の使用例、利点と欠点、そして関連するライブラリについて詳しく解説します。

背景

[編集]

JavaScript はもともとスクリプト言語として設計され、モジュール化の仕組みを持っていませんでした。しかし、アプリケーションが複雑になるにつれ、コードをモジュール化して管理しやすくする必要性が高まりました。

AMD は、特にブラウザ環境で非同期にスクリプトをロードすることを目的に設計されました。この仕様は、サーバーサイド環境とは異なり、スクリプトのダウンロードがネットワーク速度に依存するブラウザ特有の課題に対応しています。

基本構文

[編集]

AMD の構文は主にdefine 関数を使用してモジュールを定義し、require 関数を使ってモジュールを読み込む形をとります。

define 関数

[編集]

define 関数を使ってモジュールを定義します。

define('moduleName', ['dependency1', 'dependency2'], function(dependency1, dependency2) {
  // モジュールの内容
  const moduleValue = dependency1.doSomething() + dependency2.doSomethingElse();

  return {
    value: moduleValue
  };
});

引数の説明

[編集]
  1. モジュール名(省略可能): モジュールの名前。
  2. 依存関係(オプション): モジュールが依存する他のモジュールの配列。
  3. ファクトリ関数: モジュールの実装を含む関数。この関数の戻り値がモジュールのエクスポートになります。

require 関数

[編集]

require 関数を使ってモジュールをロードします。

require(['moduleName'], function(module) {
  console.log(module.value);
});

引数の説明

[編集]
  1. 依存関係: 必要なモジュールの配列。
  2. コールバック関数: ロードされたモジュールが利用可能になったときに実行される関数。

実際の使用例

[編集]

以下は、AMD を使用して複数のモジュールを管理する例です。

モジュールの定義

[編集]
math.js
define([], function() {
  return {
    add: function(a, b) {
      return a + b;
    }
  };
});
main.js
define(['math'], function(math) {
  return {
    calculate: function() {
      return math.add(2, 3);
    }
  };
});

モジュールの使用

[編集]
app.js
require(['main'], function(main) {
  console.log(main.calculate()); // 5
});

利点

[編集]
  1. 非同期ロード: 必要なモジュールだけを非同期でロードし、パフォーマンスを向上させます。
  2. 依存関係の明示: モジュール間の依存関係が明確になるため、コードの管理が容易です。
  3. ブラウザ環境に最適化: ネットワーク遅延を考慮した設計。

欠点

[編集]
  1. コードの冗長性: モジュール定義や依存関係の明示が必要なため、記述量が増えることがあります。
  2. Node.js との非互換性: CommonJS の仕様と異なるため、Node.js では直接使用できません。
  3. 標準化されていない: AMD は正式な ECMAScript の標準仕様ではありません。

AMD をサポートするライブラリ

[編集]

RequireJS

[編集]

RequireJS は、AMD の実装として最も広く使用されているライブラリです。

インストール

[編集]
npm install requirejs

使用方法

[編集]
HTML ファイル
<script data-main="app.js" src="require.js"></script>
app.js
require(['main'], function(main) {
  console.log(main.calculate());
});

AMD と他のモジュール規格の比較

[編集]
AMD と CommonJS
特徴 AMD CommonJS
ロード方式 非同期 同期
主な用途 ブラウザ環境 サーバーサイド環境
記述量 多い 少ない
AMD と ES Modules
特徴 AMD ES Modules
標準化 非標準 ECMAScript 標準
ロード方式 非同期 静的(ブラウザでは動的も可能)

まとめ

[編集]

AMD は、ブラウザ環境における非同期モジュールローディングの問題を解決するために設計された重要な技術です。RequireJS を使用することで簡単に利用できますが、近年では ES Modules の採用が進んでおり、AMD の利用頻度は減少しています。それでも、レガシーコードや特定のユースケースでは、依然として有用な選択肢となっています。