javascript - 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
什么?
环境
- 节点 13.7.0
- Mac OS X 10.15.2
- @babel/运行时 7.8.4
- @babel/核心 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
开始.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')
解决方案
正如我们在评论中讨论的那样,问题是您的种子文件不包含@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
推荐阅读
- python - 我可以通过知道对象的值来获取实例数组中对象的索引吗?
- sql - 使用计算列值从同一源表中查找特定值
- perl - 在 perl 中构建 GUI 的最可扩展和最有效的方法是什么?
- python - Django 管理员突然只在生产环境中注销(拒绝执行脚本,因为它的 MIME 类型('text/html')不可执行)
- sql - 从第一个左表中获取所有值,但是当两个左连接使用它限制第一个表中的值时
- r - 在 r 中的多个列上运行 Mann-Kendall
- c# - C# 转换回驱动类型
- java - 正则表达式在开始/结束句子中添加方括号,并且每个单词都用逗号分隔?
- c# - 正确使用 IHttpClientFactory 进行 .net-core 瞬态服务
- python - PyQt5在加载网页内容时返回None值