我正在使用RequireJS和r.js优化器来构建生产就绪的应用。我注意到,在将变量传递给require()
调用时,一切都按预期工作。
var someDependencies = ["dependency-1", "dependency-2", "dependency-3"];
require(someDependencies);
但是,在运行优化程序时,不会从变量中读取依赖项,因此不会包含在连接的应用程序脚本中。据我了解,这是因为r.js
在require()
调用中查找字符串文字。它不处理JavaScript,因此变量对它没有任何意义。这甚至在documentation for r.js中说明。
优化器只会组合数组中指定的模块 传递给顶级需求和定义的字符串文字 调用,或require('name')字符串文字调用的简化 CommonJS包装。因此,它不会找到通过a加载的模块 变量名。
我的问题是:有没有办法克服这个问题,以便我可以将变量传递给require()
调用,但仍然将它们包含在r.js构建中?
答案 0 :(得分:3)
在以编程方式将源传递给优化程序之前修改源代码。在构建配置中指定:
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);
请参阅FIDDLER演示。