Ответ 1
Ограничение относится к упрощенному синтаксису CommonJS против стандартного синтаксиса обратного вызова:
- http://requirejs.org/docs/whyamd.html#commonjscompat
- https://github.com/jrburke/requirejs/wiki/Differences-between-the-simplified-CommonJS-wrapper-and-standard-AMD-define
Загрузка модуля по сути является асинхронным процессом из-за неизвестного времени его загрузки. Однако RequireJS в эмуляции серверной спецификации CommonJS пытается дать вам упрощенный синтаксис. Когда вы выполните что-то вроде этого:
var foomodule = require('foo');
// do something with fooModule
То, что происходит за кулисами, заключается в том, что RequireJS смотрит на тело вашего функционального кода и анализирует, что вам нужно "foo" и загрузить его до выполнения вашей функции. Однако, когда переменная или ничего, кроме простой строки, например, вашего примера...
var module = require(path); // Call RequireJS require
... then Require не может разобрать это и автоматически преобразовать его. Решением является преобразование в синтаксис обратного вызова;
var moduleName = 'foo';
require([moduleName], function(fooModule){
// do something with fooModule
})
Учитывая приведенное выше, вот один из возможных вариантов повторения вашего второго примера для использования стандартного синтаксиса:
define(['dyn_modules'], function (dynModules) {
require(dynModules, function(){
// use arguments since you don't know how many modules you're getting in the callback
for (var i = 0; i < arguments.length; i++){
var mymodule = arguments[i];
// do something with mymodule...
}
});
});
EDIT: из вашего собственного ответа, я вижу, что вы используете underscore/lodash, поэтому использование _.values
и _.object
может упростить цикл с использованием массива аргументов, как указано выше.