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

前端 未结 8 1255
春和景丽
春和景丽 2020-12-01 07:01

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 requi

相关标签:
8条回答
  • 2020-12-01 07:39

    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

    1. npm install @babel/register @babel/core @babel/preset-env
    2. Create a file pre-index.js with attached contents
    3. Run node 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');
    
    0 讨论(0)
  • 2020-12-01 07:40

    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.

    0 讨论(0)
  • 2020-12-01 07:40

    You need to compile your code using Babel. Check out the docs from their website.

    Install babel with npm install -g babel then do babel app.js > compiledApp.js to compile your ES6 code into ES5 code. You can then run compiledApp.js.

    The runtime babel/register is still needed if your want to use some functions of ES6 like Object.assign which are not compiled but executed thanks to a polyfill. (Check here for examples and more details)

    Edit: As said in the comment, you can use the register to compile on the fly. But it will compile modules you are requiring after this register. It will hook the require function from node. More here. You will still need to compile the file where the register or to not use any ES6 in this file.

    0 讨论(0)
  • 2020-12-01 07:48

    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

    0 讨论(0)
  • 2020-12-01 07:52

    steps to fix this:

    1. remove require('babel/register'); from server.js
    2. create another entry file called start.js
    3. in start.js,

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

    The result is that all code inside server.js will be transpiled on the fly by the register. Please make sure you have configured babel correctly with a .babelrc having the content like below

    {
      "presets": ["es2015", "stage-0"]
    }
    
    0 讨论(0)
  • 2020-12-01 07:55

    Since Babel 7 use, you can use @babel/register

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

    or

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

    if you're using yarn.

    In the code you just include the following line:

    require("@babel/register");
    
    0 讨论(0)
提交回复
热议问题