<div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)">Yep, I believe that the first error was solved by moving the import statement to the top!<br><br>As for the second error, I think (but not yet sure) that the problem might be due to the circular dependency `src/motor-html/node -> src/motor/Transformable -> src/motor/Sizeable -> src/motor/Scene -> src/motor/ImperativeBase -> src/motor/Node -> src/motor-html/node`.</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)">The problem will be solved after I re-organize some things, but if you have any suggestions it would be greatly appreciated!</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 still not sure why it works in Reify and not in Webpack.</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)">- Joe</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)"><br></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" 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><div class="gmail_quote">On Sat, Oct 8, 2016 at 5:23 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"><font color="#000000" face="georgia, serif">Hello Logan, I wonder if I can borrow your expertise for just a moment:</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">I ran into another problem. Suppose I have the following code which is very similar to the code I had before (using the `var` trick along with `initC` function), but now Module C imports `someFunction` from a newly added module.</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">The problem is that module B will be evaluated before both Module C and the utilities module. When `initC` is called inside of the B module, the `initC` function will try and call `someFunction` but there will be an error because the utilities module was not yet evaluated, so `someFunction` is undefined.</font><br></div><div class="gmail_default"><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default"><font color="#000000" face="georgia, serif">What would you recommend as a solution?</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">Here's the code:</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"><span class=""><div class="gmail_default">```js</div><div class="gmail_default">// --- Entrypoint</div><div class="gmail_default">import A from './A'</div><div class="gmail_default">console.log('Entrypoint', new A)</div><div class="gmail_default">```</div><div class="gmail_default"><br></div><div class="gmail_default">```js</div><div class="gmail_default">// --- Module A</div><div class="gmail_default"><br></div><div class="gmail_default">import C, {initC} from './C'</div><div class="gmail_default"><br></div><div class="gmail_default">console.log('module A')</div><div class="gmail_default">initC()</div><div class="gmail_default"><br></div><div class="gmail_default">class A extends C {</div><div class="gmail_default">    // ...</div><div class="gmail_default">}</div><div class="gmail_default"><br></div><div class="gmail_default">export {A as default}</div><div class="gmail_default">```</div><div class="gmail_default"><br></div><div class="gmail_default">```js</div><div class="gmail_default">// --- Module B</div><div class="gmail_default"><br></div><div class="gmail_default">import C, {initC} from './C'</div><div class="gmail_default"><br></div><div class="gmail_default">console.log('module B')</div><div class="gmail_default">initC()</div><div class="gmail_default"><br></div><div class="gmail_default">class B extends C {</div><div class="gmail_default">    // ...</div><div class="gmail_default">}</div><div class="gmail_default"><br></div><div class="gmail_default">export {B as default}</div><div class="gmail_default">```</div><div class="gmail_default"><br></div><div class="gmail_default">```js</div><div class="gmail_default">// --- Module C</div><div class="gmail_default"><br></div><div class="gmail_default">import A from './A'</div><div class="gmail_default">import B from './B'</div></span><div class="gmail_default">import {someFunction} from './utilities'</div><div class="gmail_default"><br></div><div class="gmail_default">console.log('module C')</div><div class="gmail_default"><br></div><div class="gmail_default">var C</div><div class="gmail_default"><br></div><div class="gmail_default">initC()</div><span class=""><div class="gmail_default"><br></div><div class="gmail_default">export function initC(){</div><div class="gmail_default">    if (C) return</div><div class="gmail_default"><br></div><div class="gmail_default">    console.log('initC!!!')</div></span><div class="gmail_default">    someFunction()</div><span class=""><div class="gmail_default"><br></div><div class="gmail_default">    C = class C {</div><div class="gmail_default">        constructor() {</div><div class="gmail_default">            // this may run later, after all three modules are evaluated, or</div><div class="gmail_default">            // possibly never.</div><div class="gmail_default">            console.log(A)</div><div class="gmail_default">            console.log(B)</div><div class="gmail_default">        }</div><div class="gmail_default">    }</div><div class="gmail_default">}</div><div class="gmail_default"><br></div></span><span class=""><div class="gmail_default">export {C as default}</div><div class="gmail_default">```</div><div class="gmail_default"><br></div><div class="gmail_default">```js</div></span><div class="gmail_default">// utilities.js</div><div class="gmail_default"><br></div><div class="gmail_default">var someFunction = () => {...}</div><div class="gmail_default"><br></div><div class="gmail_default">export {</div><div class="gmail_default">    someFunction,</div><div class="gmail_default">}</div><div class="gmail_default">```</div><div class="gmail_default"><br></div><div class="gmail_default">I think a possible (though strange) solution is to change the import order in Module C, f.e.:</div><div class="gmail_default"><br></div><div class="gmail_default">```js</div><div class="gmail_default"><span class=""><div class="gmail_default">import A from './A'</div><div class="gmail_default">import B from './B'</div></span><div class="gmail_default">import {someFunction} from './utilities'</div><div>```</div><div><br></div><div>I haven't actually tested that example code, but I believe I'm having a problem like this with Webpack+Babel here: <a href="https://github.com/trusktr/infamous/tree/circular-dep-bug" target="_blank">https://github.com/trusktr/<wbr>infamous/tree/circular-dep-bug</a></div></div><div><br></div><div>In this case, there is a circular dependency between `src/motor/Scene` and `src/motor/Sizeable` (which I've already planned to eliminate, but am still curious about how I would solve it without eliminating the circular dep). The modules import the defaults of each other, and I'm using the `var Sizeable/initSizeable` trick. However, there's a third module, `Utility.js` from which the `Sizeable` module needs to import something to use inside of the `initSizeable` function.</div><div><br></div><div>You can experience the error by simply opening `motor-scratch.html` in your browser, in which case you'll get an error like</div><div><br></div><div>```</div></font><div><font color="#000000" face="georgia, serif">Sizeable.js:328: Uncaught TypeError: Cannot read property '</font>makeLowercaseSetterAliases<font color="#000000" face="georgia, serif">' of undefined<br></font></div><font color="#000000" face="georgia, serif"><div>```</div><div><br></div><div>where `makeLowercaseSetterAliases` is akin to the `someFunction` of my earlier example. The odd thing is that everything works fine in Meteor's Reify environment, and I'm only getting this error when using the bundle made by Webpack+Babel.</div><div><br></div><div>If I re-order the dependencies in `src/motor/Sizeable` so that they look like this:</div><div><br></div><div>```js</div><div><div>import { makeLowercaseSetterAliases } from './Utility'</div><div>import XYZValues from './XYZValues'</div><div>import Motor from './Motor'</div><div>import Scene from './Scene'</div><div>```<br></div></div><div><br></div><div>then the error goes away, but I get another error:</div><div><br></div><div>```</div><div>node.js:129: Uncaught TypeError: Cannot read property 'prototype' of undefined<br></div><div>```</div><div><br></div><div>I have a feeling that moving the import to the beginning solved the problem, and that now I have another problem...</div><div><br></div><div>If you'd like to test changes (f.e. moving the import statement), you can simply:</div><div><br></div><div>```</div><div>npm install</div><div>npm run watch</div><div>```</div><div><br></div><div>which will automatically compile the global.js file after making changes to anything in `src`, and you can reload the page in your browser.</div><div><br></div><div>Any and all input you may have on this would be greatly appreciated!</div><div><br></div><div>Thanks a ton!</div><div><br></div><div>All the best,</div><div>- Joe</div><span class="HOEnZb"><font color="#888888"><div><br></div></font></span></font></div></div><div class="gmail_extra"><span class="HOEnZb"><font color="#888888"><br clear="all"><div><div class="m_5367418973091929880gmail_signature" 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 Tue, Aug 23, 2016 at 8:55 PM, 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"><span><div>> <span style="color:rgb(0,0,0);font-family:georgia,serif">Should I open an issue there? And I think you're right about it should throw, because it is strange that the function can be executed before the module is ever evaluated (that seems like it should be impossible), and therefore a TDZ error would happen because the `let` line wasn't theoretically evaluated yet.</span></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif"><br></span></div></span><div><span style="color:rgb(0,0,0);font-family:georgia,serif">If you'd like, go for it. To note, Babel 6 doesn't implement TDZ at all at the moment anyway.</span></div><span><div><br></div>>  <span style="color:rgb(0,0,0);font-family:georgia,serif">I don't see how it is possible with `var`. How is it that `var`s or `function`s can be hoisted *out of* the module? Is that part of spec? If so, then that is different hoisting from function-based hoisting of pre-ES6.</span><div><span style="color:rgb(0,0,0);font-family:georgia,serif"><br></span></div></span><div><span style="color:rgb(0,0,0);font-family:georgia,serif">They are not hoisted out of the module. It seems like you may be misunderstanding how modules are linked together.</span></div><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">> </span><span style="color:rgb(0,0,0);font-family:georgia,serif">Pre-ES6 "hoisting" in javascript happens on boundaries set by `function`s, and I thought that modules would be similar to function bodies, and therefore I thought that hoisting would be limited to within a module and did not expect hoisting to go beyond the module boundary to some scope that encompasses multiple modules. That to me is a different type of "hoisting" than what I know from pre-ES6 JavaScript's function-scope hoisting so it isn't necessarily the "same way it'd work with other cases of hoisting"; there is definitely some ES6-module-specific stuff happening that is a little different from pre-ES6 function-scope hoisting. (sidenote: I've asked the awesome Axel of 2ality to add these useful details to his articles.)</span></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif"><br></span></div></span><div><span style="color:rgb(0,0,0);font-family:georgia,serif">Hoisting of var and functions behaves the same way in ES6 and in ES5 and you are correct there is no "</span><span style="color:rgb(0,0,0);font-family:georgia,serif">beyond the module boundary". Let's clarify hoisting in a function.<br></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></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif">function fn() {</span></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif">    console.log(inner());</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">    function inner(){ return "hello world"; }</span></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif">}<br>fn();<br>```<br>in this context, when an engine executes `fn()`, before any execution has happened inside the `fn`, the engine does the following</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">1. Create the conceptual function "scope", which exists immediately as soon as the function is called.</span></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif">2. Look for all function declarations inside `fn` and create their variables and assign their values to point to function objects. This is "function hoisting".</span></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif">3. Look for all var declarations inside `fn` and create variables with the value `undefined`. This is "var hoisting".</span></div><div><font color="#000000" face="georgia, serif">4. Look for all let/const declarations, and create uninitialized variables (these will throw when accessed)</font></div><div>5. A bunch of other stuff I'm skipping</div><div>6. Execute the function body itself.</div><div><br></div><div>A very similar process happens for modules. You can think of it like steps 1-4 running, then before executing the module body (step 6), we recursively do this same process on every imported module. So by the time any module gets to step 6, every imported module, and every module those modules depend on, will have executed step 1-4, and have scopes that have been created, and variables that have been declared (possibly with a value, or possibly left uninitialized).</div><div><br></div><div>So by the time you get to step 6, there isn't a "<span style="color:rgb(0,0,0);font-family:georgia,serif">beyond the module boundary", when you access the imported variables in your module, the JS engine will reach across the module boundary for you, to get the current value of the variable in the imported module. This behavior of reaching across module scopes is what module syntax allows, and it is what enables live binding.</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">Because of this live behavior, if you imported something that was defined with `let`, like your `let C;` example, it would cause a TDZ error because the variable was still "uninitialized", whereas if you make it a `var`, it will be initialized to `undefined`.</span></div><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">> </span><span style="color:rgb(0,0,0);font-family:georgia,serif">If I use the `var` method as you proposed (which is working in my Babel env), should I expect that method to always work in any theoretical 100%-implemented-to-spec ES6 environment, not just in Babel?</span></div><div><span style="color:rgb(0,0,0);font-family:georgia,serif"><br></span></div></span><div><span style="color:rgb(0,0,0);font-family:georgia,serif">Correct.</span></div></div><div class="m_5367418973091929880HOEnZb"><div class="m_5367418973091929880h5"><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Aug 23, 2016 at 8:17 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"><span><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)">> 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.</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)">Should I open an issue there? And I think you're right about it should throw, because it is strange that the function can be executed before the module is ever evaluated (that seems like it should be impossible), and therefore a TDZ error would happen because the `let` line wasn't theoretically evaluated yet.</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 don't see how it is possible with `var`. How is it that `var`s or `function`s can be hoisted *out of* the module? Is that part of spec? If so, then that is different hoisting from function-based hoisting of pre-ES6.</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 was under the impression that the modules were like a function, and hoisting would only happen inside the module. In that case, the `initC` function could not possibly be available until the `C` module itself was evaluated, so I was expecting for there to be an `undefined` error when `initC` was called before the `C` module was evaluated.</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)">You say that</div><span><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)">> 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 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)">Which makes sense based on what I see happening, but it seems strange because it means that the scope of the module (as far as hoisting is concerned) is not the module itself, but rather some outer scope that wraps *all* the modules that import a given symbol.</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)">You said,</div><span><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 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 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)">Pre-ES6 "hoisting" in javascript happens on boundaries set by `function`s, and I thought that modules would be similar to function bodies, and therefore I thought that hoisting would be limited to within a module and did not expect hoisting to go beyond the module boundary to some scope that encompasses multiple modules. That to me is a different type of "hoisting" than what I know from pre-ES6 JavaScript's function-scope hoisting so it isn't necessarily the "same way it'd work with other cases of hoisting"; there is definitely some ES6-module-specific stuff happening that is a little different from pre-ES6 function-scope hoisting. (sidenote: I've asked the awesome Axel of 2ality to add these useful details to his articles.)</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)">If I use the `var` method as you proposed (which is working in my Babel env), should I expect that method to always work in any theoretical 100%-implemented-to-spec ES6 environment, not just in Babel?</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)">If so, then this may be one of the rare cases of "when we'd want to actually use `var` instead of `let`" besides for cases when we want pre-ES6 hoisting which I think should be generally avoided in order to make code less error-prone and easier to understand. This behavior would have been nearly-impossible to know about without the knowledge gained from this conversation (or from reading the spec in depth which can be difficult).</div><span class="m_5367418973091929880m_-5039121824126437496HOEnZb"><font color="#888888"><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)"><br></div></font></span></div><div class="gmail_extra"><span class="m_5367418973091929880m_-5039121824126437496HOEnZb"><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="m_5367418973091929880m_-5039121824126437496h5">
<br><div class="gmail_quote">On Tue, Aug 16, 2016 at 10:48 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"><span>> <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></span><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><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">> </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></span><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><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><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><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><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><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><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><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><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><font color="#888888"><br></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></font></span><div><div>
<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>
</div></div></blockquote></div><br></div></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div></div></div>
</blockquote></div><br></div>