Hacker News new | ask | show | jobs
by wtfrmyinitials 1623 days ago

    > import foo from 'foo';
    > await foo.bar();
You only have to `await foo.bar()` if foo.bar was an async function already, the module system is irrelevant. You would still need to await it even if it was `require()`'d in.

    import baz from 'baz';
    baz.foo();
Works just fine, no `await` necessary.

      > await Promise.all([
      >   import('other'),
      >   import('stuff'),
      > ]);
Of course these have to be awaited, at this point you're explicitly trying to load new code while the program is running. It's no different than any other kind of async IO.

    > import yet from 'more-stuff';
I assume this is included to imply that loading `yet` is blocked by the `await Promise.all` above it to show that import statements can run after module resolution. If this was your intent you are mistaken, that import statement is still resolved before execution begins.

    // main.js
    console.log('a')
    await new Promise(res => setTimeout(res, 1000))
    console.log('b')
    import { foo } from "./foo.js";
    // foo.js
    export function foo() {
    }
    console.log('c')
Results in

    c
    a
    [one second pause]
    b
> Yes, an import statement is [semantically] blocking. But even so it’s important to know that it’s performing async I/O.

No, it really isn't. From the POV of the application code it's irrelevant. This is trivially proven by the existence of module bundlers which convert non-dynamic `import` statements into one big file that doesn't do anything asynchronous to initialize.

(edit: fighting with formatting)

1 comments

> You only have to `await foo.bar()` if foo.bar was an async function already, the module system is irrelevant. You would still need to await it even if it was `require()`'d in.

You cannot do that. Top-level await is forbidden because CJS require is explicitly synchronous.

> Works just fine, no `await` necessary.

I typed all of that on a phone so I erred on the side of brevity, but suppose either the Promise.all or the awaited imports depended on some result from importing foo.

> I assume this is included to imply that loading `yet` is blocked by the `await Promise.all` above it to show that import statements can run after module resolution. If this was your intent you are mistaken, that import statement is still resolved before execution begins.

I was trying to show that import statements are blocked by prior awaits. I’m not sure what you’re trying to show, but you’d need to log output after the import from foo.js to see how the asynchrony works for that import.

> No, it really isn't. From the POV of the application code it's irrelevant. This is trivially proven by the existence of module bundlers which convert non-dynamic `import` statements into one big file that doesn't do anything asynchronous to initialize.

Compare that to a non-bundled but otherwise similarly optimized app and look at the waterfall.