【问题标题】:Top-level await doesn't work in the latest Node.js顶级等待在最新的 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 个不同的主题。

标签: node.js async-await


【解决方案1】:

node --experimental-repl-await 适用于节点 REPL

编辑:Node 16 REPL 默认接受顶级等待,您不再需要实验标志

【讨论】:

  • 另外,如果你总是想在不明确传递标志的情况下启用它,你可以在你的.bashrcexport 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 trackerthis 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 标志对我有用。
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 2021-03-26
    • 2021-03-09
    相关资源
    最近更新 更多