3

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

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

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

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

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

4

1 回答 1

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);

请参阅FIDLER演示。

于 2013-05-24T20:36:10.880 回答