<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1256">
<meta name="Generator" content="Microsoft Exchange Server">
<!-- converted from text --><style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>
</head>
<body>
<div>
<div>
<div style="font-family:Calibri,sans-serif; font-size:11pt">This might be a good time to bring up this old thing:<br>
<br>
https://gist.github.com/domenic/1ab3f0daa7b37859ce43<br>
<br>
At the time Yehuda and I put it together, we were much younger and more naive, but upon cursory review it seems not-horrible. It gives up mutable bindings but retains statically-verifiable multi-exports, along with a unified import syntax that doesn't require
 knowledge of how the module creator exported their objects, and exposes no refactoring hazards for transitioning between styles.<br>
<br>
I just realize it is probably not very compatible with computed property names though :(</div>
</div>
<div dir="ltr">
<hr>
<span style="font-family:Calibri,sans-serif; font-size:11pt; font-weight:bold">From:
</span><span style="font-family:Calibri,sans-serif; font-size:11pt"><a href="mailto:rossberg@google.com">Andreas Rossberg</a></span><br>
<span style="font-family:Calibri,sans-serif; font-size:11pt; font-weight:bold">Sent:
</span><span style="font-family:Calibri,sans-serif; font-size:11pt">2014-06-27 09:07</span><br>
<span style="font-family:Calibri,sans-serif; font-size:11pt; font-weight:bold">To:
</span><span style="font-family:Calibri,sans-serif; font-size:11pt"><a href="mailto:dherman@mozilla.com">David Herman</a></span><br>
<span style="font-family:Calibri,sans-serif; font-size:11pt; font-weight:bold">Cc:
</span><span style="font-family:Calibri,sans-serif; font-size:11pt"><a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a></span><br>
<span style="font-family:Calibri,sans-serif; font-size:11pt; font-weight:bold">Subject:
</span><span style="font-family:Calibri,sans-serif; font-size:11pt">Re: ModuleImport</span><br>
<br>
</div>
</div>
<font size="2"><span style="font-size:10pt;">
<div class="PlainText">Some observations:<br>
<br>
* I think the 'import * as x' syntax for module imports is not an<br>
improvement, for at least two reasons:<br>
<br>
  - It raises the expectation that you can actually write 'import *<br>
from' (as already noted in this thread).<br>
<br>
  - It removes the syntactic marker for binding a module identifier.<br>
That is problematic because (a) module identifiers come with extra<br>
static checks on their uses (or so I thought, see below), and it is<br>
(b) future hostile to lexical module declarations, because with those,<br>
only module identifiers could be used in certain contexts (e.g., on<br>
the RHS of an import-from). Thinking forward, I think it would be<br>
highly preferable to consistently mark all bindings of module<br>
identifiers with a 'module' keyword.<br>
<br>
* I think the controversy is because the module design tries pleasing<br>
two incompatible community goals, but instead of achieving that, it<br>
has acquired all the characteristics of a committee design (although,<br>
ironically, modules are probably the least committee-designed part of<br>
ES6 :) ):<br>
<br>
  - Some want modules in the conventional sense, as encapsulated<br>
namespaces with named exports, which you can import and access<br>
qualified or unqualified, and where imports are checked.<br>
<br>
  - Some want modules in the specific pre-ES6 JavaScript style, where<br>
they can be any arbitrary JS value, and in the good old JavaScript<br>
tradition that checking doesn't matter.<br>
<br>
The current design (including the newest suggestions for imports)<br>
seems to please neither side, because it tries to be the former<br>
semantically, but wants to optimise for the latter syntactically. The<br>
main outcome is confusion.<br>
<br>
* This is probably the 3rd or even 4th time round this aspect of<br>
modules is discussed controversially. That is not a good sign. I<br>
_really_ think we need to make up our minds:<br>
<br>
  - Either we think "real" modules are an improvement, and checking is<br>
important. Then the model and the syntax should be consistent about<br>
that. Moreover, checking needs to consistently apply, no matter how a<br>
module and its components are defined or accessed.<br>
<br>
  - Or we come to the conclusion that supporting the legacy singleton<br>
export model as a primary use case is a mandatory matter. Then we<br>
should drop attempts of building something in/semi-compatible, and<br>
limit innovation to making export and import declarative, and<br>
designing a loader API.<br>
<br>
The current design falls between stools with respect to syntax,<br>
leading to the confusion people complain about. And it falls between<br>
stools with respect to import checking, making it dependent on<br>
superficially syntactic choices (like, whether you use default export<br>
or not, or whether you use unqualified import or not), and thereby<br>
unreliable in practice.<br>
<br>
Quite honestly, I rather have no import checking than checking that<br>
only applies in some syntactic cases -- because that gives a false<br>
sense of security, harms refactoring, and/or encourages overuse of<br>
unqualified imports, hampering readability. And if we are willing to<br>
cut partial checking, then there actually is much less compelling<br>
reason to have all the machinery around module objects, import as<br>
aliasing, etc. The system could probably be simplified quite a bit,<br>
and get much closer to what proponents of legacy JS modules are used<br>
to.<br>
<br>
Of course, I'd much rather go with "real" modules. But more<br>
importantly, the system should make a choice. Something in the middle<br>
is looking more and more like the least attractive alternative -- it<br>
seems like substantial extra complexity for too little (or even<br>
negative) benefit. As surprising as it may sound to some, I'm starting<br>
to warm up to the legacy option if it avoids the floor between the<br>
stools. :)<br>
<br>
/Andreas<br>
<br>
<br>
On 19 June 2014 10:15, David Herman <dherman@mozilla.com> wrote:<br>
> Thanks to everyone for working through the issues around ModuleImport. I know it's been frustrating, but the discussions have really helped clarify the key constraints.<br>
><br>
> ## Constraints<br>
><br>
> First, let me restate the most important arguments. In favor of removal:<br>
><br>
> * **The syntactic distinction between ModuleImport and default import is vague.**<br>
><br>
> We've consistently seen confusion between the semantics of ModuleImport and default export. While certainly some of the confusion might be chalked up to misinformation and lack of documentation, we've seen people be confused by this even when correctly explained
 the semantics. The problem with the syntax is that the only visual distinction is the initial keyword (`module` vs `import`), and it's not clear from that keyword which concept you're talking about. (Once you've internalized the structure of module instance
 objects, you get a hint from the `module` keyword, but that doesn't help people who are just learning the system, particularly if they're already familiar with other JS module systems.)<br>
><br>
> Against removal:<br>
><br>
> * **Without ModuleImport, authors of multi-export modules would be pressured to circumvent the named exports functionality.**<br>
><br>
> Without ModuleImport, clients of multi-export modules have two options. Either they use named import:<br>
> ```js<br>
> import { readFile, writeFile } from "fs";<br>
> ```<br>
> or if they want to explicitly namespace those functions, they have to use the dynamic API:<br>
> ```js<br>
> import "fs"; // state the dependency<br>
> var fs = this.get("fs");<br>
> ```<br>
> That's inconvenient, confusing, and makes you feel like you're stepping outside the normal usage patterns intended for the system. Since this is a choice forced on the clients of a module, the module author will feel pressure to circumvent the named export
 feature altogether and instead export a default object with all the properties. This is bad -- it creates pressure for people to abandon part of the module system.<br>
><br>
> ## Conclusion<br>
><br>
> Here's the conclusion I've come to based on all of the above.<br>
><br>
> * **We need a form like ModuleImport.**<br>
><br>
> As many have said, clients of named-export modules need the freedom to choose whether to explicitly namespace those imports, and they need a syntax that doesn't feel like they've stepped outside the normal system.<br>
><br>
> * **The current syntax of ModuleImport is wrong.**<br>
><br>
> The confusion reported in developer feedback is real, and it's important.<br>
><br>
> * **The syntax should still favor default import.**<br>
><br>
> ES6 favors the single/default export style, and gives the sweetest syntax to importing the default. Importing named exports can and even should be slightly less concise.<br>
><br>
> * **A better ModuleImport syntax is possible, and we should settle it soon.**<br>
><br>
> I'll propose a better ModuleImport syntax below. Syntax being syntax, everyone will of course unsheathe their bikeshed paintbrush. That's OK. The champions will keep it from going on unbounded and help settle the debate, and we'll make sure to capture the
 conclusion in the next TC39 meeting.<br>
><br>
> I do acknowledge the concerns about reopening topics for debate and delay. But given the usability feedback, I think this case is worth fixing. We should resolve it for ES6, perhaps in part because it's less editorial work to change the ModuleImport production
 than to defer it, but more because I don't want to delay the resolution so that implementations can ship the better syntax. But keep in mind it doesn't matter what spec it lands in as long as implementations are shipping it. We're still in the early days of
 transpiler implementations, and there are no native implementations of modules yet. So there's time, as long as we don't let the bikeshed go on forever. So let's get to it!<br>
><br>
> ## Proposal<br>
><br>
> OK, so we're talking about a better syntax for importing a module and binding its named exports to a variable (as distinct from importing a module and binding its default export to a variable). Here's my proposal:<br>
> ```js<br>
> import * as fs from "fs"; // importing the named exports as an object<br>
> import Dict from "dict";  // importing a default export, same as ever<br>
> ```<br>
><br>
> Why is this better? Because it dovetails with the named export syntax, **which makes it clear that it's binding `fs` to the named exports.** It saves the reader from having to know that the module instance object is not the same thing as the default export.<br>
><br>
> So there you have it... Feedback welcome, and as always we'll collect it all, weigh it, and try to shepherd consensus.<br>
><br>
> Oh, and just to put parameters on the discussion:<br>
><br>
> * **I'm not proposing additional new import forms.**<br>
><br>
> If this syntax is future-compatible with other possible syntactic forms, that's great, but that's not what we're discussing.<br>
><br>
> * **I'm not interested in discussing changes to the rest of the module syntax.**<br>
><br>
> This isn't the time or place to redesign the whole system.<br>
><br>
> * **The `this` binding in modules is a separate topic.**<br>
><br>
> The `this` binding in modules can be discussed independently of this topic.<br>
><br>
> tl;dr we're only talking about the ModuleImport syntax here.<br>
><br>
> Dave<br>
><br>
> _______________________________________________<br>
> es-discuss mailing list<br>
> es-discuss@mozilla.org<br>
> <a href="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a><br>
_______________________________________________<br>
es-discuss mailing list<br>
es-discuss@mozilla.org<br>
<a href="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</div>
</span></font>
</body>
</html>