【问题标题】:Top-level await does not work with node 14.13.-顶级等待不适用于节点 14.13.-
【发布时间】:2021-03-09 02:29:33
【问题描述】:

我有节点 14.13.0,即使使用 --harmony-top-level-await,顶级 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

我做错了什么?

【问题讨论】:

    标签: javascript node.js top-level-await


    【解决方案1】:

    T.J.克劳德的回答是对的,但我建议将所有 .js 更改为 .mjs

    例如,如果你和我一样使用 NextJS,你会看到 .next 目录中的文件使用 CommonJS 的问题(.next 是使用 npx next build 生成的,并且它们的扩展名是 js 所以它当.next 文件使用require() 时引发错误

    【讨论】:

      【解决方案2】:

      顶级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。


      旁注:v14.13.0 不需要--harmony-top-level-await。该版本默认启用顶级等待(在v14.8.0 中启用)。

      【讨论】:

      • FWIW,我开始使用 ESM 和 Node.js,并单独进入顶级 await,在我的新(ish)书的第 13 章和第 19 章中有一些详细信息, JavaScript:新玩具。如果您有兴趣,请在我的个人资料中链接。
      猜你喜欢
      • 2016-11-20
      • 2019-12-10
      • 2021-08-03
      • 2022-09-28
      • 1970-01-01
      • 2023-03-05
      • 2021-03-19
      • 2020-12-13
      相关资源
      最近更新 更多