Node.js顶级await使用差异:为何部分场景无语法错误?
顶级await在ES模块和CommonJS中的差异原因
核心原因是两段代码用了不同的Node.js模块系统,Node.js对顶级await的支持规则和模块系统直接绑定:
第一段代码是ES模块(用
import语法导入模块)
Node.js从v14.8.0开始允许在ES模块的顶级作用域直接使用await,不需要嵌套在async函数里。ES模块会把顶级await当作模块加载流程的一部分,等await关联的Promise完成后,模块才会被其他模块导入,所以这段代码能正常跑起来。第二段代码是CommonJS模块(用
require语法导入模块)
CommonJS模块系统是同步加载设计,从一开始就不支持顶级await,所以直接在顶级作用域写await getActivity()会触发语法错误。
要让第二段代码正常运行,有两种简单方案:
- 改成ES模块:把文件后缀改成
.mjs,或者在项目package.json里加"type": "module",再把require换成import语法 - 把
await放到自执行的async函数里,代码调整如下:
const axiosRequest = require('axios') async function getActivity() { try { let response = await axiosRequest('https://www.boredapi.com/api/activity') console.log("why am I here1?") return response.data.activity; } catch (e) { console.log("error = " + e) } } // 用自执行async函数包裹 (async () => { await getActivity() })()
内容的提问来源于stack exchange,提问作者nickli
相关产品推荐
相关产品推荐

