Как AMD ведет себя иначе, чем CommonJS

#javascript #module #amd #commonjs

#javascript #модуль #amd #commonjs

Вопрос:

Из того, что я могу сказать, различия между CommonJS и AMD заключаются просто в том, что CommonJS требует создания статического пакета, чтобы все зависимости могли быть разрешены до выполнения, тогда как AMD позволяет нам загружать / разрешать dep асинхронным способом. Почти все, что я прочитал, объясняет основное различие таким образом, однако я читаю «Написание модульного JavaScript» Адди Османи, и у меня есть несколько вопросов к некоторым примерам AMD:

Понимание определения AMD():

 // A module_id (myModule) is used here for demonstration purposes only

define('myModule', 
   ['foo', 'bar'], 
   // module definition function
   // dependencies (foo and bar) are mapped to function parameters
   function ( foo, bar ) {
       // return a value that defines the module export
       // (i.e the functionality we want to expose for consumption)

       // create your module here
       var myModule = {
           doStuff:function(){
               console.log('Yay! Stuff');
           }
       }

       return myModule;
});

// An alternative example could be..
define('myModule', 
   ['math', 'graph'], 
   function ( math, graph ) {

       // Note that this is a slightly different pattern
       // With AMD, it's possible to define modules in a few
       // different ways due as it's relatively flexible with
       // certain aspects of the syntax
       return {
           plot: function(x, y){
               return graph.drawPie(math.randomGrid(x,y));
           }
       }
   };
});
 

Теперь, когда я читаю это, я думаю про себя: хорошо, это отличается от CommonJS, потому что мы передаем функцию обратного вызова функции define, чтобы наша функция обратного вызова вызывалась, когда наши зависимости были загружены / разрешены. Это позволяет нашему обратному вызову вызываться асинхронно ТОЛЬКО тогда, когда все, что нам нужно, доступно .. хорошо, круто..Затем я прочитал следующий пример:

Понимание AMD требует ():

 // Consider 'foo' and 'bar' are two external modules
// In this example, the 'exports' from the two modules loaded are passed as
// function arguments to the callback (foo and bar)
// so that they can similarly be accessed

require(['foo', 'bar'], function ( foo, bar ) {
        // rest of your code here
        foo.doSomething();
});
 

Динамически загружаемые зависимости

 define(function ( require ) {
    var isReady = false, foobar;

    // note the inline require within our module definition
    require(['foo', 'bar'], function (foo, bar) {
        isReady = true;
        foobar = foo()   bar();
    });

    // we can still return a module
    return {
        isReady: isReady,
        foobar: foobar
    };
});
 

Теперь, прочитав эти два примера, я в замешательстве. Кажется, говорится, что require() это используется для динамически загружаемых зависимостей, однако не по этой ли причине мы в первую очередь используем AMD / define? Для поддержки асинхронных / динамически загружаемых dep?? Если require() позволяет нам динамически загружать dep, то что хорошего define() , или я должен сказать, тогда чем AMD define() отличается от простой старой реализации CJS?