我可以使用Babel Require Hook在生产环境中用于ES6吗?

7
我有一个使用ES6的Node应用程序。我正在使用Babel进行转译。 据我所知,可以使用类似Gulp的构建系统或者使用require hook。 Require Hook方法对我很有吸引力,因为我将能够保留我的源文件中的ES6,并且仍然可以使用node server.js执行它们,而不需要使用某些构建系统。
这在开发中似乎非常有用,但我最关心的是这种方法在生产环境中的使用情况。
  • 每次用户发出请求时,它是否会有任何惩罚?
  • 这是如何确切地工作的?

作为背景,我正在使用Express应用程序。


1
顺便说一句,“构建系统”可以简单地运行babel src/ --out-dir dist/。这将转换src/中的所有文件并将它们保存在dist/中。 - Felix Kling
1个回答

8
每次用户发出请求时,它会有惩罚吗? 不会,不用在每个请求上重新转换代码的意义上惩罚它。
这是如何工作的? require钩子基本上劫持所有对require()的后续调用,并在执行该模块之前执行ES6-> ES5转换。
我已经在生产中使用babel require hook一段时间了(具有中等流量水平-峰值流量为每秒几百个请求),从未出现问题。

所以基本上第一次转译它并缓存它或类似的东西? - Javier Cadiz
1
有点像(但实际上并不是)。即使没有babel的干扰,任何给定的模块也只会被执行一次。显然,如果它导出一个函数或其他内容,那么该函数可以被执行多次,但是模块本身只在第一次被需要时进行单次评估。将babel引入其中并不会改变这种行为,它只是在这一次评估之前执行转译。 - jmar777
感谢详细的回答。 - Javier Cadiz
@jmar777 require钩子具有基于文件修改时间的自己的缓存。 - loganfsmyth
1
@loganfsmyth 刚看到你的评论(半年后)。是的,Babel确实会缓存模块的转译版本以加速开发生命周期中的重启,但是在模块被转译(或从缓存中获取)并在最初进行require()时,该缓存不会再次被查询。也就是说,它与每个请求的性能问题完全无关。 - jmar777

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接