javascript - Babel 无法在主 Node.js 应用程序之外工作

标签 javascript node.js ecmascript-6 babeljs

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

nodemon start.js

问题:当我尝试使用

运行 src/lib/seed_database.js 中的文件时
node seed_database.js

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

SyntaxError: Unexpected token 'export'

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

环境

  • Node 13.7.0
  • Mac 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/注册 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')

server.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'];

...

db.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: Cannot use import statement outside a module

<小时/>

更新 #2

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

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')

最佳答案

正如我们在评论中讨论的那样,问题是您的种子文件不包含 @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);

如果你想在.babelrc中保留配置,你可以在包含@babel/register时执行此操作:

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

此 GitHub 问题讨论了一些相关问题,以防您遇到任何问题:https://github.com/babel/babel/issues/8321

关于javascript - Babel 无法在主 Node.js 应用程序之外工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60079588/

相关文章:

javascript - 为什么|| {} 在父[当前部分] = 父[当前部分] || {}

node.js - 在流式 HTTP 客户端之间共享 DEFLATE 压缩的数据 block

javascript - 路线 ('next' )在 ExpressJS 中做什么?

python - 如何在多个存储库之间共享 Protocol Buffer .proto 文件

javascript - return 语句中的解构

javascript - 替换特定开始结束位置的字符串 javascript

javascript - Bootstrap Colorpicker,如何在下拉列表中设置颜色值框?

javascript - 使用javascript将excel文件读取到数组中

javascript - 如果用户由于第二个处理程序中的对话框而停留在页面上,则跳过 beforeunload 处理程序

javascript - 如何在 Javascript (ECMAScript 6) 中确定 Set 是否包含没有引用的对象(动态添加到集合中)