Подтвердить что ты не робот

Require ('babel/register') не работает

У меня есть изоморфное приложение, написанное на ES6 на клиенте с Babel transpiler. Я хочу, чтобы мой экспресс-сервер имел тот же синтаксис 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);
});
4b9b3361

Ответ 1

require('babel/register') не пересылает файл, из которого он вызван. Если вы хотите, чтобы server.js включался в транспиляцию "на лету", вы должны выполнить его с помощью babel-node (Babel замена CLI для node).

См. мой ответ здесь для примера.

Ответ 2

Так как 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 с требованием 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);
});

Ответ 3

Я столкнулся с аналогичной проблемой, пытаясь отобразить на сервере реакцию на странице (.jsx). Я исправил это, поставив сниппет ниже в верхней части моего файла сервера.

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

убедитесь, что установлены npm babel-preset-es2015 и babel-preset-react

Ответ 4

В соответствии с этим документом вы должны использовать:

require("babel-register");

Кроме того, вы должны поместить файл .babelrc в корень каталога, из которого вы запускаете сервер.

{
  "presets": ["es2015"]   
}

Ответ 5

чтобы исправить это:

  • удалить require('babel/register'); с сервера .js
  • создайте еще один файл с именем start.js
  • в start.js,

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

В результате весь код внутри server.js будет передаваться с помощью регистра. Убедитесь, что вы правильно настроили babel с .babelrc, имеющим содержимое, как показано ниже.

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

Ответ 6

Вам нужно скомпилировать свой код с помощью Babel. Просмотрите docs со своего веб-сайта.

Установите babel с помощью npm install -g babel, затем выполните babel app.js > compiledApp.js, чтобы скомпилировать ваш код ES6 в код ES5. Затем вы можете запустить compiledApp.js.

Время выполнения babel/register по-прежнему необходимо, если вы хотите использовать некоторые функции ES6, например Object.assign, которые не компилируются, а выполняются благодаря polyfill. (Посмотрите здесь для примеров и более подробной информации)

Изменить: Как сказано в комментарии, вы можете использовать register для компиляции "на лету". Но он будет компилировать модули, которые вам требуются после этого register. Он перехватит функцию require от node. Подробнее здесь. Вам все равно придется скомпилировать файл, где register или не использовать ES6 в этом файле.