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);
见演示