【问题标题】:Can i use Babel Require Hook in production for ES6?我可以在 ES6 的生产环境中使用 Babel Require Hook 吗?
【发布时间】:2015-07-25 04:06:43
【问题描述】:

我有一个使用 ES6 的节点应用程序。我正在使用Babel 进行转译。 据我了解,例如使用像 Gulp 这样的构建系统或使用 require hook 。 Require Hook 方法似乎对我很有吸引力,因为我可以将源文件保存在 ES6 中,但仍然可以使用 node server.js 执行它们,而无需使用某些构建系统。

这似乎对开发非常有用,我主要关心的是在生产中使用这种方法。

  • 每次用户提出请求时都会受到惩罚吗?
  • 这究竟是如何工作的?

对于上下文,我将它与 Express 应用程序一起使用。

【问题讨论】:

  • FWIW,“构建系统”可以像运行 babel src/ --out-dir dist/ 一样简单。这将转换src/ 中的所有文件并将它们保存在dist/ 中。

标签: javascript node.js babeljs


【解决方案1】:

每次用户提出请求时都会受到惩罚吗?

不,不是说它必须在每个请求上重新编译代码。

这究竟是如何工作的?

require 钩子基本上劫持了所有对require() 的后续调用,并在执行该模块之前执行 ES6->ES5 转译。

我在生产环境中使用 babel require 钩子已经有一段时间了(流量水平适中——峰值流量在数百个请求/秒范围内),这从来都不是问题。

【讨论】:

  • 所以基本上是第一次转译并缓存它或类似的东西?
  • 有点(但不是真的)。即使完全没有 babel,任何给定的模块也只会执行一次。显然,如果要导出一个函数或其他东西,该函数可以执行任意多次,但模块本身只会在第一次需要它时被评估一次。将 babel 引入混合并不会改变这种行为,它只是在一次性评估之前执行一次转译。
  • 感谢详细解答
  • @jmar777 require hook 确实有自己的基于文件 mtimes 的缓存。
  • @loganfsmyth 刚看到你的评论(半年后)。是的,Babel 确实缓存了模块的转译版本以加快开发生命周期中的重新启动,但是当模块最初为require()'d 时,在模块被转译(或从缓存中获取)后,再也不会再查询该缓存。即,它与每个请求的性能问题完全正交。
猜你喜欢
  • 1970-01-01
  • 2015-08-26
  • 2019-08-03
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 2013-02-28
  • 2015-10-15
  • 1970-01-01
相关资源
最近更新 更多