From a530f6fe47e1f1e09f2a0b47634693f590432b83 Mon Sep 17 00:00:00 2001
From: Anne van Kesteren User agents that support JavaScript must also implement the BigInt proposal.
Setting the attribute to an ASCII case-insensitive match for the string
- "module
" means that the script is a module script. If it has
- a JavaScript MIME type, or if the script is embedded inline, then it will be
- interpreted as a JavaScript module script according to the JavaScript Module top-level production; if it has a JSON MIME
- type, then it will be interpreted as a JSON module script. Module scripts
- are not affected by the defer
attribute, but are
- affected by the async
attribute (regardless of the state
- of the src
attribute).
module
" means that the script is a module script, to be
+ interpreted according to the JavaScript Module top-level
+ production. Module scripts are not affected by the defer
+ attribute, but are affected by the async
attribute
+ (regardless of the state of the src
attribute).
Setting the attribute to any other value means that the script is a data
block, which is not processed. None of the script
attributes (except HTMLScriptElement : HTMLElement {
scripts. By using a valid MIME type string now, you ensure that your data block will not
ever be reinterpreted as a different script type, even in future user agents.
Classic scripts and JavaScript module scripts can be embedded inline, or be imported from an external
- file using the Classic scripts and module
+ scripts can be embedded inline, or be imported from an external file using the
src
attribute, which if specified gives the URL
of the external script resource to use. If src
is specified,
- it must be a valid non-empty URL potentially surrounded by spaces.
The contents of inline script
elements, or the external script resource, must
- conform with the requirements of the JavaScript specification's Script or Module productions, for classic scripts and JavaScript module scripts respectively.
The contents of the external script resource for JSON module - scripts must conform to the requirements of the JSON specification .
+ it must be a valid non-empty URL potentially surrounded by spaces. The contents of + inlinescript
elements, or the external script resource, must conform with the
+ requirements of the JavaScript specification's Script or Module productions, for classic
+ scripts and module scripts respectively.
When used to include data blocks, the data must be embedded
inline, the format of the data must be given using the type
@@ -58343,7 +58332,7 @@ o............A....e
The following sample shows how a script
element can be used to include an
- external JavaScript module script.
+ external module script.
<script type="module" src="app.mjs"></script>
@@ -58354,37 +58343,37 @@ o............A....e
Additionally, if code from another script
element in the same Window
imports the module from app.mjs
(e.g. via import
- "./app.mjs";
), then the same JavaScript module script created by the
+ "./app.mjs";), then the same module script created by the
former script
element will be imported.
This example shows how to include a JavaScript module script for modern user - agents, and a classic script for older user agents:
+This example shows how to include a module script for modern user agents, and a + classic script for older user agents:
<script type="module" src="app.mjs"></script>
<script nomodule defer src="classic-app-bundle.js"></script>
- In modern user agents that support JavaScript module
- scripts, the script
element with the nomodule
attribute will be ignored, and the
+
In modern user agents that support module scripts, the
+ script
element with the nomodule
attribute
+ will be ignored, and the script
element with a type
of "module
" will be fetched and
+ evaluated (as a module script). Conversely, older user agents will ignore the
script
element with a type
of "module
" will be fetched and evaluated (as a JavaScript module
- script). Conversely, older user agents will ignore the script
element with a
- type
of "module
", as that is an
- unknown script type for them — but they will have no problem fetching and evaluating the other
- script
element (as a classic script), since they do not implement the
- nomodule
attribute.
script
element (as a classic
+ script), since they do not implement the nomodule
attribute.
The following sample shows how a script
element can be used to write an inline
- JavaScript module script that performs a number of substitutions on the document's
- text, in order to make for a more interesting reading experience (e.g. on a news site): module script that performs a number of substitutions on the document's text, in
+ order to make for a more interesting reading experience (e.g. on a news site):
<script type="module">
@@ -58416,30 +58405,12 @@ o............A....e
walkAllTextNodeDescendants(document.body, substitute);
</script>
- Some notable features gained by using a JavaScript module script include the ability to import
- functions from other JavaScript modules, strict mode by default, and how top-level declarations
- do not introduce new properties onto the global object. Also note that no matter
- where this script
element appears in the document, it will not be evaluated until
- both document parsing has complete and its dependency (dom-utils.mjs
) has
- been fetched and evaluated.
The following sample shows how to you can import a JSON module script from inside - a JavaScript module script:
- -<script type="module">
-import peopleInSpace from "http://api.open-notify.org/astros.json";
-
-const list = document.querySelector("#people-in-space");
-for (const { craft, name } of peopleInSpace.people) {
- const li = document.createElement("li");
- li.textContent = `${name} / ${craft}`;
- list.append(li);
-}
-</script>
+ Some notable features gained by using a module script include the ability to import functions
+ from other JavaScript modules, strict mode by default, and how top-level declarations do not
+ introduce new properties onto the global object. Also note that no matter where
+ this script
element appears in the document, it will not be evaluated until both
+ document parsing has complete and its dependency (dom-utils.mjs
) has been
+ fetched and evaluated.
A script is one of three possible A script is one of two possible structs. All scripts have:
One of the following:
- -a script record, for classic - scripts;
a Source Text Module Record, for JavaScript module scripts;
a Synthetic Module Record, for JSON - module scripts; or
null, representing a parsing failure.
Either a Script Record, for classic + scripts; a Source Text Module Record, for module scripts; or null. In the former two cases, it represents a parsed script; + null represents a failure parsing.
Module scripts can be classified into two types:
- -A module script is a JavaScript module script if - its record is a Source Text Module - Record.
A module script is a JSON module script if its record is a Synthetic Module Record, and it - was created via the create a JSON module - script algorithm. JSON module scripts represent a parsed JSON document.
- - -As JSON documents do not import dependent modules, and do not throw exceptions - on evaluation, the fetch options and - base URL of a JSON module script are - always null.
-The active script is determined by the following algorithm:
Let script be the result of creating a JavaScript module script - using source text, settings object, base URL, and +
Let script be the result of creating a module script using + source text, settings object, base URL, and options.
If script is null, asynchronously complete this algorithm with null, and abort @@ -89028,8 +88958,8 @@ interface ApplicationCache : EventTarget {
Let options be the descendant script fetch options for module script's fetch options.
Assert: options is not null, as module script is a JavaScript - module script.
Assert: options is not null, as module script is a module + script.
For each url in urls, perform the @@ -89150,53 +89080,25 @@ interface ApplicationCache : EventTarget {
response's status is not an ok status
Let type be the result of extracting a - MIME type from response's header - list.
- -For historical reasons, fetching a - classic script does not include MIME type checking. In contrast, module scripts' - interpretation is driven by their MIME type, and they will fail to load if they are not of - a supported MIME type.
-Let module script be null.
- -If the resource does not have a MIME type which HTML knows how to handle - as a module, then module script will remain null, which is interpreted as - failure.
-If type is a JavaScript MIME type, then:
- -Let source text be the result of UTF-8 - decoding response's body.
The result of extracting a MIME type from + response's header list is not a + JavaScript MIME type
-Set module script to the result of creating a JavaScript module - script given source text, module map settings object, - response's url, and - options.
For historical reasons, fetching a + classic script does not include MIME type checking. In contrast, module scripts will + fail to load if they are not of a correct MIME type.
+If type is a JSON MIME type, then:
- -Let source text be the result of UTF-8 - decoding response's body.
Let source text be the result of UTF-8 + decoding response's body.
Set module script to the result of creating a JSON module - script given source text and module map settings object.
Let module script be the result of creating a module script given + source text, module map settings object, response's url, and options.
Set moduleMap[url] to module @@ -89226,43 +89128,36 @@ interface ApplicationCache : EventTarget { then return moduleScript's parse error.
If moduleScript's record is a - Cyclic Module Record:
- -Let childSpecifiers be the value of moduleScript's record's [[RequestedModules]] internal slot.
Let childSpecifiers be the value of moduleScript's record's [[RequestedModules]] internal slot.
Let childURLs be the list obtained by calling - resolve a module specifier once for each item of childSpecifiers, given - moduleScript's base URL and that item. - (None of these will ever fail, as otherwise moduleScript would have been marked as - itself having a parse error.)
Let childURLs be the list obtained by calling + resolve a module specifier once for each item of childSpecifiers, given + moduleScript's base URL and that item. + (None of these will ever fail, as otherwise moduleScript would have been marked as + itself having a parse error.)
Let childModules be the list obtained by getting each value in moduleMap whose key is given by an - item of childURLs.
Let childModules be the list obtained by getting each value in moduleMap whose key is given by an + item of childURLs.
For each childModule of - childModules:
+For each childModule of + childModules:
-Assert: childModule is a module script (i.e., it is not "fetching
" or null); by now all module
- scripts in the graph rooted at moduleScript will have successfully been
- fetched.
Assert: childModule is a module script (i.e., it is not "fetching
" or null); by now all module
+ scripts in the graph rooted at moduleScript will have successfully been
+ fetched.
If discoveredSet already contains - childModule, continue.
If discoveredSet already contains + childModule, continue.
Let childParseError be the result of finding the first parse - error given childModule and discoveredSet.
Let childParseError be the result of finding the first parse + error given childModule and discoveredSet.
If childParseError is not null, return childParseError.
If childParseError is not null, return childParseError.
Return script.
To create a JavaScript module script, - given a JavaScript string source, an environment settings - object settings, a URL baseURL, and some script - fetch options options:
+To create a module script, given a + JavaScript string source, an environment settings object + settings, a URL baseURL, and some script fetch + options options:
If scripting is disabled for @@ -89405,53 +89300,6 @@ interface ApplicationCache : EventTarget {
Return script.
To create a JSON module script, given a - string source and an environment settings object settings:
- -Let script be a new module script that this algorithm will - subsequently initialize.
Set script's settings object to settings.
Set script's base URL and - fetch options to null.
Set script's parse error and - error to rethrow to null.
Let json be ? Call(%JSONParse%, undefined, - « source »).
- -If this throws an exception, set script's parse error to that exception, and return - script.
-Set script's record to the result - of creating a synthetic - module record with a default export of json with settings.
Return script.
To create a synthetic module record with a default export of a JavaScript value - value with an environment settings object settings:
- -Return CreateSyntheticModule(« "default" », the following steps, - settings's Realm, - value) with the following steps given module as an argument:
- -To run a classic script given a classic script @@ -90563,9 +90411,6 @@ import "https://example.com/foo/../module2.mjs";
Set base URL to referencing script's base URL.
Assert: base URL is not null, as referencing script is a - classic script or a JavaScript module script.
Set fetch options to the descendant script fetch options for referencing script's fetch options.
Assert: Neither base URL nor fetch options is null, as - referencing script is a classic script or a JavaScript module - script.
As explained above for HostResolveImportedModule, in the common @@ -90691,10 +90532,6 @@ import "https://example.com/foo/../module2.mjs";
Let module script be moduleRecord.[[HostDefined]].
Assert: module script's base - URL is not null, as module script is a JavaScript module - script.
Let urlString be module script's base URL, serialized.
Let base URL be initiating script's base URL.
Assert: base URL is not null, as initiating script is a - classic script or a JavaScript module script.
Let fetch options be a script fetch options whose cryptographic nonce is initiating