I have isomorphic app written in ES6 on client with Babel transpiler. I want my express server to have the same ES6 syntax as client code.
Unfortunately require('babel/register')
doesn't work..
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 converts modules to CommonJS by default, which is what Node uses and which defines a require function (again, nothing to do with require. js). However, you can tell Babel to convert modules to something else, e.g. AMD or UMD, which would then work with require. js.
The purpose of babel is to transpile your js current code to an understandable version of js for the given environment, tool, framework you're using.
Since Babel 6
use babel-register hook
to make on-the-fly transpilation.
First:
npm install babel-register
Then require it with:
require('babel-register'); // not using // require('babel/register'); // or // require('babel-core/register);
To Convert your Ecmascript 6
code to ecmascript 5
, you must set Babel presets
option with require babel-register
Like this:
require('babel-register')({ presets: [ 'es2015' ] });
Unlike the answer of @alexander-pustovalov you do not need to .babelrc
file.
you must also install babel-preset-es2015
:
npm install babel-preset-es2015
Finally your Server.js file will be:
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); });
require('babel/register')
doesn't transpile the file it is called from. If you want server.js to be included in on-the-fly transpilation, you should execute it with babel-node
(Babel's CLI replacement for node
).
See my answer here for an example.
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
In the eve of 2019 we still have no good documentation in JS-related libraries, but, on the other hand, we have StackOverflow for that.
In order to use babel
on Node.js, you need to
npm install @babel/register @babel/core @babel/preset-env
pre-index.js
with attached contentsnode pre-index
You can use import
s and other features only in index.js
and files it import
s or require
s.
require('@babel/register')({
presets: [
[
"@babel/preset-env",
{
targets: {
node: "current"
}
}
]
]
});
require('./index.js');
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With