Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add examples of how module maps are keyed #2193

Merged
merged 2 commits into from
Jan 11, 2017
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 35 additions & 1 deletion source
Original file line number Diff line number Diff line change
Expand Up @@ -87754,7 +87754,41 @@ document.querySelector("button").addEventListener("click", bound);
URL">absolute URLs</span> to values that are either a <span>module script</span>, null (used to
represent failed fetches), or a placeholder value "<code data-x="">fetching</code>". <span
data-x="module map">Module maps</span> are used to ensure that imported JavaScript modules are
only fetched, parsed, and evaluated once per <code>Document</code> or <a href="#workers">worker</a>.</p>
only fetched, parsed, and evaluated once per <code>Document</code> or <a
href="#workers">worker</a>.</p>

<div class="example">
<p>Since <span data-x="module map">module maps</span> are keyed by URL, the following code will
create four separate entries in the <span>module map</span>, since it results in four different
URLs:</p>

<pre>import "https://example.com/module.js";
import "https://example.com/module.js#map-buster";
import "https://example.com/%6dodule.js";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think currently in Chrome this will be normalized. I currently think the URL Standard will end up not normalizing it, but who knows what the future brings so might be best to leave this example out.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm OK. Are there other examples of things that most servers interpret as equivalent but don't involve fragments (or queries)? I thought that was a nice point made in #443 (comment)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the only one for paths I think.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hosts works fine too :). But I guess I can find many examples of host canonicalization on my own.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hosts normalize during parsing. Before we normalized IP addresses during parsing there was that ability, but no longer.

import "https://example.com/module.js?debug=true";</pre>

<p>That is, URL <span data-x="concept-url-query">queries</span> and <span
data-x="concept-url-fragment">fragments</span> can be varied to create distinct entries in the
<span>module map</span>; they are not ignored. Similarly, no canonicalization beyond that
performed by the <span>URL parser</span> is applied, even if the same resource would be <span
data-x="concept-fetch">fetched</span> from the server. Thus, four separate fetches and four
separate module evaluations will be performed.</p>

<p>In contrast, the following code would only create a single entry in the <span>module
map</span>, since after applying the <span>URL parser</span> to these inputs, the resulting <span
data-x="URL record">URL records</span> are equal:</p>

<pre>import "https://example.com/module2.js";
import "https:example.com/module2.js";
import "https://///example.com\\module2.js";
import "https://example.com/foo/../module2.js";</pre>

<p>So in this second example, only one fetch and one module evaluation will occur.</p>

<p>Note that this behavior is the same as how <span
data-x="SharedWorker">shared workers</span> are keyed by their parsed <span
data-x="concept-SharedWorkerGlobalScope-constructor-url">constructor url</span>.</p>
</div>

<p>To <dfn>resolve a module specifier</dfn> given a <span>module script</span> <var>script</var>
and a string <var>specifier</var>, perform the following steps. It will return either an
Expand Down