Javascript 在require()调用中使用变量时的RequireJS优化

Javascript 在require()调用中使用变量时的RequireJS优化,javascript,requirejs,r.js,Javascript,Requirejs,R.js,我正在使用和优化器构建一个生产就绪的应用程序。我注意到,当将变量传递给require()调用时,一切都按预期进行 var someDependencies = ["dependency-1", "dependency-2", "dependency-3"]; require(someDependencies); 但是,在运行优化器时,不会从变量读取依赖项,因此不会包含在连接的应用程序脚本中。据我所知,这是因为r.js在require()调用中查找字符串文本。它不处理JavaScript,因此变

我正在使用和优化器构建一个生产就绪的应用程序。我注意到,当将变量传递给
require()
调用时,一切都按预期进行

var someDependencies = ["dependency-1", "dependency-2", "dependency-3"];
require(someDependencies);
但是,在运行优化器时,不会从变量读取依赖项,因此不会包含在连接的应用程序脚本中。据我所知,这是因为
r.js
require()
调用中查找字符串文本。它不处理JavaScript,因此变量对它来说毫无意义。这甚至在报告中也有说明

优化器将只合并在数组中指定的模块 传递给顶级require和define的字符串文本的数量 调用,或在简化的 普通包装。因此,它将找不到通过 变量名


我的问题是:有没有办法克服这个问题,这样我就可以将变量传递到
require()
调用中,但仍然将它们包含在r.js构建中?

在以编程方式将其传递给优化器之前修改源代码。在生成配置中指定:

onBuildRead: function (moduleName, path, contents) {
    // modify contents here
    return contents;
}
这是在优化器开始处理源之前调用的。然后可以匹配依赖项并替换。简单概念:

var content = 'var someDependencies = ["dependency-1", "dependency-2", "dependency-3"];\n' +
    'require(someDependencies, function(){\n' +
    '  });';

var varName = /require\((\w+)/.exec(content)[1];
var regex = new RegExp(varName + '\\s*=\\s*(\\[.*\\])');
var dependencies = regex.exec(content)[1];
var modifiedContent = content.replace('require(' + varName, 'require(' + dependencies);

console.log(modifiedContent);
见演示