Babel не работает за пределами основного Node.js приложения - PullRequest
1 голос
/ 05 февраля 2020

Мой Express. js сервер в данный момент запускается с помощью start.js, который, в свою очередь, запускает server.js (код ниже) . Например,

nodemon start.js

Проблема: Когда я пытаюсь запустить файл на src/lib/seed_database.js, используя

node seed_database.js

, мы получаем ошибки, показывающие, что babel не передача любых файлов JS, таких как

SyntaxError: неожиданный токен 'export'

Каков рекомендуемый способ заставить babel работать с файлом, отличным от server.js?

Среда

  • Узел 13.7.0
  • Ма c OS X 10.15.2
  • @ babel / runtime 7.8.4
  • @ babel / core 7.8.4
  • @ babel / plugin-transform-runtime 7.8.3
  • @ babel / preset-env 7.8 .4
  • @ babel / register 7.8.3 "

Структура каталогов

my-app
├── .node_modules
├── src
│   ├── lib
│   │    └── seed_database.js
│   ├── v1
│   │    └── routes.js
│   ├── start.js
│   └── server.js
├── .babelrc
├── package-lock.json
├── package.json

start. js

require("@babel/register")({
    presets: [
      ["@babel/preset-env", {
        "targets": {
          "node": "current"
        }
      }]
    ]
});

module.exports = require('./server.js')

сервер. js

import express from 'express';
import v1ApiRoutes from './v1/routes';
import constants from './config/constants';

const app = express();
app.use('/v1', v1ApiRoutes);

app.listen(constants.PORT, err => {
    if (err) {
        console.log('Cannot run!')
    } else {
        console.log(`App listening on port: ${constants.PORT}`)
    }
});

seed_database. js

const db = require('../../config/db')['appDb'];

...

дБ. js

...

export const appDb = appDb;

.babelr c

{
    "plugins": [
        ["@babel/transform-runtime"]
    ]  
}

Обновление

Предложение Джереми Харриса работает:

require("@babel/register")({
    presets: [
      ["@babel/preset-env", {
        "targets": {
          "node": "current"
        }
      }]
    ]
});

const db = require('../../config/db')['appDb'];

Однако, когда мы заменяем строку require именованным импортом:

import { appDb as db } from '../../config/db';

, мы получаем новую ошибку

SyntaxError: Невозможно использовать оператор импорта вне модуля


Обновление # 2

Использование второго предложения Джереми Харриса об одной точке входа работает

node start.js seed

start. js

require("@babel/register")({
    presets: [
      ["@babel/preset-env", {
        "targets": {
          "node": "current"
        }
      }]
    ]
});


if (process.argv.indexOf('seed') > -1) {
  module.exports = require('./lib/seed_database.js')
  return
}

 module.exports = require('./server.js')

1 Ответ

1 голос
/ 05 февраля 2020

Как мы обсуждали в комментариях, проблема в том, что ваш начальный файл не содержал код @babel/register, следовательно, он не передавал его. Согласно предложению с аргументами CLI, вы можете изменить его, чтобы использовать один module.exports, например:

// Default module
let commandModule = './server.js';

// Override with different command
if (process.argv.indexOf('seed') > -1) {
  commandModule = './lib/seed_database.js';
}

module.exports = require(commandModule);

Если вы хотите сохранить конфигурацию в .babelr c, вы можете сделать это, включив @babel / register:

require('@babel/register')({
  extends: './.babelrc',
  ignore: [/node_modules/],
});

В этом выпуске GitHub обсуждаются некоторые проблемы, связанные с ним в случае возникновения любой из них: https://github.com/babel/babel/issues/8321

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...