在require()调用中使用变量时需要优化

时间:2013-05-24 16:49:42

标签: javascript requirejs r.js

我正在使用RequireJSr.js优化器来构建生产就绪的应用。我注意到,在将变量传递给require()调用时,一切都按预期工作。

var someDependencies = ["dependency-1", "dependency-2", "dependency-3"];
require(someDependencies);

但是,在运行优化程序时,不会从变量中读取依赖项,因此不会包含在连接的应用程序脚本中。据我了解,这是因为r.jsrequire()调用中查找字符串文字。它不处理JavaScript,因此变量对它没有任何意义。这甚至在documentation for r.js中说明。

  

优化器只会组合数组中指定的模块   传递给顶级需求和定义的字符串文字   调用,或require('name')字符串文字调用的简化   CommonJS包装。因此,它不会找到通过a加载的模块   变量名。

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

1 个答案:

答案 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演示。