首页 > 解决方案 > Babel 在主要 Node.js 应用程序之外无法工作

问题描述

我的 Express.js 服务器当前正在通过运行启动start.js,然后运行 server.js (下面的代码)。例如,

nodemon start.js

问题:当我尝试在src/lib/seed_database.js使用时运行文件时

node seed_database.js

我们得到的错误表明 babel 没有转译任何 JS 文件,例如

SyntaxError:意外的令牌“导出”

让 babel 处理其他文件的推荐方法是server.js什么?

环境

目录结构

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

开始.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}`)
    }
});

种子数据库.js

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

...

数据库.js

...

export const appDb = appDb;

.babelrc

{
    "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: 不能在模块外使用 import 语句


更新#2

使用 Jeremy Harris 关于单一入口点的第二个建议有效

node start.js seed

开始.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')

标签: javascriptnode.jsecmascript-6babeljs

解决方案


正如我们在评论中讨论的那样,问题是您的种子文件不包含@babel/register代码,因此它没有转译它。根据 CLI args 的建议,您可以将其修改为使用单个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);

如果你想在 .babelrc 中保留配置,你可以在包含 @babel/register 时这样做:

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

这个 GitHub 问题讨论了它周围的一些问题,以防你遇到任何问题:https ://github.com/babel/babel/issues/8321


推荐阅读