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-envpre-index.js with attached contentsnode pre-index
You can use imports and other features only in index.js and files it imports or requires.
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