【发布时间】:2020-05-21 14:11:47
【问题描述】:
我的 Express.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 以外的文件的推荐方法是什么?
环境
- 节点 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/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')
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"]
]
}
更新
Jeremy Harris 的建议有效:
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
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')
【问题讨论】:
-
尝试将
require("@babel/register")添加到您的种子文件中。 -
@JeremyHarris 这行得通!但是,仅当我使用
const db = require(...)时才有效。如果我们使用命名导入,例如import { appDb as db } from '../../config/db';,那么我们现在会得到错误SyntaxError: Cannot use import statement outside a module -
也许在
start.js中,您检查 CLI args,如果参数是“seed”,则包含播种器,否则包含正常服务器。这样它就只是一个包含 babel 的入口点。 -
@JeremyHarris 谢谢,现在可以了!使用有效的代码更新问题。代码是否正确编写?我觉得在第一个
module.exports之后有 2 个module.exports和一个return很奇怪 -
顺便说一句,
require("@babel/register")行也应该出现在.bashrc中吗?
标签: javascript node.js ecmascript-6 babeljs