0

我正在尝试使用broccoli-requirejs编译两个不同的 JS 文件。解决这个问题的一种合乎逻辑的方法似乎是在我的脚本树上运行 requireJs 过滤器两次,使用两种不同的配置。这样做会产生一些非常奇怪的错误,对我来说,这些错误类似于竞争条件或其他东西。

有关 Broccoli 配置和错误输出的信息,请参见下文。

var compileCoffee = require("broccoli-coffee"),
    compileStatic = require("broccoli-static-compiler"),
    mergeTrees    = require("broccoli-merge-trees"),
    requireJs     = require("broccoli-requirejs"),
    _             = require("lodash");

var scripts = compileStatic("app/coffee", {
    srcDir: "/",
    destDir: "scripts"
});
scripts = compileCoffee(scripts, {bare: true});

var rjsOptions = {
    baseUrl: "scripts",
    inlineText: true,
    optimize: "uglify",
    stubModules: ["text"],
    paths: {
        knockout: "empty:"
    }
};

var fooScript = requireJs(scripts, {
    requirejs: _.extend(rjsOptions, {
        include: ["foo"],
        insertRequire: ["main"],
        mainConfigFile: "scripts/main.js",
        name: "main",
        out: "scripts/main.js"
    })
});

var barScript = requireJs(scripts, {
    requirejs: _.extend(rjsOptions, {
        insertRequire: ["bar"],
        mainConfigFile: "scripts/main.js",
        name: "bar",
        out: "scripts/bar.js"
    })
});

module.exports = mergeTrees([
    fooScript,
    barScript
]);

构建时出现以下错误:

$ broccoli build build
Error: Merge error: file scripts/bar.js exists in /home/fredrik/app/tmp/require_js_filter-tmp_dest_dir-yMHQNi3F.tmp and /home/fredrik/app/tmp/require_js_filter-tmp_dest_dir-C8Wv970J.tmp
Pass option { overwrite: true } to mergeTrees in order to have the latter file win.
  at mergeRelativePath (/home/fredrik/app/node_modules/broccoli-merge-trees/index.js:98:21)
  at mergeRelativePath (/home/fredrik/app/node_modules/broccoli-merge-trees/index.js:122:17)
  at /home/fredrik/app/node_modules/broccoli-merge-trees/index.js:23:5
  at $$$internal$$tryCatch (/home/fredrik/app/node_modules/broccoli-merge-trees/node_modules/promise-map-series/node_modules/rsvp/dist/rsvp.js:490:16)
  at $$$internal$$invokeCallback (/home/fredrik/app/node_modules/broccoli-merge-trees/node_modules/promise-map-series/node_modules/rsvp/dist/rsvp.js:502:17)
  at $$$internal$$publish (/home/fredrik/app/node_modules/broccoli-merge-trees/node_modules/promise-map-series/node_modules/rsvp/dist/rsvp.js:473:11)
  at Object.$$rsvp$asap$$flush [as _onImmediate] (/home/fredrik/app/node_modules/broccoli-merge-trees/node_modules/promise-map-series/node_modules/rsvp/dist/rsvp.js:1581:9)
  at processImmediate [as _immediateCallback] (timers.js:345:15)


Build failed

如果我确实传递{overwrite: true}给 mergeTrees 调用,我会得到第一个 requireJs 调用的输出(即scripts/main.js),但文件名是 bar.js

4

1 回答 1

0

看来我的问题与 Broccoli 和 broccoli-requirejs 完全无关。这是我对_.extend覆盖 rjsConfig 对象的调用。并且由于在合并树之前不会使用其配置对象进行实际的 r.js 优化,因此第二次_.extend调用的结果会传入两次。

只需更改传递给的参数的顺序即可_.extend使其按预期工作:

var fooScript = requireJs(scripts, {
    requirejs: _.extend({
        include: ["foo"],
        insertRequire: ["main"],
        mainConfigFile: "scripts/main.js",
        name: "main",
        out: "scripts/main.js"
    }, rjsOptions)
});
于 2015-02-04T08:57:18.183 回答