On Oct 15, 2012, at 6:45 AM, Kevin Smith <[email protected]> wrote:

> OK, so:
> 
>     module A {
>       console.log("a");
>       export var x;
>     }
> 
>     console.log("$");
>     import x from A;
> 
> Does this print:

Good question. The way we have it currently specified isn't ideal for 
concatenation, I think. The code executes eagerly, from top to bottom, but if 
it encounters an external load, it executes that external module on demand 
(i.e., on first import). This means that this:

    // a.js
    import b from "b.js";
    console.log("a");
    export let a = "a";

    // b.js
    console.log("b");
    export let b = "b";

    // main.js
    import a from "a.js";
    console.log("main");

prints "b" then "a" then "main", whereas this:

    module a {
        import b from b;
        console.log("a");
        export let a = "a";
    }
    module b {
        console.log("b");
        export let b = "b";
    }
    import a from "a".js";
    console.log("main");

prints "a" then "b" then "main". That's clearly a problem for simple 
concatenation. On the one hand, the point of eager execution was to make the 
execution model simple and consistent with corresponding IIFE code. On the 
other hand, executing external modules by need is good for usually (except in 
some cases with cyclic dependencies) ensuring that the module you're importing 
from is fully initialized by the time you import from it.

I see two coherent alternatives:

(a) execute inline modules by need (i.e., on first import) rather than eagerly
(b) execute external modules "transactionally", trying to order them by 
dependency so that imported modules have fully initialized before the code that 
depends on them runs

The weird thing about (a) is that code that appears to be straight-line 
actually executes in somewhat more unpredictable (although deterministic) 
order. The downside of (b) is that when you have cyclic dependencies, one 
module won't even be *partly* initialized before the other module starts 
running. (Although usually, when you have cyclic dependencies, you probably 
don't want to be evaluating exports from each other in top-level code -- you 
want all those mutual references to be happening under functions.)

Dave

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to