***等待在最新的 Node.js 中不起作用
Posted
技术标签:
【中文标题】***等待在最新的 Node.js 中不起作用【英文标题】:Top-level await doesn't work in the latest Node.js 【发布时间】:2020-04-22 10:39:12 【问题描述】:Node.js(2020 年 1 月,Node.js 13.5.0)仍然不支持*** await
?
我尝试了一些教程,例如this one,但仍然没有运气,总是遇到同样的错误:
D:\NodeJS>node --experimental-modules test.js
(node:17724) ExperimentalWarning: The ESM module loader is experimental.
file:///D:/NodeJS/test.js:9
await test();
^^^^^
SyntaxError: Unexpected reserved word
整个文件内容:
function test()
await test();
我尝试在package.json
中使用"type": "module"
,并将文件重命名为test.mjs
,但仍然出现同样的错误,即使使用最新的Node.js 13.5.0
我做错了什么?
【问题讨论】:
*** await 仍然是第 3 阶段的提案,是什么让您认为它是 node 中的实验性功能? 你指的文章只讲ES模块,不讲***await 那篇文章描述了启用 ES 模块,这在规范中已经有一段时间了,而不是*** await 仍然是一个提议 @Klaycon 正如我解释的那样,我确实尝试将文件重命名为*.mjs
,并将type
设置为module
,但没有任何效果。这些东西应该把脚本变成 ES 模块。
那为什么你的问题是关于***等待?我认为您混淆了 2 个不同的主题。
【参考方案1】:
node --experimental-repl-await
适用于节点 REPL
编辑:Node 16 REPL 默认接受***等待,您不再需要实验标志
【讨论】:
另外,如果你总是想在不明确传递标志的情况下启用它,你可以在你的.bashrc
export NODE_OPTIONS='--experimental-repl-await'
【参考方案2】:
使用node -e
时:
请注意,虽然***await
在节点14.8.0 中未标记,但在执行node -e
(node --eval
) 时,输入类型默认为CJS,而***await
仅在ESM 中允许模式。
要告诉输入是 ESM,你需要一个标志:
node --input-type=module -e 'console.log(await Promise.resolve(42))'
> 42
【讨论】:
【参考方案3】:我不知道为什么,但要获得像你这样的 --harmony 功能需要使用 --eval (-e) 或 --print (-p) 而不是像启动节点一样
node -e "import('./test.mjs')" --experimental-modules --input-type=module --harmony-top-level-await
文件内容:
console.log(await Promise.resolve("test"));
控制台:
node -e "import('./test.mjs')" --experimental-modules --input-type=module --harmony-top-level-await
(node:9096) ExperimentalWarning: The ESM module loader is experimental.
test
【讨论】:
从node 14.8.0
开始,您现在只需要--input-type=module
;其他两个默认启用。【参考方案4】:
根据 this issue tracker 和 this blog post,*** await 在标志 --harmony-top-level-await
后面的 Node v13.3+ 中可用。您启用的模块标志仅适用于 ESM 模块,不适用于***等待。
【讨论】:
几乎可以。 So that article is incorrect then?因为它不起作用,除非我使用mjs
文件扩展名,或者在package.json
中设置"type": "module"
。
@vitaly-t 文章和规范确实声明*** await 只能在 ESM 模块中工作,而不能在 commonjs 模块中工作,因此您必须使用 mjs
扩展或"type": "module"
无论如何。文章应该提到该功能仅在该标志后面的 V8 中,但没有。它只是说它在节点中可用之前“需要一些时间”。
另外,当用 --harmony
替换那个标志时,没有任何效果。
啊,那我错了。我在其他地方读到--harmony
启用所有和谐标志。我已经编辑了答案。
我使用的是 Node v14.7.0,我在 node --help
中找不到任何 --harmony
标志,但有一个 --experimental-repl-await
标志对我有用。以上是关于***等待在最新的 Node.js 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
为啥 mysql-event 在 node.js 中不起作用?
Angular js 表达式在 Node js 项目中不起作用