2016-11-10 12 views
3

私はちょうどこのarticleをJavascriptモジュールで読み終えました。 CommonJSモジュールは、AMDモジュールが非同期にロードされている間に同期的にロードされることを理解できます。javascript - 同期モジュールと非同期モジュールの仕様は何ですか?

私は理解していないと、どのように私はCommonJS形式でそれを書くか、私はAMD形式でそれを書くならば、それは非同期(async)魔法どうなるかならば魔法のように同期なるモジュールできるということです。私は、javascriptにはdefineまたはrequireキーワードがないことを意味します。彼らはライブラリではない仕様です。

つまり、モジュールの読み込みの動作は、モジュールのローダーに依存し、モジュールの構造には依存しません。そして、それがなぜ異なったタイプのモジュールのコーディングパターンに従うのであれば?

NodeJS世界のすべてのライブラリが、書かれている書式に関係なく、同期ロードされていると仮定しています。また、ブラウザ空間のすべてのモジュールが非同期に読み込まれます。

私の上記の仮定が正しい場合、なぜUMDの仕様が存在するのでしょうか?私は、それが存在する環境に基づいてスクリプトが読み込まれた場合、ユニバーサルモジュール読み込みの仕様をなぜ作るのですか?

誰かがこの混乱を助けることができますか?

+0

"モジュール"がどのように読み込まれてもコードに変更はありません - モジュール内のコードについてのあなたの不安はあなたの障害です –

+0

@JaromandaXはい、なぜモジュールの仕様があるのですか?あなたは何を意味するのか詳しく教えていただけますか? –

+0

モジュール自体は非同期か非同期かにはなりません。 CJS形式では、ブラウザでうまく動作しない同期ローダーが想定されているため、非同期の本体実行(コールバック)による依存宣言を可能にするためにAMD形式が作成されています。 AMDは同期ローダーでも動作します。 – Bergi

答えて

4

これは良い質問です。これは、Nodeコミュニティで多くの熱心な議論を引き起こした主題です。それはすべてあなたが読むべきサイトの内容をよく理解していると:IBM

  • ES6 Module Interoperabilityからジェームズ・M・スネルによって

    、:デイブ・ハーマン、イェフダカッツとCaridyパティーニョ

  • Pull Request #3 of node-eps(ES6モジュールの相互運用002)上のディスカッション質問 - なぜ同期モジュールと非同期モジュールの仕様がありますか?リクエストの処理を開始する前に必要なものをロードするNode.jsのサーバー側モジュールのように、モジュールの同期ロードを好むケースがあります。また、ユーザーが非同期にモジュールをロードする方が望ましい場合もあります依存関係をロードしている間にレンダリングスレッドをブロックしたくない。

    ブラウザーに同期読み込みのオプションはありません。ブラウザーが応答しなくなるためです。

    サーバーで非同期読み込みを使用するかもしれないが、モジュールの代わりに約束をrequire()で返すか、コールバックを取る必要があると主張できます。いずれにせよ、多くのモジュールを使用する複雑なコードは、はるかに複雑になります。

    もう1つの問題は、すでに読み込まれたモジュールのキャッシングと突然変異です。 requireを使用して同期モジュールをロードする場合は、 モジュールを1回だけロードし、コードベース全体(同じプロセス)の同じモジュールのrequireを呼び出すと、そのたびに同じオブジェクトであるキャッシュ応答が返されます。コードのどの部分もそのオブジェクトを変更することができ、コードの他の部分でも使用できます。その機能を使用するいくつかの用途は、実装する方がずっと複雑です。さらに、コードのロードと実行の順序は予測するのが難しいでしょう。

    あなたの質問に対する答えを要約すると、モジュールを読み込む両方の方法の引数があり、いずれの方法もどちらのシナリオでも勝者ではありません。両方とも必要であり、どちらも行動を標準化するための仕様を持っています。

    詳細な理解のためにリンクした記事を読んでください。

  • +0

    ありがとう、しかし簡単なことを教えてください。私はブラウザにjsを書き、非同期モジュールとなる非同期ローダ経由でロードします。しかし、NodeJSの同じファイルを同期モジュールに使用します。だから私の主張はなぜ重要でないときに2つの環境の仕様に従わなければならないのですか?また、AFAIK、 '

    1

    つまり、モジュールの読み込みの振る舞いは、モジュールのローダーに依存し、モジュールの構造は異なります。そして、それがなぜ異なったタイプのモジュールのコーディングパターンに従うのであれば?

    モジュールは、同期または非同期でロードされたモジュールローダに依存しますが、あなたのモジュールは、モジュールローダを使用することができなければなりませんされているかどうか、これローダーと通信するためのインタフェースを含める必要があります。 amd define機能を使用してnode.js内のモジュールを読み込むことはできません。 requireを使用する必要があります。

    私の上記の仮定が正しい場合、なぜUMDの仕様もありますか?私は、それが存在する環境に基づいてスクリプトが読み込まれた場合、ユニバーサルモジュール読み込みの仕様をなぜ作るのですか?

    スクリプトは環境に基づいて読み込まれません。ローダーインターフェイスを介して読み込まれます。 UMDは、ブラウザとサーバーの両方で使用するライブラリ用です。ライブラリ作成者は、ライブラリの2つのバージョン(ブラウザ用とノード用)を作成する必要はありません。UMDは両方を処理する方法を知っているからです。

    関連する問題