AMD、CMD、CommonJS仕様をどう理解すればいいですか?javascriptモジュール化ロード学習まとめ

6320 ワード

これはjavascriptモジュール化AMD、CMD、CommunJSの学習総括についてです.記録としても同じように3つの方法に疑問を持っている子供たちに、間違っているところや間違っているところがあります.
このデフォルトの読者は大体require、seajsの使い方(AMD、CMDの使い方)を知っていますので、文法を使っていません.
 
 
1、なぜ生まれましたか
 この3つの仕様はいずれもjavascriptモジュール化のために作られたもので、いずれもいくつかのモジュールを使用するかまたは使用する予定の時にこのモジュールをロードして、大量のシステムの巨大な複雑なコードがよく組織と管理されます.モジュール化によって、コードを使って管理している間は混乱しないし、多くの人の協力も便利になりました.
 
2、それらの規範たち:
      (1)、Common JS JavaScript生態圏を構築するという志を持っている組織です.全体のコミュニティはJavaScriptプログラムの移植性と交換性を高めることに力を尽くしています.
     a group with a goal of building up the JavaScript ecosystem for web servers,desktop and command line aps and in the browser.
ターゲットがあるJavaScript生態系Webサーバグループを構築し、ブラウザとコマンドラインのアプリケーションとデスクトップを構築します.
           この組織はいくつかの規範を制定しました. http://www.commonjs.org/)CommonJS Modules/1.0仕様を含め、私達が普段言っているcommonjs仕様はこれです.
          「The Common JS API will fill that gap by defining API that handle many common aplication needs、ultimartely providing a standary as rich as sis of Python、Ruby and Java. ”--(出自 http://www.commonjs.org/)
したがって、Commmonjsはよりサーバー側の仕様に偏っています.Node.jsはこの仕様を採用しています.Common JS規格によると、個々のファイルはモジュールです.モジュールをロードするには、requireメソッドを使用して、ファイルを読み込み、実行し、最後にファイル内部のexporteオブジェクトに戻ります.
        彼はまた、次のような場面で使えます. ,だから彼は明らかにサーバー側に偏っています.もちろんブラウザに使ってもいいです.
  • Server-side JavaScript apple
  • Command line tools
  • Desktop GUI-basedアプリ
  • Hyrid aplications(Titanium、Adobe AIR)
  •   
    (2)、AMD仕様
    Communjsはモジュール化の問題を解決し、ブラウザで使用できますが、Communjsは同期ローディングモジュールです.このモジュールを使うには、現在ローディングしています.このような同期機構はブラウザの中に問題があります.ローディングスピードとか(ビューア同期アップモジュールは性能、ユーザビリティ、デバッグ、クロスドメインアクセスなどの問題があります.).
    ブラウザの特殊な状況を考慮して、この仕様は非同期ローディング依存モジュールを実現できます.それはAMD仕様です.AMDはCommunJSモジュールの中継バージョンとして使用できます.CommunJSが同期に使用されていない限り、requireを使用して呼び出されたCommon JSコードは回調風に変換できます.格のAMDモジュール搭載器(https://github.com/amdjs/amdjs-api/wiki/AMD-(%E 4%B 8%AD% E 6%96%E 7%89%88) (その話は)
        
    簡単なCommonJS変換を使用したモジュール定義です.
         define(function (require, exports, module) {   var a = require('a'),   b = require('b');   exports.action = function () {};   });
    AMDとCommunjsは互換性があります.呼出方法を少し変えたら同期ローディングができます.
    AMD仕様を見てみますと、AMDは基本的にモジュールに依存していることを説明してから、これらのモジュールをプリロードします.実際には、これらの依存性を事前によく考えてください.
     
    (3)、CMD
    この問題に対してかどうかは分かりませんが、タオバオの玉伯大牛はseajsを作ってきました.この規範はCMD規格に準拠していると公言しています.そして、この規範の接続を与えました.(開けばdraftという文字があります.)この規格についてはご存知ですか?
    AMDはRequireJSのモジュール定義のプロモーションプロセスにおける標準化出力である.
    CMDはSeaJSがモジュール定義の標準化出力をプロモーション中に行うものです.
    同様に、Common JS Modules/2.0規格もあります.BravoJSは普及過程でモジュール定義の規範化生産です.
    まだたくさんあります.⋯

       この仕様は実際にSeajsの普及のために作られたものです.SeaJSはどういうものですか?基本的にはこの仕様を知っています.
    Seajsもプリロード依存jsとAMDの仕様はプリローディングと同じで、明らかに異なるところは呼び出しと宣言の依存性です.AMDとCMDはdifineとrequireを使用していますが、CMDは使用中に依存する傾向があります.コードを書かないでください.突然他のモジュールに依存する必要があります.それは現在のコードではreを使用します.quireを導入すればいいです.規範はあなたのためにプリロードを解決してくれます.自由に書いてもいいです.しかし、AMD標準は事前に頭のパラメータに依存する部分を書いておかなければなりません.(書いていませんか?逆で書いてください.)これは一番明らかな違いです.
     
    3、共生共存
    Common JSはサーバー側の仕様なので、他の2つの基準は実際には衝突しません.
    AMDは海外でより多く使われています.もちろん国内でも多く使われています.jQuery 1,7バージョンから使用され始めました.Dojoは1.6バージョンで使用し始めました.これはもう十分な牛xであることを証明できます.
    CMDはもちろん多くの人が使っていますが、基本的には国内に集中しています.Seajsの公式サイトでは、牛を大量に使っている会社が展示されています.http://seajs.org/docs/小さいものは有名ではないかもしれませんが、多くの企業がseajsを募集していますから.
          ですから、三つの仕様は全部いいです.
    ファイルを書くときは、様々なロード仕様に対応する必要がありますが、どうすればいいですか?下のコードを見てください.
      
    (function (root, factory) {
    
        if (typeof define === 'function' && define.amd) {
    
            // AMD
    
            define(['jquery', 'underscore'], factory);
    
        } else if (typeof exports === 'object') {
    
            // Node, CommonJS   
    
            module.exports = factory(require('jquery'), require('underscore'));
    
        } else {
    
            //        (root   window)
    
            root.returnExports = factory(root.jQuery, root._);
    
        }
    
    }(this, function ($, _) {
    
        //   
    
        function a(){}; //     ,        (   )
    
        function b(){}; //     ,      
    
        function c(){}; //     ,      
    
         
    
        //       
    
        return {
    
            b: b,
    
            c: c
    
        }
    
    }));    
    
    このコードは様々なロード仕様に対応できます.
      
    4、AMDとCMDの違い
         次のこれらの点はおじさんが知上で言ったのです.
     
    1.依存モジュールに対して、AMDは
    事前に実行し、CMDは
    遅延実行です.しかし、RequireJSは2.0から遅延実行可能になりました.CMDはas lazy as possibleを推奨します.
    2.CMDは信頼性が近く、AMDは前置依存を推奨する.
     
    3.AMDのAPIのデフォルトは
    一つは複数の場合、CMDのAPIは厳密に区別され、推奨されている.
    タスクは単一です.たとえば、AMDでは、requireは大域requireと局部requireに分けられています.CMDでは、大域requireではなく、モジュールシステムの完全性によって、seajs.useを提供してモジュールシステムのロード開始を実現します.CMDでは、APIごとにすべてのAPIが開始されます.
    シンプルで純粋です
     
    4.まだ細かい差異がありますが、この仕様の定義を具体的に見ればいいです.
         (はい、4時は多く言わないです......)
     
    5、AMDとCMDのいくつかは同じです.
    difineとrequireがあり、実際には依存パラメータを追加することができます.つまり、依存パラメータを提供する方法でプリロード依存モジュールを実現することができます. 注意:バンド  id 和  deps パラメータ  define 使い方はCMD規格ではなく、 Modules/Transport 規範.---由来:https://github.com/seajs/seajs/issues/242を選択します
         AMDはfactoryでrequireを使用しても良いですが、このモジュールは事前にロードされません.
        var a. = require('a') //モジュールaをロード
     
    不適切なところがあったら、斧を歓迎します.
     
    参考資料:
    http://wiki.commonjs.org/wiki/CommonJS
    http://www.commonjs.org/
    http://seajs.org/docs/
    https://github.com/amdjs/amdjs-api/wiki/AMD
    https://github.com/seajs/seajs/issues/269
    https://github.com/seajs/seajs/issues/242
    https://www.zhihu.com/question/20351507
    http://blog.jobbole.com/49290/
    http://www.cnblogs.com/qianshui/articles/4930892.html
    http://blog.chinaunix.net/uid-26672038-id-4112229.html