1. ホーム
  2. javascript

[解決済み] CommonJSとAMDとRequireJSの関係?

2022-03-23 09:39:34

質問

について、まだ非常に迷っています。 CommonJS、AMD RequireJS を、たくさん読んでも。

知っているのは コモンJS (以前は サーバーJS ) を定義するためのグループです。 JavaScript の仕様(モジュールなど)を、ブラウザの外側で使用することを想定しています。 コモンJS モジュール仕様には、以下のような実装があります。 ノードジス または リンゴJS ということですね。

<ブロッククオート

とはどのような関係なのでしょうか? コモンJS , 非同期モジュール定義 (AMD)と RequireJS ?

RequireJS の実装です。 共通JS モジュール定義?もしそうなら AMD ということですか?

解決方法は?

RequireJS が実装されています。 AMD API (ソース) .

コモンJS は、モジュールの定義方法として exports オブジェクトを作成し、モジュールの内容を定義します。簡単に言うと、CommonJSの実装は次のようになります。

// someModule.js
exports.doSomething = function() { return "foo"; };

//otherModule.js
var someModule = require('someModule'); // in the vein of node    
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };

基本的にCommonJSの仕様では、このように require() 関数で依存関係を取得し exports 変数でモジュールの内容をエクスポートし、モジュール識別子 (このモジュールに対する当該モジュールの位置を表すもの) を使って依存関係を要求します ( ソース ). CommonJSには、以下のような様々な実装があります。 ノードジス というお話がありました。

CommonJSは特にブラウザを意識して設計されたわけではないので、ブラウザ環境にはあまりフィットしません(※これについては本当にソースがありません。 RequireJSのサイトです。 ) どうやら、これは非同期読み込みなどと関係があるようです。

一方、RequireJSでは、ブラウザの環境に合わせたAMDを実装しています( ソース ). どうやら、AMDはCommonJS Transportフォーマットのスピンオフとして始まり、独自のモジュール定義APIに発展したようだ。それゆえ、この2つの間には類似性がある。AMDの新機能は define() 関数を使用すると、モジュールがロードされる前にその依存関係を宣言することができます。例えば、次のような定義が考えられる。

define('module/id/string', ['module', 'dependency', 'array'], 
function(module, factory function) {
  return ModuleContents;  
});

つまり、CommonJSとAMDは ジャバスクリプト モジュール定義APIは、実装は異なるが、どちらも同じ起源を持つ。

  • AMD は、モジュールの依存関係の非同期読み込みをサポートしているため、よりブラウザに適しています。
  • RequireJS の実装です。 AMD の精神を保ちつつ、同時に コモンJS (主にモジュール識別子において)。

さらに混乱させるのは、RequireJSはAMDの実装でありながら、CommonJSラッパーを提供しているので、CommonJSモジュールをほぼ直接インポートしてRequireJSで使用することができることです。

define(function(require, exports, module) {
  var someModule = require('someModule'); // in the vein of node    
  exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
});