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

cal*_*lum 12 babeljs

巴贝尔节点文档进行严厉的警告:

不适合生产使用

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

让我们打破这个:

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

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

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

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


相关:在生产中使用babel-node是否可以 - 但是这个问题只是询问是否建议使用生产,答案只是引用官方建议,即"否".相反,我质疑官方建议背后的原因.

Jes*_*hia 1

我对 babel 和 node 的内部结构了解不够,无法给出完整的答案;其中一些是推测,但是缓存 babel-node 所做的事情与缓存节点所做的事情不同。

babel-node 的缓存将是节点的 require 缓存之上的另一个缓存,并且它最多只能缓存生成的源代码(在将其馈送到节点之前)。

我相信节点的缓存在评估模块后只会缓存可从导出访问的内容,或者更确切地说,不再访问的内容最终将被GCed。

启动惩罚将取决于您的内容.babelrc,但是您迫使 babel在每次执行时都进行跑腿工作来翻译整个源代码。即使您实现了持久缓存,babel-node 仍然需要对应用程序的每个文件进行缓存获取和验证。

在开发中,更合适的工具(例如处于监视模式的 webpack)可以在冷启动后仅重新翻译修改过的文件,这甚至比具有完美优化缓存的 babel-node 快得多。