2013-11-20 2 views
5

Я использую шаблон модуля в своем приложении Javascript, и я хочу перейти на RequireJS и AMD.Переход от простого шаблона модуля к требованию AMD

Моя текущая реализация выглядит так:

// Module main : Module.js 
var myModule = (function(my, $, undefined) { 
    'use strict'; 

    var m_privateMembers; 
    var m_stuff = new my.Pear({color:"green"}); 

    //--------------------------------------- 

    function privateFunctions(args) { 
    } 

    //----------------------------------- 

    my.publicFunctions = function(args) { 
    }; 

    return my; 
})(myModule || {}, jQuery); 



// Module class Fruit : Module.Fruit.js 
var myModule = (function(my, $, undefined) { 
    'use strict'; 

    my.Fruit = Object.makeSubclass(); 

    my.Fruit.prototype._init = function() { 

    }; 

    my.Fruit.prototype.someClassFunction = function() { 
    }; 

    return my; 
})(myModule || {}, jQuery); 


// Module class Pear : Module.Pear.js 
var myModule = (function(my, $, undefined) { 
    'use strict'; 

    my.Pear = Fruit.makeSubclass(); 

    my.Pear.prototype._init = function(args) { 
     this.m_someClassMember = args; 
    }; 

    my.Pear.prototype.someClassFunction = function() { 
    }; 

    return my; 
})(myModule || {}, jQuery); 

В моей index.html я использую HTML-теги сценария включить мои различные модули файлов и все работает нормально.

Мой вопрос являются:

1/Почему система RequireJS лучше, чем это многократным системы тегов сценария?

С моей нынешней RequireJS подход:

define(['jquery'], function($) { 

    var myModule = (function(my, $, undefined) { 
     'use strict'; 

     var m_privateMembers; 
     var m_stuff = new my.Pear({color:"green"}); 

     //--------------------------------------- 

     function privateFunctions(args) { 
     } 

     //----------------------------------- 

     my.publicFunctions = function(args) { 
     }; 

     return my; 
    })(myModule || {}, $); 

    return myModule; 
}); 

2/Как я мог мигрировать в RequireJS модулей и сохранить одноплодной подобный шаблон, что мои фактические модули обеспечивают встроенные классы суб?

очевидно, есть несколько проблем:

2,1/* m_stuff не может создать экземпляр my.Pear, и я не знаю, как разделить модули в нескольких файлах с требуют *

2,2/? Если у меня есть два других модуля, которые оба зависят от myModule, будет ли myModule var одним и тем же экземпляром в этом модуле (поскольку myModule больше не находится в глобальной области)?

редактировать: это быстро схемы иллюстрируют то, что мне нужно сделать, в гораздо более сложной структурой:

schema

ответ

2

Почему система RequireJS лучше, чем это многократным системы тегов сценария?

Я не буду вникать в это, но только глядя на существующую настройку модуля, вы можете увидеть, что AMD отрицает необходимость явного упорядочения сценариев и назначения объектов пространствам имен. Инструмент сборки RequireJS также позаботится о подготовке ваших сценариев к производству.

Вы можете прочитать больше

Как я мог мигрировать в RequireJS модули и держать одноплодной-как шаблон, что мои фактические модули обеспечивают встроенные классы суб?

Давайте посмотрим на это, принимая фрукты и груши в качестве примеров

При использовании require или define вы уже создает замыкание, которое будет инкапсулировать всю логику, так что нет никакой необходимости, чтобы создать еще один внутри. Будь проще.

// Fruit.js 
define(['jquery'], function($) { 
    'use strict'; 

    var Fruit = Object.makeSubclass(); 

    Fruit.prototype._init = function() { 

    }; 

    Fruit.prototype.someClassFunction = function() { 

    }; 

    return Fruit; 
}); 

// Pear.js 
define(['jquery', 'path/to/Fruit'], function($, Fruit) { 
    'use strict'; 

    var Pear = Fruit.makeSubclass(); 

    Pear.prototype._init = function(args) { 
     this.m_someClassMember = args; 
    }; 

    Pear.prototype.someClassFunction = function() { 

    }; 

    return Pear; 
}); 

Я не знаю, как разделить модули в нескольких файлах с требуется?

По существу просто разбивайте свои «классы» или модули на отдельные модули AMD и явно определяйте зависимости там, где это необходимо. Вы можете видеть из приведенного выше примера, как Pear будет использовать модуль Fruit.

Если у меня есть два модуля, что оба зависит от MyModule, будет MyModule вар будет тем же экземпляр в этом модуле (с MyModule не в глобальном масштабе больше)?

После того, как требуется один модуль и он будет загружен, любые другие ссылки на него из других модулей получат тот же самый экземпляр. По этой причине часто лучше всего позволить вашему модулю возвращать конструктор и разрешать другим модулям создавать его там, где это необходимо.

+0

Теперь я понял, что последнее, что я еще не понимаю, - это правильно использовать тот же возвращенный var в моих модулях, чтобы обернуть их в общее пространство имен, но он работает нормально. – Typedef

+0

Нет необходимости использовать пространство имен с AMD. Идея состоит в том, чтобы сохранить все, что содержится в модулях, которые не относятся к глобальной области. –

+0

Если я работаю над каркасом с несколькими крупными приложениями, я склонен делиться коллекциями или библиотеками модулей. Я не могу иметь сотни модулей на одной и той же плоской логической иерархии (или должен ли я?). Коллекция модулей будет обрабатывать логику Fruit, другая будет обрабатывать совершенно разные задачи, такие как обмен сообщениями вне приложения и т. Д. Мне также нужно повторно использовать часть модулей в других приложениях, например библиотеку сообщений. На самом деле то, что мне нужно, больше похоже на пространство имен C++ с плагином Singleton в каждой из моих lib и, конечно, все модули моего lib, используемые моим модулем lib и/или другими модулями libs. – Typedef

Смежные вопросы