使用db-migrate+@babel/register与ES6模块时遇Unexpected token export错误求助
解决db-migrate导入本地工作包时的ES模块语法错误问题
我完全懂你遇到这个问题的崩溃感——明明依赖装得好好的,执行迁移命令却卡在语法错误上,太闹心了!咱们一步步来排查解决:
问题根源
你使用的Node v12.4.0对ES模块(export语法)的原生支持还不完善,而且db-migrate的babel插件默认只转译migrations目录下的文件,没有处理你导入的本地工作区包@mypackage/models,导致Node直接读取了未转译的ES语法代码,抛出了SyntaxError。
解决方案
方案1:让Babel覆盖转译本地工作区包
把根目录的.babelrc替换成babel.config.js(因为.babelrc是局部配置,不会处理工作区的其他包),并明确指定要转译的路径:
module.exports = { presets: ['@babel/preset-env'], include: [ './migrations/**/*', './common/models/**/*' // 加上你的模型源码路径 ] };
同时检查你的database.json(db-migrate的配置文件),确保已经启用了babel插件:
{ "dev": { "driver": "mysql", // ...你的数据库连接配置 "plugins": ["db-migrate-plugin-babel"] } }
方案2:把模型文件改成CommonJS格式(最省心)
既然Node v12对CommonJS支持更稳定,直接修改@mypackage/models里的文件,替换ES导出语法:
var CONSTANT_ONE = "foo_one"; var CONSTANT_TWO = "foo_two"; var CONSTANT_THREE = "foo_three"; // 替换export为CommonJS的导出方式 module.exports = { CONSTANT_ONE, CONSTANT_TWO, CONSTANT_THREE };
这样不需要任何转译,Node就能直接识别,也能避开工作区转译的坑。
方案3:启用ES模块实验特性(不推荐)
如果坚持要用ES模块,可以在@mypackage/models的package.json里添加:
{ "type": "module" }
但Node v12需要加上--experimental-modules flag运行,而且db-migrate对实验性ES模块的支持可能不稳定,大概率会遇到其他问题,所以优先推荐前两个方案。
验证步骤
- 删掉
node_modules和yarn.lock,重新执行yarn install - 再尝试运行迁移命令:
db-migrate down -c 1
应该就能顺利执行了!
内容的提问来源于stack exchange,提问作者U4EA
相关产品推荐
相关产品推荐

