<div dir="ltr">> <span style="color:rgb(0,0,0);font-family:georgia,serif">Your `initC` solution is working in Meteor (Babel + Reify) and Webpack+Babel, but the `initC` logic seems to run twice, as if there are two C variables instead of one. The following code is based on yours, and the `console.log('initC!!!')` statement unexpectedly executes twice, and you'll see output like this:</span><div><span style="color:rgb(0,0,0);font-family:georgia,serif"><br></span></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif">Damn, that's a Babel bug with the block scoping logic. That said, as in my example, that needs to be `var C;` anyway, `let` would throw (in an environment with working TDZ anyway). Changing it to `var` also stops the duplicate printing.</span></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif"><br></span></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif">> </span><span style="color:rgb(0,0,0);font-family:georgia,serif">I'm also not sure how `initC` can be defined when it is called in the B module, which is evaluated before C and A. The evaluation order is B, C, A (depth first). Does the `initC` function get hoisted into a scope common with all three modules? That is the only way that would seem to explain it, but that seems to go against the intuition I had that each module had it's own module scope (as if it were wrapped inside a `function() {}`, and therefore I thought the `initC` function would be hoisted within the C module, and that with B being evaluated first I thought an "undefined" error would be thrown when it tried to execute `initC` (but that is not happening!). How is it that `initC` can be available to the B module before C is evaluated?</span></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif"><br></span></div><div>There are two separate pieces to executing a module, `Instantiation`, and `Evaluation`, which are what comes into play here. When you tell a JS environment to execute a file, it will instantiate every ES6 module in dependency graph before beginning to execute _any_ of the modules. Babel does its best to simulate this behavior, though it's not perfect at it. One of the things that happens during module instantiation is that hoisted declarations are initialized, which means you can import and call a function declaration from any module, even if that module hasn't started the `Evaluation` phase yet, the same way it'd work with other cases of hoisting, where execution hasn't reached the function declaration, but it is available early.</div><div><br></div><div>This behavior is why you can't use `let C` there, because when `B` is being evaluated, the `let C` line won't have run because the Evaluation phase of `C` hasn't started yet. You can however access the `initC` function because it is a function declaration. As long as there are no TDZ errors in what you're doing, that function can do whatever it would like, assuming it doesn't depend on other stuff that would require `Evaluation` to have finished in `C`, the same as what happens with hoisting normally. That means for instance you couldn't do<br><br>    import B from './B';<br>    var SOME_CONSTANT = "hello";</div><div><br></div><div>    export function initC(){</div><div>        return SOME_CONSTANT;</div><div>    }</div><div><br></div><div>because calling `initC` here would return `undefined` if called from inside a dependency cycle from `B`.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Aug 13, 2016 at 9:09 PM, /#!/JoePea <span dir="ltr"><<a href="mailto:joe@trusktr.io" target="_blank">joe@trusktr.io</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)">Hi Logan,</div><span class=""><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)">> The example I posted works properly with Babel's live-binding implementation and should require less repetition. What were your thoughts on it?</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)"><br></div></span><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)">Your `initC` solution is working in Meteor (Babel + Reify) and Webpack+Babel, but the `initC` logic seems to run twice, as if there are two C variables instead of one. The following code is based on yours, and the `console.log('initC!!!')` statement unexpectedly executes twice, and you'll see output like this:</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)">```</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)"><div class="gmail_default">module B</div><div class="gmail_default">initC!!!</div><div class="gmail_default">module C</div><div class="gmail_default">initC!!!</div><div class="gmail_default">module A</div><div class="gmail_default">function A() { ... }</div><div class="gmail_default">function B() { ... }</div><div class="gmail_default">Entrypoint A {}</div><div>```</div></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)">I'm also not sure how `initC` can be defined when it is called in the B module, which is evaluated before C and A. The evaluation order is B, C, A (depth first). Does the `initC` function get hoisted into a scope common with all three modules? That is the only way that would seem to explain it, but that seems to go against the intuition I had that each module had it's own module scope (as if it were wrapped inside a `function() {}`, and therefore I thought the `initC` function would be hoisted within the C module, and that with B being evaluated first I thought an "undefined" error would be thrown when it tried to execute `initC` (but that is not happening!). How is it that `initC` can be available to the B module before C is evaluated?<br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)">This is the code I have:</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)">```js</div><div class="gmail_default"><span class=""><div class="gmail_default" style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">// --- Entrypoint</div><div class="gmail_default" style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">import A from './A'</div><div class="gmail_default" style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">console.log('Entrypoint', new A)</div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">```</div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small"><br></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">```js</div></span><div><div><font color="#000000" face="georgia, serif">// --- Module A</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">import C, {initC} from './C'</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">console.log('module A')</font></div><div><font color="#000000" face="georgia, serif">initC()</font></div><span class=""><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">class A extends C {</font></div><div><font color="#000000" face="georgia, serif">    // ...</font></div><div><font color="#000000" face="georgia, serif">}</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">export {A as default}</font></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif">```</span><br></div></span></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small"><br></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">```js</div><div><div><font color="#000000" face="georgia, serif">// --- Module B</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">import C, {initC} from './C'</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">console.log('module B')</font></div><div><font color="#000000" face="georgia, serif">initC()</font></div><span class=""><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">class B extends C {</font></div><div><font color="#000000" face="georgia, serif">    // ...</font></div><div><font color="#000000" face="georgia, serif">}</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">export {B as default}</font></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif">```</span><br></div></span></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small"><br></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">```js</div><div><div><font color="#000000" face="georgia, serif">// --- Module C</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><span class=""><div><font color="#000000" face="georgia, serif">import A from './A'</font></div><div><font color="#000000" face="georgia, serif">import B from './B'</font></div><div><font color="#000000" face="georgia, serif"><br></font></div></span><div><font color="#000000" face="georgia, serif">console.log('module C')</font></div><div><font color="#000000" face="georgia, serif">let C</font></div><span class=""><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">export function initC(){</font></div><div><font color="#000000" face="georgia, serif">    if (C) return</font></div><div><font color="#000000" face="georgia, serif"><br></font></div></span><div><font color="#000000" face="georgia, serif">    console.log('initC!!!')</font></div><span class=""><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">    C = class C {</font></div><div><font color="#000000" face="georgia, serif">        constructor() {</font></div><div><font color="#000000" face="georgia, serif">            // this may run later, after all three modules are evaluated, or</font></div><div><font color="#000000" face="georgia, serif">            // possibly never.</font></div><div><font color="#000000" face="georgia, serif">            console.log(A)</font></div><div><font color="#000000" face="georgia, serif">            console.log(B)</font></div><div><font color="#000000" face="georgia, serif">        }</font></div><div><font color="#000000" face="georgia, serif">    }</font></div><div><font color="#000000" face="georgia, serif">}</font></div><div><font color="#000000" face="georgia, serif"><br></font></div></span><div><font color="#000000" face="georgia, serif">initC()</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">export {C as default}</font></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif">```</span><span class="HOEnZb"><font color="#888888"><br></font></span></div></div></div></div><div class="gmail_extra"><span class="HOEnZb"><font color="#888888"><br clear="all"><div><div data-smartmail="gmail_signature"><div dir="ltr"><b style="font-size:12.8px">/#<i>!</i>/</b><font face="courier new, monospace" style="font-size:12.8px">JoePea</font><br></div></div></div></font></span><div><div class="h5">
<br><div class="gmail_quote">On Thu, Aug 11, 2016 at 10:26 AM, Logan Smyth <span dir="ltr"><<a href="mailto:loganfsmyth@gmail.com" target="_blank">loganfsmyth@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Keep in mind `<span style="color:rgb(0,0,0);font-family:georgia,serif">let A = A;` is a TDZ error in any real ES6 environment. </span><div><span style="color:rgb(0,0,0);font-family:georgia,serif"><br></span></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif">The example I posted works properly with Babel's live-binding implementation and should require less repetition. What were your thoughts on it?</span></div></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div>On Thu, Aug 11, 2016 at 12:23 AM, /#!/JoePea <span dir="ltr"><<a href="mailto:joe@trusktr.io" target="_blank">joe@trusktr.io</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)">Alright, so I believe I have found the solution. It is not possible to guarantee a certain module evaluation order, but using some clever (but tedious) conditional checking I believe the problem is solved (with two caveats listed after):</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)">```js</div><div class="gmail_default"><span><div class="gmail_default" style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">// --- Entrypoint</div><div class="gmail_default" style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">import A from './A'</div><div class="gmail_default" style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">console.log('Entrypoint', new A)</div></span><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">```</div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small"><br></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">```js</div><div><span><div><font color="#000000" face="georgia, serif">// --- Module A</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">import C from './C'</font></div></span><div><font color="#000000" face="georgia, serif">import {setUpB} from './B'</font></div><span><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">let A</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">export</font></div><div><font color="#000000" face="georgia, serif">function setUpA(C) {</font></div><div><font color="#000000" face="georgia, serif"><br></font></div></span><div><font color="#000000" face="georgia, serif">    if (!A) {</font></div><span><div><font color="#000000" face="georgia, serif">        A = class A extends C {</font></div><div><font color="#000000" face="georgia, serif">            // ...</font></div><div><font color="#000000" face="georgia, serif">        }</font></div><div><font color="#000000" face="georgia, serif">    }</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">}</font></div><div><font color="#000000" face="georgia, serif"><br></font></div></span><div><font color="#000000" face="georgia, serif">if (setUpA && C) setUpA(C)</font></div><div><font color="#000000" face="georgia, serif">if (setUpB && C) setUpB(C)</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">export {A as default}</font></div></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">```</div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small"><br></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">```js</div><div><span><div><font color="#000000" face="georgia, serif">// --- Module B</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">import C from './C'</font></div></span><div><font color="#000000" face="georgia, serif">import {setUpA} from './A'</font></div><span><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">let B</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">export</font></div><div><font color="#000000" face="georgia, serif">function setUpB(C) {</font></div><div><font color="#000000" face="georgia, serif"><br></font></div></span><div><font color="#000000" face="georgia, serif">    if (!B) {</font></div><span><div><font color="#000000" face="georgia, serif">        B = class B extends C {</font></div><div><font color="#000000" face="georgia, serif">            // ...</font></div><div><font color="#000000" face="georgia, serif">        }</font></div><div><font color="#000000" face="georgia, serif">    }</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">}</font></div><div><font color="#000000" face="georgia, serif"><br></font></div></span><div><font color="#000000" face="georgia, serif">if (setUpA && C) setUpA(C)</font></div><div><font color="#000000" face="georgia, serif">if (setUpB && C) setUpB(C)</font></div><span><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">export {B as default}</font></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">```</div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small"><br></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">```js</div></span><div><span><div><font color="#000000" face="georgia, serif">// --- Module C</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">import A, {setUpA} from './A'</font></div><div><font color="#000000" face="georgia, serif">import B, {setUpB} from './B'</font></div><div><font color="#000000" face="georgia, serif"><br></font></div></span><span><div><font color="#000000" face="georgia, serif">class C {</font></div><div><font color="#000000" face="georgia, serif">    constructor() {</font></div><div><font color="#000000" face="georgia, serif">        // this may run later, after all three modules are evaluated, or</font></div><div><font color="#000000" face="georgia, serif">        // possibly never.</font></div><div><font color="#000000" face="georgia, serif">        console.log(A)</font></div><div><font color="#000000" face="georgia, serif">        console.log(B)</font></div><div><font color="#000000" face="georgia, serif">    }</font></div><div><font color="#000000" face="georgia, serif">}</font></div><div><font color="#000000" face="georgia, serif"><br></font></div></span><div><font color="#000000" face="georgia, serif">if (setUpA && C) setUpA(C)</font></div><div><font color="#000000" face="georgia, serif">if (setUpB && C) setUpB(C)</font></div><div><font color="#000000" face="georgia, serif"><br></font></div><div><font color="#000000" face="georgia, serif">export {C as default}</font></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">```</div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small"><br></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">The caveat is that this fails in both Babel environments and in Rollup. For it to work in Babel environments, `let A` and `let B` have to be changed to `let A = A` and `let B = B`, as per the [fault in Babel's ES2015-to-CommonJS implementation](<a href="https://github.com/meteor/meteor/issues/7621#issuecomment-238992688" target="_blank">https://github<wbr>.com/meteor/meteor/issues/7621<wbr>#issuecomment-238992688</a>) pointed out by Ben Newman. And it fails in Rollup because Rollup [isn't really creating live bindings](<a href="https://github.com/rollup/rollup/issues/845" target="_blank">https://github.com/r<wbr>ollup/rollup/issues/845</a>), which is fine in most cases, but doesn't work with these circular dependencies. The Rollup output does not create the C reference before it is ever used in the first pair of conditional checks, unlike what (I think) would happen with real live bindings (please correct me if wrong). To understand what I mean in the case of Rollup, just run `if (FOO) console.log(FOO)` in your console, and you'll get an error because FOO is not defined. Had the bindings been live, then FOO *would* be defined.</div><span><font color="#888888"><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small"><br></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small"><br></div></font></span></div></div></div></div><div class="gmail_extra"><span><font color="#888888"><br clear="all"><div><div data-smartmail="gmail_signature"><div dir="ltr"><b style="font-size:12.8px">/#<i>!</i>/</b><font face="courier new, monospace" style="font-size:12.8px">JoePea</font><br></div></div></div>
<br></font></span><div class="gmail_quote"><span>On Wed, Aug 10, 2016 at 5:04 PM, /#!/JoePea <span dir="ltr"><<a href="mailto:joe@trusktr.io" target="_blank">joe@trusktr.io</a>></span> wrote:<br></span><div><div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default"><font color="#000000" face="georgia, serif">I found a solution that works in environments compiled by Babel, using the [workaround suggested by Ben Newman](<a href="https://github.com/meteor/meteor/issues/7621#issuecomment-238992688" target="_blank">https://github.com/met<wbr>eor/meteor/issues/7621#issueco<wbr>mment-238992688</a>):</font></div><div class="gmail_default"><span><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">```js</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">// --- Module A</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">import C from './C'</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div></span><div class="gmail_default"><font color="#000000" face="georgia, serif">let A = A // @benjamn's workaround applied</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">export</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">function setUpA(C) {</font></div><span><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">    A = class A extends C {</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">        // ...</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">    }</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">}</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div></span><span><div class="gmail_default"><font color="#000000" face="georgia, serif">export {A as default}</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">```</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">```js</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">// --- Module B</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">import C from './C'</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div></span><div class="gmail_default"><font color="#000000" face="georgia, serif">let B = B // @benjamn's workaround applied</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">export</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">function setUpB(C) {</font></div><span><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">    B = class B extends C {</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">        // ...</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">    }</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">}</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div></span><span><div class="gmail_default"><font color="#000000" face="georgia, serif">export {B as default}</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">```</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">```js</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">// --- Module C</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">import A, {setUpA} from './A'</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">import B, {setUpB} from './B'</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">let C = class C {</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">    constructor() {</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">        // this may run later, after all three modules are evaluated, or</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">        // possibly never.</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">        console.log(A)</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">        console.log(B)</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">    }</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">}</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">setUpA(C)</font></div></span><div class="gmail_default"><font color="#000000" face="georgia, serif">setUpB(C)</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">export {C as default}</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">```</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">```js</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">// --- Entrypoint</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">import A from './A'</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">console.log('Entrypoint', new A) // runs the console.logs in the C constructor.</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">```</font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">Although that works in my environment which is compiled from ES6 modules to CommonJS by Babel, it [doesn't work in Rollup.js](<a href="http://goo.gl/PXXBKI" target="_blank">http://goo.gl/PXXBK<wbr>I</a></font><span style="color:rgb(0,0,0);font-family:georgia,serif">), and may not work in other ES6 module implementations.</span></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">Is there some solution that will theoretically work in any ES6 module environment?</font></div></div><span><font color="#888888"><div class="gmail_extra"><br clear="all"><div><div data-smartmail="gmail_signature"><div dir="ltr"><b style="font-size:12.8px">/#<i>!</i>/</b><font face="courier new, monospace" style="font-size:12.8px">JoePea</font></div></div></div></div></font></span></div>
</blockquote></div></div></div><br></div>
<br></div></div><span>______________________________<wbr>_________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listi<wbr>nfo/es-discuss</a><br>
<br></span></blockquote></div><br></div>
</blockquote></div><br></div></div></div>
</blockquote></div><br></div>