当前位置: 首页 > news >正文

如何在 Node.js 项目中正确配置 babel 支持 async await 语法

如何在 Node.js 项目中正确配置 babel 支持 async await 语法

根据 2024 年 2 月 8 日的技术分析,配置 babel 支持 async/await 时若未正确引用@babel/plugin-transform-runtime 插件且 useBuiltIns 设置为 entry,会产生"regeneratorRuntime is not defined"报错,这是最常见的配置错误。

原因分析

async/await 是 ES7 草案语法,在 Node.js 6 以下版本中无法原生支持。根据 2017 年 12 月 15 日的资料,Node.js 6 及以下版本需要通过 Babel 将 ES7 异步函数转换为 ES5 兼容代码。从技术原理来看,async/await 本质上是 generator + promise 的组合,Babel 在转换过程中需要 regeneratorRuntime 来支持 generator 函数的运行。2024 年 2 月 8 日的分析指出,当 Babel 配置中 useBuiltIns 设置为 entry 且没有引用@babel/plugin-transform-runtime 插件时,就会生成 regeneratorRuntime is not defined 报错。

解决方案

方案一:使用 babel-plugin-transform-async-to-generator 插件

根据 2017 年 3 月 1 日和 2020 年 1 月 14 日的配置方案,步骤如下:

第一步:全局安装 babel-cli

npm i -g babel-cli

第二步:安装转换 async 语法插件

npm i babel-plugin-transform-async-to-generator --save-dev

第三步:在项目根目录下创建.babelrc 配置文件,加入以下内容:

{"plugins": ["transform-async-to-generator"]
}

第四步:编译 JS 文件

babel xxx.js -o xxx-build.js

或直接运行:

babel-node es7.js

方案二:使用@babel/plugin-transform-runtime 插件

根据 2016 年 11 月 28 日的配置,新建.babelrc 文件描述 babel 配置:

{"presets": ["stage-3", "es2015"],"plugins": [["transform-runtime", {"polyfill": false,"regenerator": true}]]
}

该方案使用 babel 官方推荐的 transform-runtime 进行翻译,而不是 polyfill,避免对原生对象的污染和项目性能负担。

方案三:使用 asyncawait 模块直接运行

根据 2016 年 6 月 15 日的资料,可以安装 asyncawait@1.0.3 模块:

npm install asyncawait@1.0.3 --save

创建示例类 AsyncService.js:

var async = require('asyncawait/async');
var await = require('asyncawait/await');var sleep = async(function sleep(timeout) {return new Promise(function(resolve, reject) {setTimeout(function() { resolve(); }, timeout);});
});(async(function() {console.log('Do some thing, ' + new Date());await(sleep(3000));console.log('Do other things, ' + new Date());
}))();

该方案无须编译为 ES5,可直接运行,模块内部引用 bluebird 模块。

注意事项

根据 2020 年 1 月 14 日的用户反馈,Windows 系统下执行 babel 脚本时可能发生权限错误,这是因为 Windows 系统默认禁止运行不信任脚本。解决办法:

1. 按 win+X 键,使用管理员身份运行 PowerShell

2. 输入命令:set-executionpolicy remotesigned

3. 输入 Y,回车,问题解决

根据 2017 年 12 月 15 日的资料,在 Node.js 6 以下版本使用 Koa 2 框架时,需要在入口文件 (www 文件) 顶部加入:

require('babel-register');

并在项目根目录加入.babelrc 文件:

{"presets": [["env", { "targets": { "node": true } }]]
}

根据 2024 年 2 月 8 日的技术分析,如果配置中 useBuiltIns 设置为 entry 并且没有引用@babel/plugin-transform-runtime 插件,就会生成 regeneratorRuntime is not defined 报错,这是最常见的配置陷阱。

参考来源

来源:博客园 - 使 nodejs 服务端支持 async/await 语法 (2017 年 3 月 1 日)

来源:CSDN - nodejs6 以下使用 koa2,async,await (2017 年 12 月 15 日)

来源:知乎 - Babel 是如何转换 async/await 的 (2024 年 2 月 8 日)

来源:博客园 - 使用 async/await——Nodejs+ExpressJs+Babel (2016 年 11 月 28 日)

原文链接:https://www.zjcp.cc/ask/9629.html

http://www.jsqmd.com/news/753793/

相关文章:

  • 告别代码内耗:2026“科技+商科”复合背景高薪突围策略
  • 改进YOLOv10:基于动态正负样本均衡策略解决类别不平衡问题
  • 10分钟打造专属文件共享中心:彩虹外链网盘实战指南
  • 【紧急预警】DOTS 2.0正式版中已被移除的API兼容层正在 silently 拖垮你的构建速度:3类高危Deprecated调用检测脚本(附自动化修复工具)
  • 如何快速搭建一个免费的问卷、考试、刷题系统?Windows 解压双击就能用
  • 静态反射不再纸上谈兵,C++27元数据驱动开发全链路解析,含AST遍历、属性注入与SFINAE-Free约束推导
  • 别再乱用on start了!CANoe XML测试模块初始化,用CAPL Test Function才靠谱
  • Redis分布式锁进阶第十三篇
  • 誉财 YC - 18 - JG 小型激光模板机:服装缝切工艺的革新先锋
  • 本博客将不再更新
  • 2026 喷淋洗涤塔厂家技术测评:核心指标、行业现状与选型参考 - 小艾信息发布
  • 轻松实现远程桌面游戏手柄控制:RdpGamepad完整解决方案
  • Taotoken 的 API Key 管理与访问控制功能实际使用感受
  • QKeyMapper深度解析:从零开始构建专业级Windows按键映射系统
  • 顺序表完全指南:从原理到实现
  • 从零构建RAG系统:核心流程、代码实现与调优指南
  • 蓝河工具箱下载6.6最新版
  • D2DX:暗黑破坏神2现代PC重生的终极解决方案
  • slot
  • 从Windows桌面到Raspberry Pi Zero W2:.NET 9跨架构边缘调试7大约束条件对照表,第4项已被微软标记为P0阻塞问题
  • 【新手必看】C语言二维数组实战:从栈损坏报错到彻底掌握(附VS2022排坑指南)
  • 全链路压测的环境复杂性:网络架构、应用架构与性能影响因素全解析
  • 【ISO/IEC 14882:2027草案第12.8节权威解读】:为什么你的noexcept函数仍在抛异常?3类隐式异常路径正在绕过你的防护
  • 5分钟快速上手d2s-editor:暗黑破坏神2存档修改完全指南
  • 告别模糊!用STM32F103C8T6驱动OV7670摄像头,实现稳定图像采集的完整流程
  • JTAG技术解析:从原理到嵌入式调试实践
  • 基于OpenClaw Starter快速构建Python多智能体系统:从原理到实践
  • 利用SAR图像相位信息的YOLOv10遥感舰船检测:从原理到实战完全指南
  • 【医疗数据安全红线】:PHP脱敏算法性能提升300%的5个核心优化技巧
  • 2026 活性炭箱厂家技术测评与行业优选解析 - 小艾信息发布