【问题标题】:Why shouldn't babel-node be used in production?为什么不应该在生产中使用 babel-node?
【发布时间】:2016-07-08 10:50:19
【问题描述】:

babel-node docs 发出严厉警告:

不适合生产使用

您不应该在生产中使用babel-node。它不必要地繁重,由于缓存存储在内存中,内存使用率很高。由于需要动态编译整个应用程序,因此您也总是会遇到启动性能损失。

让我们分解一下:

  • 内存使用 - 嗯?无论如何,所有模块都在应用程序的生命周期内“缓存”在内存中。他们来这里做什么?

  • 启动损失 – 这是一个性能问题吗?部署 Web 应用程序已经需要几秒钟(如果您在 CI 中进行测试,则需要几分钟)。为启动增加半秒没有任何意义。事实上,如果启动时间在任何地方都很重要,那么它在开发中比在生产中更重要。如果您重新启动网络服务器的频率足够高,以至于启动时间成为问题,那么您就会遇到更大的问题。

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

Babel 的警告只是 FUD,还是我遗漏了什么?如果警告是有效的,为什么它不适用于 Babel 的 require 钩子?


相关Is it okay to use babel-node in production ——但这个问题只是询问如果推荐生产使用,答案只是引用官方建议,即“否”。相比之下,我质疑官方建议背后的推理。

【问题讨论】:

  • 虽然 require 钩子本身没有警告,但 require 钩子的文档中有一个警告(在 babeljs.io/docs/setup 的“选择您的工具”表中选择“Require hook”)。跨度>

标签: babeljs


【解决方案1】:

babel 节点

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

如果没有 kexec 模块,您可能会遇到一个非常糟糕的情况,即 child_process 死了,但它的死亡或错误永远不会冒泡。欲了解更多信息,请参阅https://github.com/babel/babel/issues/2137

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

(强调我的)

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

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

  • “大型应用程序的内存使用率非常高”
  • “未安装 kexec 会出现不良行为”

这些问题导致生产警告。

babel 注册

另外,没有关于在生产中使用 Babel 的 require 钩子 (require('babel-register')) 的警告

可能没有警告,但也不建议这样做。见this issue

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

【讨论】:

    【解决方案2】:

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

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

    我相信节点的缓存,在评估一个模块之后,只会缓存从导出中可以到达的东西,或者更确切地说,不再可以到达的东西最终会被 GCed。

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

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

    【讨论】:

    • "babel-node 的缓存将是 node 的 require 缓存之上的另一个缓存" 这个额外的缓存到底是什么,它的目的是什么?为什么 babel-register 没有同样的问题?
    • 原来 babel-node 和 babel-register 也在“你的临时目录”中使用磁盘缓存,无论是:babeljs.io/docs/usage/require
    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2016-08-23
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多