<div dir="ltr">One option is to utilize ```shortName``` <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Import_an_export_with_a_more_convenient_alias">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Import_an_export_with_a_more_convenient_alias</a><div><br></div><div>```</div><div>import {foo as foo1} from "./aa.js";<br>let bar1 = { baz: foo1 };<br>export { bar1 };<br><br>import {foo as foo2} from "./bb.js";<br>const bar2 = { baz: foo2 };<br>export { bar2 };<br></div><div>```</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Jun 2, 2019 at 11:05 PM kai zhu <<a href="mailto:kaizhu256@gmail.com">kaizhu256@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">not inline multiple ```export```'s, but inline multiple module-scopes.<div><br></div><div>```js</div><div><font face="courier new, monospace">/*</font></div><div><font face="courier new, monospace"> * how do you inline the two es-modules below</font></div><div><font face="courier new, monospace"> * with colliding `foo` and `bar` variables?</font></div><div><font face="courier new, monospace"> *</font></div><div><font face="courier new, monospace"> * you can't unless you introduce new language-syntax</font></div><div><font face="courier new, monospace"> * to somehow delimit their scopes</font></div><div><span style="font-family:"courier new",monospace"> */</span><br></div><div><font face="courier new, monospace"><br></font></div><div><div><font face="courier new, monospace" color="#ff0000">// [hypothethical] es-module-scope delimiter</font></div><div><font face="courier new, monospace" color="#ff0000"># es-module-scope "./inline.js"</font></div><div><br class="gmail-m_8422695905518324857gmail-Apple-interchange-newline"></div></div><div><font face="courier new, monospace">// module ./inline.js</font></div><div><font face="courier new, monospace">import { foo } from "./aa.js"</font></div><div><font face="courier new, monospace">const bar = { baz: foo };</font></div><div><font face="courier new, monospace">export { bar };</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace" color="#ff0000">// [hypothethical] es-module-scope delimiter</font></div><div><font face="courier new, monospace" color="#ff0000"># es-module-scope ./nextinline.js</font></div><div><div><span style="font-family:"courier new",monospace"><br></span></div><div><span style="font-family:"courier new",monospace">// module ./nextinline.js</span></div><div><span style="font-family:"courier new",monospace">import { foo } from "./bb.js"</span><br></div><div><font face="courier new, monospace">const bar = { baz: foo };  <br></font></div><div><font face="courier new, monospace">export { bar };</font></div></div><div>```</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Jun 2, 2019 at 2:54 PM guest271314 <<a href="mailto:guest271314@gmail.com" target="_blank">guest271314@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Multiple imports are already possible<div><br></div><div>```</div><div>import {inline} from "./inline.js";<br>import {nextInline} from "./nextInline.js";<br><br>const o = {<br>  a:1, b:2, c:3<br>};</div><div><br></div><div>// ...<br><br>export {o, cities, video, inline, nextInline};<br></div><div>```</div><div><br></div><div>Are you proposing multiple ```export```s?</div><div><br></div><div>```</div><div>export {o, cities, video, inline, nextInline};</div><div>o.c = 7;</div><div>export {o};</div><div>```<br><div><br></div><div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Jun 2, 2019 at 6:19 PM kai zhu <<a href="mailto:kaizhu256@gmail.com" target="_blank">kaizhu256@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><a class="gmail_plusreply" id="gmail-m_8422695905518324857gmail-m_-5093029824776128972gmail-m_-7736715016527397349plusReplyChip-0" href="mailto:guest271314@gmail.com" target="_blank">@guest271314</a>, your example again is not a [native] bundle of two or more inlined es-modules.  its just a single es-module that that fetches json data.<div><br></div><div>i'm asking if its desirable to inline multiple es-modules into a single file natively, e.g.:<br><div><br></div><div><div>```</div><div><font face="courier new, monospace">/*</font></div><div><font face="courier new, monospace"> * es-module.rollup.js</font></div><div><font face="courier new, monospace"> * this [hypothetical] rollup-file contains multiple inlined es-modules</font></div><div><font face="courier new, monospace"> * to improve load-performance in production-deployment.</font></div><div><span style="font-family:"courier new",monospace"> */</span><br></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><font color="#ff0000">// 1. inlined es-module ./main.js</font><br></font></div><div><font face="courier new, monospace">import { foo } from "./counter.js"</font></div><div><font face="courier new, monospace">import { bar } from "./display.js"</font></div><div><font face="courier new, monospace">foo(bar);</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace" color="#ff0000">// 2. inlined es-module ./counter.js</font></div><div><font face="courier new, monospace">var foo;</font></div><div><font face="courier new, monospace">foo = function (bar) {</font></div><div><font face="courier new, monospace">    bar();</font></div><div><font face="courier new, monospace">};</font></div></div></div><div><font face="courier new, monospace">export { foo }</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace" color="#ff0000">// 3. inlined es-module ./display.js</font></div><div><font face="courier new, monospace">var bar;</font></div><div><font face="courier new, monospace">bar = function () {</font></div><div><font face="courier new, monospace">    console.log("hello world");</font></div><div><font face="courier new, monospace">};</font></div><div><font face="courier new, monospace">export { bar }</font></div><div>```</div><div><br></div><div>this native es-module inline-capability may not be desirable to you, which is fine.  it would be a datapoint against this feature (and rely instead on pre-emptive import-maps and http2-push, as explained by @frederick and @isiah).</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Jun 2, 2019 at 11:22 AM guest271314 <<a href="mailto:guest271314@gmail.com" target="_blank">guest271314@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">1) original-question - is native es-module's async-behavior desirable?  async side-effects are difficult to manage -- i conjecture that async-loading 20 es-modules (with dependent side-effects) is not practical for most mortals to handle.</blockquote><div><br></div><div>It depends on what <i>you </i>mean by "desirable" in a given context. </div><div><br></div><div>There is no difference from loading 1 module and loading 1000 modules except for network cost, memory and disk space usage. </div><div><br></div><div>Mortals can handle far more than loading 20 es-modules. </div><div><br></div><div>What are the specific  "side-effects" that you are referring to?</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">describes the mechanism for how to hint the brower to pre-fetch 20 es-modules. but if you pre-fetch, then is loading-behavior effectively synchronous?</blockquote><div><br></div><div>Resources can be "pre-fetched" using various means. From caching the first request and using the cached data instead of making future requests for the same resources to storing one or more entire directories in the browser configuration folder using `requestFileSystem` (Chromiom/Chrome).</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">but was unclear whether they were individual [async] <font face="courier new, monospace">```<script type="module">```</font> tags, or some es5-transpiled rollup</blockquote><div><br></div><div>There should not be any difference between the two approaches. If there is a difference then you should be able to clearly state what the difference is, and demonstrate the difference by reproduction, without speculating and not demonstrating a difference by means of reproduction.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">2) the second-question about es-module rollups (which you and i are debating) stemmed from @isiah's response -- if he and everyone-else use es5-transpiled rollups (which i suspect), </blockquote><div><br></div><div>Do not care what "everyone-else" is supposedly doing. How can you possibly know what everyone-else is doing and even if you did know what third-parties are doing how does that affect what you are doing?</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">then shouldn't it be desirable for es-modules to natively support rollups as well?  currently, there's no way to natively rollup multiple es-modules into a single bundle.</blockquote><div><br></div><div>There are ways to "bundle" multiple modules into a single export "natively", as demonstrated at the previously posted code.</div><div><br></div><div>Another example approach</div><div><br></div><div>```</div><div>// sync</div><div>const o = {<br>  a:1, b:2, c:3<br>};<br>// async<br>const cities = fetch("<a href="https://gist.githubusercontent.com/guest271314/ffac94353ab16f42160e/raw/aaee70a3e351f6c7bc00178eabb5970a02df87e9/states.json" target="_blank">https://gist.githubusercontent.com/guest271314/ffac94353ab16f42160e/raw/aaee70a3e351f6c7bc00178eabb5970a02df87e9/states.json</a>")<br>               .then(response => response.json())<br>               .catch(e => {console.error(e); return "error fetching cities module"});<br>// async            <br>const video = fetch("<a href="https://upload.wikimedia.org/wikipedia/commons/d/d9/120-cell.ogv" target="_blank">https://upload.wikimedia.org/wikipedia/commons/d/d9/120-cell.ogv</a>")<br>               .then(response => response.blob())<br>              .catch(e => {console.error(e); return "error fetching video module"});<br>// multiple "modules" exported<br>export {o, cities, video};<br></div><div>```</div><div><br></div><div>at single ```<script type="module">```</div><div><br></div><div>```</div><div>    <script type="module"><br>      import * as o from "./script.js";<br>      (async(mods) => {<br>        for (const [key, value] of mods) {<br>          if (value instanceof Promise) {<br>            console.log("async module", key, await value)<br>          } else {<br>            console.log("sync module", key, value);<br>          }<br>        }<br>      })(Object.entries(o));<br>    </script><br></div><div>```</div><div><br></div><div>Still there is no actual problem statement. Rather, there is conjecture without a definitive issue to solve. </div><div> </div><div><br></div><div> </div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Jun 2, 2019 at 3:54 AM kai zhu <<a href="mailto:kaizhu256@gmail.com" target="_blank">kaizhu256@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">i apologize for poor framing of my questions.  they are still formative, but i can clarify abit as follows:<div><br></div><div>1) original-question - is native es-module's async-behavior desirable?  async side-effects are difficult to manage -- i conjecture that async-loading 20 es-modules (with dependent side-effects) is not practical for most mortals to handle.</div><div>@frederick describes the mechanism for how to hint the brower to pre-fetch 20 es-modules. but if you pre-fetch, then is loading-behavior effectively synchronous?<br></div><div>@isiah says he has experience loading 50-100 modules, but was unclear whether they were individual [async] <font face="courier new, monospace">```<script type="module">```</font> tags, or some es5-transpiled rollup.<br></div><div><br></div><div>i may be wrong about everything, as i'm a bit ignorant on what async actually means in es-modules (and appreciate it, if someone can clarify that).</div><div><br></div><div><br></div><div><br></div><div>2) the second-question about es-module rollups (which you and i are debating) stemmed from @isiah's response -- if he and everyone-else use es5-transpiled rollups (which i suspect), then shouldn't it be desirable for es-modules to natively support rollups as well?  currently, there's no way to natively rollup multiple es-modules into a single bundle.</div><div><br></div><div>this 2nd question also has implications about es-module's async-behavior (because rollups "load" modules in sync/blocking fashion).  this could change side-effect behaviors between development-mode (20 [async] <font face="courier new, monospace">```<script type="module">```</font> tags) and production-mode (1 rollup-bundle).  again, i may be wrong about that, as i'm ignorant about what async actually is in es-modules.</div><div><br></div><div>-kai</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Jun 1, 2019 at 9:22 PM guest271314 <<a href="mailto:guest271314@gmail.com" target="_blank">guest271314@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">> it doesn't actually <font face="courier new, monospace">```import```</font> 1000+ es-modules inside the rollup-file. it just creates one es-module that exports a dictionary -- and assigns the dictionary 1000+ vanilla json-objects and functions.<div><br></div><div>The code provides a means to fetch N resources and export those resources within a single object.</div><div><br></div><div>> currently, as i'm aware, nobody uses native es-modules in production, because it cannot be rolled-up.</div><div>> in practice es-modules are [babel] transpiled down to es5-amd (or similar) for rollup-purposes.</div><div>></div><div>> if we're actually committed to native es-modules, then we either</div><div>> 1) need to depend on embedders like <a href="mailto:loading-dev@chromium.org" target="_blank">loading-dev@chromium.org</a> to create sophisticated cache-systems, or</div><div>> 2) introduce new language-syntax to delimit es-modules for rollup-purposes, e.g.</div><div><span style="color:rgb(255,0,0);font-family:"courier new",monospace"><br></span></div>You still have not clearly defined what you mean by "rolled-up". That language appears to be a random nickname, not any immutable principle that individuals are bound to recognize or observe (even if "rolled-up" were some form of a coding style or standard).<br><br>Nor is it clear what you mean by "production". <div><br></div><div>There is no external central committee that stamps code as "production". Even if there were no individual is obliged to submit to such a procedure nor have any concern for such an arbitrary and irrelevant presumptive review of code. </div><div><br></div><div>The only observable points are input and output. In general, how output is achieved is immaterial. If there are specific restrictions as to how the output can be achieved then those restrictions need to be clearly defined. </div><div><br></div><div><br></div><div><br></div><div>The original post asked "how many async-modules can js-app practically load?" and mentioned "<span style="color:rgb(51,51,51);font-family:Georgia,"Times New Roman",Times,serif;font-size:16px">circular-references</span>" (the thread appears to mainly be about one or more coding styles, not code itself) though as yet no code has been posted which demonstrates "circular-references" or any other coding problem.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Jun 2, 2019 at 1:30 AM kai zhu <<a href="mailto:kaizhu256@gmail.com" target="_blank">kaizhu256@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">i played around with your code in jsfiddle [1], and understand it a little more.<div>it doesn't actually <font face="courier new, monospace">```import```</font> 1000+ es-modules inside the rollup-file.</div><div>it just creates one es-module that exports a dictionary</div><div> -- and assigns the dictionary 1000+ vanilla json-objects and functions.</div><div><div><br></div><div><font face="courier new, monospace">```js<br></font></div><div><font face="courier new, monospace">// the "rollup-file" is a single es-module</font></div><div><font face="courier new, monospace">// that exports 1000+ vanilla dictionary-entries</font></div><div><span style="font-family:"courier new",monospace">const modules = {};</span><br></div><div><span style="font-family:"courier new",monospace"><font color="#ff0000"><br></font></span></div><div><span style="font-family:"courier new",monospace"><font color="#ff0000">// this is not a es-module, nor is it rolled-up (external fetch)</font></span><br></div><div><font face="courier new, monospace">modules.image = <await fetch json from <a href="http://gist.github.com" target="_blank">gist.github.com</a>></font></div><div><span style="font-family:"courier new",monospace"><font color="#ff0000"><br></font></span></div><div><span style="font-family:"courier new",monospace"><font color="#ff0000">// this is not a [rolled-up] es-module</font></span><br></div><div><span style="font-family:"courier new",monospace">modules.fn = function () {...}</span></div><div><span style="font-family:"courier new",monospace"><font color="#ff0000"><br></font></span></div><div><span style="font-family:"courier new",monospace"><font color="#ff0000">// these are not [rolled-up] es-modules</font></span><br></div><div><span style="font-family:"courier new",monospace">Object.assign(modules, <1000 json-entries>)</span></div><div><br></div><div><font face="courier new, monospace">export {modules}</font></div><div><font face="courier new, monospace">```</font><div><br></div><div>currently, as i'm aware, nobody uses native es-modules in production, because it cannot be rolled-up.</div><div>in practice es-modules are [babel] transpiled down to es5-amd (or similar) for rollup-purposes.</div><div><br></div><div>if we're actually committed to native es-modules, then we either</div><div>1) need to depend on embedders like <a href="mailto:loading-dev@chromium.org" target="_blank">loading-dev@chromium.org</a> to create sophisticated cache-systems, or</div><div>2) introduce new language-syntax to delimit es-modules for rollup-purposes, e.g.</div><div><br></div><div>```js</div><div>// rollup.js with [hypothetical] # delimited es-modules</div><div># module aa</div><div>import {bb} as bb;</div><div>export ...;</div><div><br></div><div># module bb</div><div>export ...;</div><div>```</div><div><br></div><div>i'm generally skeptical of option 1, given how poorly <a href="http://npmjs.com" target="_blank">npmjs.com</a> has handled similar problems deduplicating children in node_modules/ directory.</div><div><br></div><div>[1] jsfiddle pseudo-module rollup</div><div><a href="https://jsfiddle.net/06twrLfd/" target="_blank">https://jsfiddle.net/06twrLfd/</a> <br></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Jun 1, 2019 at 5:30 PM guest271314 <<a href="mailto:guest271314@gmail.com" target="_blank">guest271314@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">> your rollup solution is interesting, <div><br></div><div>What  is "rollup" referring to? </div><div><br></div><div>> but i get an error when run in chrome (i changed to n=20 to prevent name-collision, but it still happens).  </div><div><br></div><div>The duplicate ("collision") entry an ```try..catch``` block is included in the code to demonstrate given an array of module names to be exported and imported as identifiers 1) duplicate entries can be filtered; 2) if a plain object is exported duplicate identifiers ("collision") is not possible as a JavaScript plain object does not have duplicate property names ("collision"); if there is an issue with identifiers in a module the cause would not be the number of async-modules loaded ("how many"), but the naming of the identifiers within the code, using or not using ```const``` or ```let```. Still not sure what the actual issue is?</div><div><br></div><div>> don't completely understand how it works, </div><div><br></div><div>Use an ```async``` function to fetch data, check for the described "collision" , create a ```data URI``` to be imported, optionally, append addition code to be executed within the ```<script type="module">```.</div><div><br></div><div>> but not sure of suitability for production-use, because of its dynamic <script> tag generation.<br></div><div><br></div><div>What is the issue with dynamic ```<script>``` tag generation? </div><div><br></div><div>There is more than one possible approach to achieve the presumptive requirement, that is still not clear to the exclusion of what is not the expected result.<br></div><div><br></div><div>There were no restrictions described at the OP and following messages other than other than </div><div><br></div><div>> <span style="color:rgb(51,51,51);font-family:Georgia,"Times New Roman",Times,serif;font-size:16px">pure-es6 application with 20 es-modules rolled-up into one [production] bundle?</span></div><div><span style="color:rgb(51,51,51);font-family:Georgia,"Times New Roman",Times,serif;font-size:16px"><br></span></div>The example code uses only JavaScript implementation shipped with the browser without any external, third-party libraries.<div>  <div>What standard or definition are you relying for the meaning of the term "production-use"? What procedure are you using to determine if code is "production-use" "suitable"? How is that procedure related to "how many async-modules can js-app practically load?"?</div><div><br></div><div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Jun 1, 2019 at 9:42 PM kai zhu <<a href="mailto:kaizhu256@gmail.com" target="_blank">kaizhu256@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">your rollup solution is interesting, but i get an error when run in chrome (i changed to n=20 to prevent name-collision, but it still happens).  don't completely understand how it works, but not sure of suitability for production-use, because of its dynamic <script> tag generation.<div><br></div><div><font face="courier new, monospace">```console</font></div><div><font face="courier new, monospace">ReferenceError: module names ["yeqjqb02mvg3yze26rc5"] are not unique<br>    at data:application/javascript,%0A%20%20%20%20%20%20const%20modules...<br></font></div><div><font face="courier new, monospace">```</font></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Jun 1, 2019 at 2:33 PM guest271314 <<a href="mailto:guest271314@gmail.com" target="_blank">guest271314@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Re: how many async-modules can js-app practically load?<div><br></div><div>An example of exporting and importing loading 1000 properties in a single module, where duplicate property names are checked for. Since JavaScript plain objects cannot have duplicate property names there should not be any "collisions"; the code can check for and modify the object to be exported, though the last duplicate property name will be exported without any errors thrown unless the code is composed to throw such an error.</div><div><br></div><div>```</div><div>  (async() => {<br>    const oneThousandModules = encodeURIComponent(<br>      // substitute rand for a Set of module names to be exported<br>      // e.g. const moduleNames = ['moduleA', 'moduleB', ...moduleZ]<br>      `<br>      const modules = {};<br>      // set a function to be exported<br>      modules.fn = function() {return 'a function'};<br>      // function to set (1000) 'random' module names to be exported<br>      const rand = (seed = 'abcdefghijklmnopqrstuvwxyz0123456789', n = 5, len = seed.length) => <br>        '.'.repeat(n).replace(/./g, _ => seed[~~(Math.random() * len)]);<br>        // use Set for unique module identifiers<br>        const moduleNames = [...Array(1000)].map(_ => rand());<br>        const moduleIdentifiers = new Set(moduleNames); <br>        // below line will cause ReferenceError to be thrown<br>        moduleNames.push(moduleNames[0]);<br>        try {<br>          if (moduleIdentifiers.size !== moduleNames.length) {<br>            // check for duplicates<br>            const duplicates = moduleNames.filter((moduleName, index) => moduleNames.indexOf(moduleName) !== index);<br>            // notification of duplicate module names<br>            throw new ReferenceError('module names ' + JSON.stringify(duplicates) + ' are not unique');<br>            // perform the designated task if duplicate module names are found here<br>          }<br>        } catch (e) {<br>          console.error(e);<br>          console.trace();<br>        }<br>        // get, set (sync or async) exported module here <br>        Object.assign(modules, ...[...moduleIdentifiers].map((id, value) => ({[id]:value})));<br>        // since JavaScript plain object cannot have duplicate property names <br>        // modules object will still be exported without duplicate property names<br>        // without collisions<br>        export {modules}<br>    `);<br>    const scriptText = `import {modules} from "data:application/javascript,${oneThousandModules};${encodeURIComponent('console.log(modules);for (const key in modules) {if (typeof modules[key] === \'function\') {console.log(modules[key]());}}')}"`;<br>    const script = document.createElement("script");<br>    script.type = "module";<br>    script.textContent = scriptText;<br>    document.head.appendChild(script);<br>  })();<br></div><div>```</div><div><br></div><div>plnkr <a href="https://plnkr.co/edit/CgEhBY?p=preview" target="_blank">https://plnkr.co/edit/CgEhBY?p=preview</a></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Jun 1, 2019 at 1:51 AM kai zhu <<a href="mailto:kaizhu256@gmail.com" target="_blank">kaizhu256@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><span style="color:rgb(51,51,51);font-family:Georgia,"Times New Roman",Times,serif;font-size:16px">> Place all of the code to be exported in 1 file? </span> <br></div><div> <br></div><div>that obviously will not work, because of module-scope collision.  can anyone share their experience on deploying a [babel-free] pure-es6 application with 20 es-modules rolled-up into one [production] bundle?  is it even possible?</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, May 31, 2019 at 7:55 PM guest271314 <<a href="mailto:guest271314@gmail.com" target="_blank">guest271314@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">> <span style="color:rgb(51,51,51);font-family:Georgia,"Times New Roman",Times,serif;font-size:16px">how would i transition from development-mode (20 es-module files) -> production-mode (1 rollup </span><span style="color:rgb(51,51,51);font-family:Georgia,"Times New Roman",Times,serif;font-size:16px">file)?<br><br>Place all of the code to be exported in 1 file? </span><div><span style="color:rgb(51,51,51);font-family:Georgia,"Times New Roman",Times,serif;font-size:16px"><br></span></div><div><span style="color:rgb(51,51,51);font-family:Georgia,"Times New Roman",Times,serif;font-size:16px">> </span><span style="color:rgb(51,51,51);font-family:Georgia,"Times New Roman",Times,serif;font-size:16px">with some of them having circular-references</span></div><div><span style="color:rgb(51,51,51);font-family:Georgia,"Times New Roman",Times,serif;font-size:16px"><br></span></div><div><span style="color:rgb(51,51,51);font-family:Georgia,"Times New Roman",Times,serif;font-size:16px">Not certain how that is possible when using ```import``` within ```<script type="module">```?</span></div><div><span style="color:rgb(51,51,51);font-family:Georgia,"Times New Roman",Times,serif;font-size:16px"><br></span></div><div><span style="color:rgb(51,51,51);font-family:Georgia,"Times New Roman",Times,serif;font-size:16px">> </span>how many async-modules can js-app practically load?</div><div><br></div><div>Again, how many have you tried to load? 100? 500? 1000? Either should be possible.</div><div><br><font color="#333333" face="Georgia, Times New Roman, Times, serif"><span style="font-size:16px">What specific issue are you actually to resolve?</span></font></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, May 31, 2019 at 5:40 PM kai zhu <<a href="mailto:kaizhu256@gmail.com" target="_blank">kaizhu256@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">> Oh, and yes, I've loaded upwards of 50-100 modules in development. 20</div>modules is *easy* to achieve in single-page apps.<br><div dir="ltr"><br></div><div>was that with some combination of babel/rollup/webpack or pure-es6?</div><div>if i want to develop a pure-es6 webapp (no babel), how would i transition from development-mode (20 es-module files) -> production-mode (1 rollup file)?</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, May 31, 2019 at 10:47 AM Isiah Meadows <<a href="mailto:isiahmeadows@gmail.com" target="_blank">isiahmeadows@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">If it's bundled by Rollup or Webpack into a single bundle, it's<br>
equivalent to a single `<script type="module" src="...">` pointing<br>
towards the original entry point, excluding network requests.* But in<br>
either case, you aren't listing 50 scripts, you're only listing the<br>
entry module and importing child modules within parent modules. Rollup<br>
and Webpack do mostly the same thing browsers do when it comes to<br>
resolving dependencies, just they generate a bundle afterwards where<br>
browsers execute code afterwards. Also, it's worth noting that the gap<br>
between a single large request and multiple smaller requests has<br>
shrunk a lot since HTTP/2 came along, since it's binary, it allows<br>
requests and response data to be interleaved, it better leverages the<br>
underlying TCP protocol format, and it allows servers to send data<br>
pre-emptively without the client requesting it first. (Web sockets are<br>
built on this functionality.) It's still better to bundle in general,<br>
but it's less of a problem not to.<br>
<br>
This is *not* the case for `<script type="module">` elements - those<br>
operate more like inline scripts that happen to have the ability to<br>
`import`.<br>
<br>
Oh, and yes, I've loaded upwards of 50-100 modules in development. 20<br>
modules is *easy* to achieve in single-page apps.<br>
<br>
* This is, of course, not the case if you are using pure ES6 and you<br>
aren't using any plugins to, say, run the original source through<br>
Babel for React + JSX or something.<br>
<br>
-----<br>
<br>
Isiah Meadows<br>
<a href="mailto:contact@isiahmeadows.com" target="_blank">contact@isiahmeadows.com</a><br>
<a href="http://www.isiahmeadows.com" rel="noreferrer" target="_blank">www.isiahmeadows.com</a><br>
On Sat, May 25, 2019 at 2:12 AM kai zhu <<a href="mailto:kaizhu256@gmail.com" target="_blank">kaizhu256@gmail.com</a>> wrote:<br>
><br>
> Asynchronous loading differs only in<br>
> that it takes more code to express the same logic and you have to take<br>
> into account concurrent requests (and you need to cache the request,<br>
> not the result), but it's otherwise the same from 1km away.<br>
><br>
><br>
> so async-loading 50 ```<script type="module">``` tags<br>
> has equivalent side-effect<br>
> as sync-loading single webpack-rollup (of same 50 modules)?<br>
><br>
> i have nagging suspicion of doubts.  has anyone tried native async-loading large numbers (>10) of<br>
> ```<script type="module">``` tags, and verify it resolves identically to using a single webpack-rollup?<br>
><br>
> again, i'm not that knowledgeable on es-modules, so above question may be trivially true, and i'm just not aware.<br>
><br>
> -kai<br>
><br>
> On 24 May 2019, at 23:41, Isiah Meadows <<a href="mailto:isiahmeadows@gmail.com" target="_blank">isiahmeadows@gmail.com</a>> wrote:<br>
><br>
> There's two main reasons why it scales:<br>
><br>
> 1. Modules are strongly encapsulated while minimizing global pollution.<br>
> 2. The resolution algorithm applies the same logic no matter how many<br>
> modules are loaded.<br>
><br>
> It's much easier for it to scale when you write the code unaware of<br>
> how many modules you might be loading and unaware of how deep their<br>
> dependency graph is. Fewer assumptions here is key. It's an<br>
> engineering problem, but a relatively simple one.<br>
><br>
> If you want a short example of how sync module resolution works, you<br>
> can take a look at this little utility I wrote:<br>
> <a href="https://github.com/isiahmeadows/simple-require-loader" rel="noreferrer" target="_blank">https://github.com/isiahmeadows/simple-require-loader</a>. That doesn't<br>
> asynchronously resolve modules, but it should help explain the process<br>
> from a synchronous standpoint. Asynchronous loading differs only in<br>
> that it takes more code to express the same logic and you have to take<br>
> into account concurrent requests (and you need to cache the request,<br>
> not the result), but it's otherwise the same from 1km away.<br>
><br>
> -----<br>
><br>
> Isiah Meadows<br>
> <a href="mailto:contact@isiahmeadows.com" target="_blank">contact@isiahmeadows.com</a><br>
> <a href="http://www.isiahmeadows.com" rel="noreferrer" target="_blank">www.isiahmeadows.com</a><br>
><br>
> On Thu, May 23, 2019 at 10:49 AM kai zhu <<a href="mailto:kaizhu256@gmail.com" target="_blank">kaizhu256@gmail.com</a>> wrote:<br>
><br>
><br>
> actually, i admit i don't know what i'm talking about.  just generally confused (through ignorance) on how large-scale es-module dependencies resolve when loaded/imported asynchronously.<br>
><br>
> On Wed, May 22, 2019 at 10:42 PM Logan Smyth <<a href="mailto:loganfsmyth@gmail.com" target="_blank">loganfsmyth@gmail.com</a>> wrote:<br>
><br>
><br>
> Can you elaborate on what loading state you need to keep track of? What is the bottleneck that you run into? Also to be sure, when you say async-load, do you mean `import()`?<br>
><br>
> On Wed, May 22, 2019, 20:17 kai zhu <<a href="mailto:kaizhu256@gmail.com" target="_blank">kaizhu256@gmail.com</a>> wrote:<br>
><br>
><br>
> i don't use es-modules.<br>
> but with amd/requirejs, I start having trouble with module-initializations in nodejs/browser at ~5 async modules (that may or may not have circular-references).  10 would be hard, and 20 would be near inhuman for me.<br>
><br>
> can we say its somewhat impractical for most applications to load more than 50 async modules (with some of them having circular-references)?  and perhaps better design/spec module-loading mechanisms with this usability concern in mind?<br>
><br>
> p.s. its also impractical for me to async-load 5 or more modules without using globalThis to keep track of each module's loading-state.<br>
> _______________________________________________<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/listinfo/es-discuss</a><br>
><br>
><br>
> _______________________________________________<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/listinfo/es-discuss</a><br>
><br>
><br>
</blockquote></div>
_______________________________________________<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/listinfo/es-discuss</a><br>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>