在脚本之前的模块初始化 运行 期间是否解决了承诺(顶级等待?)

Do promises resolved during module init run before scripts (with top level await?)

当使用 webpack(v5 通过 webpacker v6)并将接口(例如通过全局)导出到网页上的其他脚本时,在模块初始化期间解决的承诺是否必须在页面上的脚本访问它们之前执行?有没有办法确保他们这样做?顶层等待工作吗?

具体来说,假设我有一个导出到全局库 FOO 的模块,如下所示

---In module getting webpacked---
class Foo { ... }
const done = (async function()  {
    Foo.bar = 10 - (await prom)/(await other_prom)
})()
resolve(5); other_resolve(80); //resolve for prom/other_prom
await done //if we have top level await
export {Foo}
--- In (unprocessed) script tag later ---
new FOO.Foo(20);  //This shouldn't execute until AFTER the async function modifies Foo

我希望保证 new FOO.Foo(20) 在上面的异步函数完成执行之前不执行。除了将所有页面 javascript 包装在异步函数中并等待所有初始化承诺之外,有没有办法保证在初始化完成之前不会执行此操作?到那时我还不如放弃异步和写回调函数的好处。

exporting an interface via globals to other scripts on a webpage

不,不要那样做。使用全局变量既不是一个好习惯,top-level-await 也不会让任何东西等待。而且非模块脚本无论如何也不能使用top-level-await。

相反,如果您使用像

这样的模块
export class Foo { ... }
Foo.bar = 10 - (await Promise.resolve(5)/(await Promise.resolve(80));
import * as FOO from 'the-first-module';
new FOO.Foo(20);

那么是的,它将按预期工作,而不是 运行 new Foo 在导入的脚本完成其异步评估之前。