在生产环境中使用`require('babel/register');`是否可以?

14
根据Babel的官方文档,生产环境中不应该使用`babel-node`。有人说,如果你不想在运行之前将你的ES6代码编译成ES5,可以使用`babel/register`来替代`babel-node`。但是,`babel-node`内部是使用`babel/register`的吗?`babel-node`和`require('babel/register')`有什么区别?在生产环境中使用`require('babel/register')`可以吗?

babel-node 实现了自己的 CLI 接口,因此它不仅仅是要求 'babel/register' - Leonid Beschastny
关于你的问题,很多人这样做(包括我自己),但我仍然期待看到一些好的理由,无论它是好还是坏的实践。 - Leonid Beschastny
1
有没有人看标签描述? babel 是一个关于 Python 库的问题。 - Felix Kling
我认为唯一的缺点是,在第一个请求到达服务器时,Babel将转换和重新编译所有代码,这将比正常情况下需要更多时间。但是,正如所说,这仅会发生在第一个请求到达服务器时(通常在代码的新构建之后即部署新功能之后),因为代码将被缓存以供后续请求使用,所以我认为在生产中使用它没有任何实际问题。 - S.C.
1
我自己也一直在想这个问题;我注意到官方的babel示例没有 - https://github.com/babel/example-node-server - amcdnl
2个回答

9
Babel Handbook(链接来自babeljs.io)表示,在生产环境中使用babel-register是不好的做法(详见:babel-register用户手册):

请注意,这并不适用于生产环境。部署此类代码被认为是不好的做法。最好在部署之前预先编译。但是,在构建脚本或其他本地运行的东西方面,它确实很有效。

因此,似乎建议在运行之前使用babel-cli软件包中的babel命令进行编译。
这也符合npm关于使用转换器的建议。(该建议是针对撰写npm软件包的,但在此情况下同样适用)。

1
我认为正确的方法是构建它(babel src -d dist)并提供转译版本。目前我正在这样做,因为它感觉更安全,尽管我仍然需要在启动文件中导入babel-polyfill以使regenerator运行时正常工作。如果没有它,我会收到ReferenceError: regeneratorRuntime未定义的错误。

https://babeljs.io/docs/usage/polyfill/

server.js

'use strict'

if (process.env.NODE_ENV === 'development')
  require('babel-register')

require('babel-polyfill')
var log = require('nlogger').logger(module)
var app = require('express')()

var cfg = require('./config')
var db  = require('./db')


db.once('open', function () {
  log.info('MongoDB connected.')
})

db.on('close', function () {
  log.info('MongoDB closed.')
})

db.on('error', function (err) {
  log.error('MongoDB connection error:', err)
})

require('./middleware/express')(app)

var server = app.listen(cfg.port, function () {
  log.info('Server listening on port ', cfg.port)
})

// Start socket.io & bring in routes
var io = require('./io')(server)
require('./router')(app, io)


server.on('close', function () {
  log.info('Server connection closed.')
})


module.exports = server

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