我在客户端使用Babel transpiler在ES6中编写了同构应用程序。我希望我的快速服务器具有与客户端代码相同的ES6语法。
不幸的是require('babel/register')
无效..
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);
});
答案 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)
解决此问题的步骤:
require('babel/register');
在start.js中,
require('babel/register');
module.exports = require('./server.js');
结果是server.js中的所有代码都将由寄存器动态转换。请确保您使用具有以下内容的.babelrc正确配置了babel。
{
"presets": ["es2015", "stage-0"]
}
答案 5 :(得分:2)
在2019年的前夕,我们仍然没有与JS相关的库中的优秀文档,但是,另一方面,我们拥有StackOverflow。
要在Node.js上使用babel
,您需要
npm install @babel/register @babel/core @babel/preset-env
pre-index.js
node pre-index
您只能在import
中使用index.js
和其他功能并将其归档import
或require
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。