require('babel / register')不起作用

时间:2015-03-23 10:26:19

标签: javascript node.js express ecmascript-6 babeljs

我在客户端使用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);
});

8 个答案:

答案 0 :(得分:48)

由于Babel 6使用babel-register hook进行即时翻译。

首先:

 npm install babel-register

然后要求:

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

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

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

@alexander-pustovalov的答案不同,您不需要.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);
});

答案 1 :(得分:36)

require('babel/register')不会传输从中调用的文件。如果您希望server.js包含在即时转换中,您应该使用babel-node(Babel' CLI replacement node)来执行它。

请参阅我的回答here以获取示例。

答案 2 :(得分:9)

I ran into a similar issue trying to render a react page (.jsx) on the server. I fixed it by putting the snippet below at the top of my server file

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

make sure you have npm babel-preset-es2015 and babel-preset-react installed

答案 3 :(得分:5)

根据这个document你必须使用:

require("babel-register");

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

{
  "presets": ["es2015"]   
}

答案 4 :(得分:3)

解决此问题的步骤:

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

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

  6. 结果是server.js中的所有代码都将由寄存器动态转换。请确保您使用具有以下内容的.babelrc正确配置了babel。

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

答案 5 :(得分:2)

在2019年的前夕,我们仍然没有与JS相关的库中的优秀文档,但是,另一方面,我们拥有StackOverflow。

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

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

您只能在import中使用index.js和其他功能并将其归档importrequire s。

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

答案 6 :(得分:-2)

自Babel 7使用以来,您可以使用@babel/register

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

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

如果您使用的是yarn

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

require("@babel/register");

答案 7 :(得分:-4)

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

使用babel安装npm install -g babel,然后执行babel app.js > compiledApp.js将ES6代码编译为ES5代码。然后,您可以运行compiledApp.js

如果您想要使用ES6的某些功能,例如babel/register,这些功能未编译但由于填充而执行,则仍然需要运行时Object.assign。 (查看here以获取示例和更多详细信息)

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