TLDR;我的问题是:有没有一种方法可以使 browserify 不使用自己的实现覆盖 require
,而是让它使用不同的方法名称(例如 browserifyRequire
)来满足其自己的所有内部需求。要了解为什么我需要这样做,请继续阅读...
场景
我正在尝试使用 CasperJS 编写一些自动化测试并在 SlimerJS 中运行它们——而不是默认的 PhantomJS(尽管据我所知,我会遇到与 PhantomJS 相同的以下问题)。
我真的想弄清楚如何在 CoffeeScript 中编写这些内容。事实证明,CasperJS 或 SlimerJS 如今与 CoffeeScript 配合不佳。文档的建议是在运行 casper 之前编译为 JS。好吧...不是很方便,但我可以应付。事实上,我还发现 require
在这些工具中解析路径的方式并不像在 Node 中那么简单,因此在运行之前进行捆绑也应该有所帮助。
但现在我在尝试运行捆绑代码时遇到了一系列新问题。我正在使用 Browserify 来实现这一点。
问题
在我的测试代码中,我需要require('casper')
。 CasperJS 世界中的标准实践。因此,我必须通过将 "browser": { "casper": false }
放入我的 package.json
中,告诉 browserify 不要捆绑 CasperJS。到目前为止没有问题。但问题来了:
Browserify 覆盖内置的 require
函数,提供自己的 require
实现,该实现可以完成使 browserify 工作的所有操作。 CasperJS 可以正常使用,直到遇到 require('casper')
指令。这是 CasperJS 必须执行 require
'ing 的一次,而不是 browserify。但这失败了。
不完整的解决方案
我非常确定 CasperJS 无法处理 Browserify 覆盖 require
的事实,因为 CasperJS 实现了自己的 require
方式。为了测试这个假设,我手动编辑了生成的包,将每次出现的 require
重命名为 browserifyRequire
—— 包括 browserify 的 require
实现。我唯一保持不变的 require
是对 require('casper')
的调用,因为这是我需要 CasperJS 处理 require
的一次。事实上,这使得事情按预期进行。
问题
同样,有没有办法让 browserify 使用不同的名称作为其内部 require
?我想我可以编写一个脚本来在捆绑后进行此更改,但我更愿意弄清楚如何通过配置来执行此操作。
另一个问题
也许除了 Browserify 之外,还有另一种在 CasperJS 中捆绑和运行 CoffeeScript 的解决方案?我还没找到……
最佳答案
找到了一个合理的解决方案 - 可以作为 npm
脚本运行的解决方案,例如通过添加到 package.json
npm run build-test-bundle
"scripts": {
"build-test-bundle": "browserify -t coffeeify casper-coffee-test.coffee | derequire | sed 's/_dereq_..casper../require(\"casper\")/g' > casper-coffee-test.compiled.js"
},
该命令序列执行以下操作:
关于javascript - 使用 Browserify 捆绑 CasperJS+SlimerJS 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36752852/