为什么babel-node不能用于生产?

时间:2016-07-08 10:50:20

标签: babeljs

babel-node docs发出严厉警告:

  

不适合生产用途

     

您不应该在制作中使用babel-node。由于高速缓存存储在存储器中,因此存储器使用率很高,这是不必要的。您还将始终遇到启动性能损失,因为整个应用程序需要动态编译。

让我们打破这个:

  • 内存使用情况 - 是吗?无论如何,所有模块都会在内存中“缓存”,以保证应用程序的生命周期。他们在这里得到了什么?

  • 启动惩罚 - 这是一个性能问题?部署Web应用程序已经需要几秒钟(如果您在CI中进行测试,则需要几分钟)。添加半秒到启动意味着什么。事实上,如果启动时间在任何地方都很重要,那么它在开发中比生产更重如果您经常重启Web服务器以至于启动时间成为问题,那么您会遇到更大的问题。

此外,没有关于在制作中使用Babel的require hookrequire('babel-register'))的警告,尽管这可能与babel-node完全相同。例如,您可以执行node -r babel-register server.js并获得与babel-node server.js相同的行为。 (我的公司在数百个微服务中完成了这一点,没有任何问题。)

Babel的警告只是FUD,还是我错过了什么?如果警告有效,为什么它也不适用于Babel require hook?

相关Is it okay to use babel-node in production - 但是这个问题只是询问是否建议生产使用,答案只是引用官方建议,即“否”。相反,我质疑官方建议背后的原因。

2 个答案:

答案 0 :(得分:2)

巴别节点

添加了生产警告以解决this issue

  

如果没有kexec模块,你可能会遇到一个非常丑陋的情况,即child_process死掉但它的死亡或错误从未冒泡。有关详细信息,请参阅https://github.com/babel/babel/issues/2137

     

如果babel-node上的文档解释说它不是针对生产而且没有安装kexec它会有不良行为,那就太棒了。

(强调我的)

原始问题#2137的链接已失效,但您可以找到它here

所以这里似乎有两个问题:

  • "大型应用上的内存使用率非常高"
  • "没有安装kexec,它有不良行为"

这些问题会导致生产警告。

巴别注册

  

此外,没有关于在制作中使用Babel的需求钩子(要求(' babel-register'))的警告

可能没有警告,但也没有建议。见this issue

  

babel-register主要推荐用于简单情况。如果您遇到问题,将工作流程更改为围绕文件监视器构建的工作流程似乎是理想的选择。请注意,我们也从不建议将babel-register用于生产案例。

答案 1 :(得分:1)

我对巴贝尔和节点的内部人员不够了解,无法给出完整答案;其中一些是推测,但缓存babel节点会做的与缓存节点不同。

babel-node的缓存是节点需要缓存之上的另一个缓存,它最多必须缓存生成的源代码(在它之前和之前) #39; s被送到节点)。

我认为在评估模块之后,节点的缓存只会缓存从导出中可以访问的内容,或者更确切地说,不再可以访问的内容最终会被GC。

启动惩罚取决于.babelrc的内容,但是您每次执行时都要强制babel做一些翻译整个源代码的工作。即使您实现了持久性缓存,babel-node仍然需要为您应用的每个文件执行缓存获取和验证。

在开发过程中,更加合适的工具,如手表模式下的webpack,可以在冷启动后仅重新翻译已修改的文件,这甚至比具有完美优化缓存的babel节点快得多。