Используйте requirejs в gruntjs для создания библиотеки и используйте ее в других проектах.

Я создаю библиотеку, которая представляет собой набор папок, содержащих файлы Javascript Model View Controller.
Каждый файл имеет зависимости, объявленные с использованием синтаксиса require:

define([
    'modules/moduleA/src/moduleAModel',
    'modules/moduleA/src/moduleAController',
], function(moduleAModel, moduleAController) {
    function moduleAView(param) {
        // ....
    }

Я компилирую эту библиотеку, используя GruntJS с замечательным "grunt-contrib-requirejs".
Проблема в том, что у библиотеки нет точки входа, нет основной.
Я хочу, чтобы пользователи могли использовать ее, вызов каждого модуля, когда он им нужен.

Вот мои вопросы:

Во-первых:
Как я могу создать один файл javascript для библиотеки, которая включает все модули, не объявляя их по одному?

Во-вторых:
Как я могу повторно использовать эту библиотеку позже в другом проекте? Я пробовал это:

define(function(require) {
    var myLibrary = require('js/external-libs/myMinifiedLibrary.min');
    var moduleAV = new moduleAView();

Но, конечно, вторые строки терпят неудачу, есть ли что-то вроде require(myLibrary.moduleAView)?

Что ты предлагаешь ?

Обновление:
я обнаружил, что когда вы минимизируете все свои модули в одном файле, у вас есть несколько определений на одной странице, это интерпретируется как скрипт для requirejs, и вы должны его загрузить. дважды ! (в первый раз весь файл, во второй раз ваш основной). Затем моя «основная» или точка входа создается вручную (что все еще является проблемой) на ответах рокерест. Итак, решение моего второго вопроса находится в этом сообщении:
http://jaketrent.com/post/dynamically-require-optimized-modules-requirejs/




Ответы (1)


У меня была противоположная проблема: я хотел, чтобы пользователи загружали библиотеку и не должны были знать о каждом внутренний модуль< /а>.

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

Этот файл является точкой входа.

Если бы я изменил этот файл, чтобы он возвращал объект, каждый внутренний модуль был бы доступен в загруженной библиотеке:

define(
    ["layout", "region"],
    function( Layout, Region ){
        return {
            "LayoutModule": Layout,
            "RegionModule": Region
        };
    }
);

Я думаю, это то, что вы хотите:

  • оптимизатор r.js собирает все в один файл
  • другой код просто включает файл библиотеки (require( "myLib" ))
  • каждый отдельный модуль доступен в объекте ответа (myLib.LayoutModule, myLib.RegionModule).
person rockerest    schedule 21.04.2015
comment
Действительно интересно, это отвечает на мои вторые вопросы, но все же мне придется объявить каждый модуль в точке входа. Проблема в том, что у меня есть основная папка библиотеки со многими файлами, но также и в каждом дополнительном модуле у меня много файлов. Добавление новой строки каждый раз, когда я хочу добавить модуль, нарушило бы тот факт, что мой код модульный - person Tim; 22.04.2015
comment
@Tim Похоже, вы говорите что-то вроде: я хочу, чтобы загрузчик зависимостей загружал все мои зависимости, но я не хочу определять свои зависимости! Ваш код по-прежнему модульный, но вы должны КАК-ТО указать своей библиотеке, какие модули ей нужны! - person STLMikey; 22.04.2015
comment
@SLTMikey Я, наверное, не совсем ясно выразился, я не хочу определять свои зависимости «вручную» при создании библиотеки, я хочу, чтобы все было в одном файле. Также мои зависимости хорошо определены для каждого файла, проблема в том, что у меня много файлов. Я хочу иметь возможность использовать эти модули, когда использую эту библиотеку. - person Tim; 23.04.2015
comment
@rockerest Кстати, мне не удается использовать myLib.LayoutModule, я, вероятно, делаю что-то не так, должен ли я использовать оптимизатор require с своего рода оберткой AMD? - person Tim; 23.04.2015