Mocha运行async/await测试报错:ReferenceError: regeneratorRuntime未定义
解决Node 8.9.4下Mocha运行async/await测试的问题
看起来你在升级Node到8.9.4后,用Mocha跑带async/await的测试遇到了问题对吧?结合你的项目架构(同构应用+Babel+Gulp+Webpack),我给你整理几个关键的排查和解决步骤:
1. 修正Babel env预设的配置
首先注意到你提到的.babelrc配置有语法不完整的情况(括号没闭合),而且Node 8.9.4本身已经原生支持async/await,我们可以针对性调整Babel配置,避免冗余转译导致的冲突:
建议把根目录和测试目录的.babelrc统一调整为:
{ "presets": [ ["env", { "targets": { "node": "8.9.4" }, "exclude": ["transform-regenerator"], "useBuiltIns": "usage", "debug": false }] ] }
- 指定
targets.node为你的版本,让Babel只转译Node 8.9.4不支持的语法 - 明确排除
transform-regenerator:Node 8.x的V8引擎已经原生支持async/await,不需要这个转译插件
2. 确保Gulp任务中Mocha加载Babel
因为测试是通过Gulp启动的,必须让Mocha在运行测试前先加载Babel转译器,否则无法识别async/await语法。修改你的Gulp测试任务:
const gulp = require('gulp'); const mocha = require('gulp-mocha'); gulp.task('test', () => { return gulp.src('test/**/*.js', { read: false }) .pipe(mocha({ require: ['babel-register'], // 可选:如果async/await测试耗时较长,调整超时时间 timeout: 5000 })); });
babel-register会让Node在加载测试文件时自动用Babel转译,确保async/await语法被正确处理
3. 对齐Babel依赖版本
版本不匹配是常见的坑,确保你的Babel相关依赖适配Node 8.9.4:
babel-preset-env至少要到v1.7.0(这个版本开始对Node 8的支持更完善)babel-register、babel-core要和babel-preset-env的大版本一致(比如都用6.x系列)
可以用以下命令检查并更新:
npm list babel-preset-env babel-register babel-core npm install babel-preset-env@^1.7.0 babel-register@^6.26.0 babel-core@^6.26.0 --save-dev
4. 单独测试排查问题
如果还是报错,先跳过Gulp,直接用Mocha运行单个测试文件,定位问题根源:
mocha test/your-sample-test.js --require babel-register
- 如果这个命令能正常运行,说明问题出在Gulp任务的配置上
- 如果还是报错,检查.babelrc的语法是否正确,或者测试文件中是否有其他语法问题
内容的提问来源于stack exchange,提问作者hyprstack
相关产品推荐
相关产品推荐

