1

TLDR;我的问题是:有没有办法让browserify 不require使用它自己的实现覆盖,而是让它使用不同的方法名称(例如browserifyRequire)来满足它自己的所有内部需求。要了解我为什么需要这样做,请继续阅读...

情景

我正在尝试使用 CasperJS 编写一些自动化测试并在 SlimerJS 中运行它们——而不是默认的 PhantomJS(尽管据我所知,我会遇到与 PhantomJS 相同的以下问题)。

真的很想弄清楚如何在 CoffeeScript 中编写这些。事实证明,CasperJS 或 SlimerJS 现在在 CoffeeScript 上表现不佳。文档的建议是在运行 casper 之前编译为 JS。好的...不是超级方便,但我可以处理它。事实上,我还发现require在这些工具中解析路径的方式并不像在 Node 中那样简单,因此在运行之前进行捆绑也应该对此有所帮助。

但是现在我在尝试运行捆绑代码时遇到了一系列新问题。为此,我正在使用 Browserify。

问题

在我的测试代码中,我需要require('casper'). CasperJS 世界的标准实践。所以我不得不告诉 browserify 不要捆绑 CasperJS,把"browser": { "casper": false }我的package.json. 到目前为止没有问题。但问题来了:

Browserify 覆盖了内置require函数,提供了它自己的实现require来完成使 browserify 工作的所有事情。require('casper')在遇到指令之前,CasperJS 很好。这是 CasperJS 必须做的一次require,而不是 browserify。那失败了。

不完整的解决方案

我很确定 CasperJS 无法处理 Browserify 覆盖的事实require,因为 CasperJS 实现了自己的requireing 方式。为了验证这个假设,我手动编辑了生成的包,将每次出现的 重命名requirebrowserifyRequire- 包括 browserify 的require. 我唯一require没有改变的是对 的调用require('casper'),因为那是我需要 CasperJS 处理requireing 的一次。事实上,这使事情按预期工作。

问题

同样,有没有办法让 browserify 使用不同的名称作为它自己的内部名称require?我想我可以在捆绑后编写一个脚本来进行此更改,但我更愿意通过 config.xml 弄清楚如何做到这一点。

另一个问题

也许除了 Browserify 之外,还有另一种在 CasperJS 中捆绑和运行 CoffeeScript 的解决方案?我还没有找到一个......

4

1 回答 1

0

找到了一个合理的解决方案——一个可以作为npm脚本运行的解决方案,例如npm run build-test-bundle通过添加package.json

"scripts": {
  "build-test-bundle": "browserify -t coffeeify casper-coffee-test.coffee | derequire | sed 's/_dereq_..casper../require(\"casper\")/g' > casper-coffee-test.compiled.js"
},

此命令序列执行以下操作:

  1. browserify -t coffeeify casper-coffee-test.coffee构建捆绑包
  2. | derequire将 browserify输出通过管道传递给derequirenpm它将所有出现的require函数重命名为_dereq_
  3. | sed 's/_dereq_..casper../require(\"casper\")/g'将先前的输出通过管道传输到sed命令,该命令将恢复正常需要所有出现的_dereq_("casper")
于 2016-04-29T00:10:39.707 回答