顶级等待不适用于节点 14.13.-
Top-level await does not work with node 14.13.-
我有节点 14.13.0,即使使用 --harmony-top-level-await
,顶级等待也无法正常工作。
$ cat i.js
const l = await Promise.new(r => r("foo"))
console.log(l)
$ node -v
v14.13.0
$ node --harmony-top-level-await i.js
/Users/karel/i.js:1
const l = await Promise.new(r => r("foo"))
^^^^^
SyntaxError: await is only valid in async function
at wrapSafe (internal/modules/cjs/loader.js:1001:16)
at Module._compile (internal/modules/cjs/loader.js:1049:27)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
at Module.load (internal/modules/cjs/loader.js:950:32)
at Function.Module._load (internal/modules/cjs/loader.js:791:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
at internal/main/run_main_module.js:17:47
我做错了什么?
顶级 await
仅适用于 ESM 模块(JavaScript 自己的模块格式),不适用于 Node.js 的默认 CommonJS 模块。从您的堆栈跟踪中,您正在使用 CommonJS 模块。
你需要把"type": "module"
放在package.json
中或者使用.mjs
作为文件扩展名(我推荐使用设置)。
例如,package.json
:
{
"type": "module"
}
和这个 main.js
:
const x = await Promise.resolve(42);
console.log(x);
node main.js
显示 42.
旁注:您不需要 --harmony-top-level-await
v14.13.0。该版本默认启用顶层等待(在 v14.8.0 中启用)。
T.J。 Crowder 的答案是正确的,但我建议将所有 .js
更改为 .mjs
例如,如果你像我一样使用 NextJS,你会看到 .next
目录中的文件使用 CommonJS 的问题(.next
是使用 npx next build
生成的)和它们的扩展名是 js
,因此当 .next
文件使用 require()
时会引发错误
我有节点 14.13.0,即使使用 --harmony-top-level-await
,顶级等待也无法正常工作。
$ cat i.js
const l = await Promise.new(r => r("foo"))
console.log(l)
$ node -v
v14.13.0
$ node --harmony-top-level-await i.js
/Users/karel/i.js:1
const l = await Promise.new(r => r("foo"))
^^^^^
SyntaxError: await is only valid in async function
at wrapSafe (internal/modules/cjs/loader.js:1001:16)
at Module._compile (internal/modules/cjs/loader.js:1049:27)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
at Module.load (internal/modules/cjs/loader.js:950:32)
at Function.Module._load (internal/modules/cjs/loader.js:791:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
at internal/main/run_main_module.js:17:47
我做错了什么?
顶级 await
仅适用于 ESM 模块(JavaScript 自己的模块格式),不适用于 Node.js 的默认 CommonJS 模块。从您的堆栈跟踪中,您正在使用 CommonJS 模块。
你需要把"type": "module"
放在package.json
中或者使用.mjs
作为文件扩展名(我推荐使用设置)。
例如,package.json
:
{
"type": "module"
}
和这个 main.js
:
const x = await Promise.resolve(42);
console.log(x);
node main.js
显示 42.
旁注:您不需要 --harmony-top-level-await
v14.13.0。该版本默认启用顶层等待(在 v14.8.0 中启用)。
T.J。 Crowder 的答案是正确的,但我建议将所有 .js
更改为 .mjs
例如,如果你像我一样使用 NextJS,你会看到 .next
目录中的文件使用 CommonJS 的问题(.next
是使用 npx next build
生成的)和它们的扩展名是 js
,因此当 .next
文件使用 require()