要求('babel/register')不起作用

require('babel/register') doesn't work

我在 Babel transpiler 客户端上用 ES6 编写了同构应用程序。我希望我的快速服务器具有与客户端代码相同的 ES6 语法。

不幸的是require('babel/register')不起作用..

server.js

require('babel/register'); // doesn't work
// require('babel-core/register); doesn't work..

const env = process.env.NODE_ENV || 'development';
const port = process.env.NODE_PORT || 1995;

const http = require('http');
const express = require('express');
const address = require('network-address');

let app = express();

app.set('port', port);
app.use(express.static(path.join(__dirname, 'public')));

app.get('*', (req, res) => {
   res.send('Hello!');
});

http.createServer(app).listen(app.get('port'), function () {
   console.info('Demo app is listening on "%s:%s" env="%s"', address(), app.get('port'), env);
});

您需要使用 Babel 编译您的代码。 从他们的网站上查看 docs

安装 babelnpm install -g babel 然后执行 babel app.js > compiledApp.js 将您的 ES6 代码编译成 ES5 代码。然后你可以 运行 compiledApp.js.

如果你想使用 ES6 的一些功能,比如 Object.assign,由于 polyfill,这些功能没有编译但执行,运行time babel/register 仍然是必需的。 (检查 here 以获取示例和更多详细信息)

编辑: 如评论中所述,您可以使用 register 即时编译。但它会在此 register 之后编译您需要的模块。它将从 node 挂钩 require 函数。更多 here。 您仍然需要编译 register 所在的文件,或者不在此文件中使用任何 ES6。

require('babel/register') 不转译调用它的文件。如果你想让 server.js 包含在即时转译中,你应该用 babel-node 执行它(Babel 的 CLI replacement for node)。

示例见我的回答

根据这个 document 你必须使用:

require("babel-register");

此外,您必须将 .babelrc 文件放在启动服务器的目录的根目录中。

{
  "presets": ["es2015"]   
}

由于 Babel 6 使用 babel-register hook 进行 on-the-fly 转译。

第一个:

 npm install babel-register

然后要求它:

require('babel-register');    
// not using 
// require('babel/register');
// or 
// require('babel-core/register);

To 将您的 Ecmascript 6 代码转换为 ecmascript 5,您必须使用 require babel-register 设置 Babel presets 选项,如下所示:

require('babel-register')({
  presets: [ 'es2015' ]
});

的答案不同,您不需要 .babelrc 文件。

您还必须安装 babel-preset-es2015:

npm install babel-preset-es2015

最终您的 Server.js 文件将是:

require('babel-register')({
   presets: [ 'es2015' ]
});

const env = process.env.NODE_ENV || 'development';
const port = process.env.NODE_PORT || 1995;

const http = require('http');
const express = require('express');
const address = require('network-address');

let app = express();

app.set('port', port);
app.use(express.static(path.join(__dirname, 'public')));

app.get('*', (req, res) => {
   res.send('Hello!');
});

http.createServer(app).listen(app.get('port'), function () {
   console.info('Demo app is listening on "%s:%s" env="%s"', address(), app.get('port'), env);
});

我 运行 遇到类似的问题,试图在服务器上呈现反应页面 (.jsx)。 我通过将下面的代码片段放在我的服务器文件的顶部来修复它

require('babel-register')({
    presets: ['es2015', 'react']
});

确保安装了 npm babel-preset-es2015babel-preset-react

解决此问题的步骤:

  1. 从 server.js
  2. 中删除 require('babel/register');
  3. 创建另一个名为 start.js
  4. 的条目文件
  5. 在start.js,

    require('babel/register'); module.exports = require('./server.js');

结果是 server.js 中的所有代码都将由寄存器即时转译。请确保您已使用具有如下内容的 .babelrc 正确配置了 babel

{
  "presets": ["es2015", "stage-0"]
}

自Babel 7开始使用,可以使用@babel/register

npm install --save-dev @babel/core @babel/register

yarn add --dev @babel/core @babel/register

如果您正在使用 yarn

在代码中只需包含以下行:

require("@babel/register");

在 2019 年的前夕,我们在 JS 相关库中仍然没有好的文档,但是,另一方面,我们有 Whosebug。

要在 Node.js 上使用 babel,您需要

  1. npm install @babel/register @babel/core @babel/preset-env
  2. 创建一个包含附加内容的文件pre-index.js
  3. 运行 node pre-index

您只能在 index.js 中使用 imports 和其他功能,并将其归档 imports 或 requires。

require('@babel/register')({
    presets: [
        [
            "@babel/preset-env",
            {
                targets: {
                    node: "current"
                }
            }
        ]
    ]
});
require('./index.js');