2013-11-12 2 views
1

У меня есть функция в ModuleA, которые должны выполняться до загрузки moduleB. ModuleA не зависит от какого-либо другого модуля, а модуль B имеет некоторые зависимости (например, moduleC). Следующий код делает это и хорошо работает, когда он не оптимизирован:RequireJS конфигурации

основные-config.js

require.config({ 
    paths: { 
     moduleA: 'modules/moduleA', 
     moduleB: "modules/moduleB",  
     moduleC: "modules/moduleC", 
    } 
}); 

require(['moduleA'], function (moduleA) { 
    moduleA.init(function() { 
     require(['moduleB'], function (moduleB) { 
      moduleB.start(); 
     }); 
    }); 
}); 

Однако при оптимизации его r.js, вещи становятся испортили. Выход оптимизатора r.js является:

Tracing dependencies for: ../scripts/main-config 
Uglifying file: C:/.../scripts/main-config.js 

C:/.../scripts/main-config.js 
---------------- 
C:/.../scripts/libs/require/require.js 
C:/.../scripts/modules/moduleA.js 
C:/.../scripts/main-config.js 

Это означает, что только 3 модуль - требует, ModuleA и главной-конфигурацию - являются обезображенным вместе 1 свернутого файл. Все зависимости модуля ModuleB (такие как moduleC) отсутствуют в выходном файле.

Изменение конфигурационного файла к следующему, будет включать в себя все зависимости moduleB в в выходном файле, но он не получит нужного результата, так как он разбирает moduleB, прежде чем функции инициализации ModuleA в:

require(['moduleA','moduleB'], function (moduleA, moduleB) { 
    moduleA.init(function() { 
     moduleB.start(); 
    }); 
}); 

Я хочу moduleB который будет разбираться позже, только после функции initA модуля (модуль B содержит некоторые непосредственные функции).

Как я могу получить все дерево зависимостей, которые будут включены в файл результатов, но с моим необходимым поведением (разбор & выполнить модуль Б после функции завершения модуля А)? Спасибо.

ответ

1

Это происходит потому, что require для moduleB вложен и потенциально динамичной; по умолчанию r.js не будет включать такие зависимости в выходной файл. Чтобы изменить это поведение по умолчанию, вы можете установить findNestedDependencies в true (подробнее в example buildconfig file).

В качестве альтернативы, если вы не хотите, чтобы изменить этот флаг для всего проекта, и вы только хотите сделать исключение для этой одной зависимости, вы можете добавить module элемент к вашему buildconfig:

modules: [{ 
    name: "main-config", 
    // forces moduleB to be included 
    include: ["moduleB"] 
    }, 
    // ... 
+0

' findNestedDependencies' выполнил эту работу. Благодаря! – Haji

0

Один из способов с этим маленьким проектом я писал: require-lazy

С этим вы могли бы сделать:

require(['moduleA','lazy!moduleB'], function (moduleA, lazyModuleB) { 
    moduleA.init(function() { 
     lazyModuleB.get().then(function(moduleB) { 
      moduleB.start(); 
     }); 
    }); 
}); 

Для того, чтобы использовать требуют, ленивы, вам нужно будет изменить ваш процесс строительства немного , см. примеры (simple или grunt/bower).


В противном случае вам придется реструктурировать moduleB не требуют, чтобы функции в moduleAявляются бег; он может потребовать moduleA и выполнять эти функции.

Также попробуйте moduleA от moduleB в любом случае, это может решить проблему.

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