esm: remove experimental status from JSON modules
The HTML spec has officially landed JSON Modules and as such I think we can move them out of the "experimental" status. They will still be behind the `--experimental-modules` flag until the entire esm implementation moves out of experimental. Refs: https://html.spec.whatwg.org/#creating-a-json-module-script PR-URL: https://github.com/nodejs/node/pull/27752 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Bradley Farias <bradley.meck@gmail.com> Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Guy Bedford <guybedford@gmail.com> Reviewed-By: Yuta Hiroto <hello@hiroppy.me> Reviewed-By: Yongsheng Zhang <zyszys98@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Сковорода Никита Андреевич <chalkerx@gmail.com> Reviewed-By: Jan Krems <jan.krems@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
parent
47c5c3da86
commit
c3f72510c8
@ -148,13 +148,6 @@ the ability to import a directory that has an index file.
|
|||||||
|
|
||||||
Please see [customizing esm specifier resolution][] for example usage.
|
Please see [customizing esm specifier resolution][] for example usage.
|
||||||
|
|
||||||
### `--experimental-json-modules`
|
|
||||||
<!-- YAML
|
|
||||||
added: v12.0.0
|
|
||||||
-->
|
|
||||||
|
|
||||||
Enable experimental JSON support for the ES Module loader.
|
|
||||||
|
|
||||||
### `--experimental-modules`
|
### `--experimental-modules`
|
||||||
<!-- YAML
|
<!-- YAML
|
||||||
added: v8.5.0
|
added: v8.5.0
|
||||||
|
@ -409,18 +409,11 @@ fs.readFileSync = () => Buffer.from('Hello, ESM');
|
|||||||
fs.readFileSync === readFileSync;
|
fs.readFileSync === readFileSync;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Experimental JSON Modules
|
## JSON Modules
|
||||||
|
|
||||||
**Note: This API is still being designed and is subject to change.**
|
JSON modules follow the [WHATWG JSON modules specification][].
|
||||||
|
|
||||||
Currently importing JSON modules are only supported in the `commonjs` mode
|
The imported JSON only exposes a `default`. There is no
|
||||||
and are loaded using the CJS loader. [WHATWG JSON modules][] are currently
|
|
||||||
being standardized, and are experimentally supported by including the
|
|
||||||
additional flag `--experimental-json-modules` when running Node.js.
|
|
||||||
|
|
||||||
When the `--experimental-json-modules` flag is included both the
|
|
||||||
`commonjs` and `module` mode will use the new experimental JSON
|
|
||||||
loader. The imported JSON only exposes a `default`, there is no
|
|
||||||
support for named exports. A cache entry is created in the CommonJS
|
support for named exports. A cache entry is created in the CommonJS
|
||||||
cache, to avoid duplication. The same object will be returned in
|
cache, to avoid duplication. The same object will be returned in
|
||||||
CommonJS if the JSON module has already been imported from the
|
CommonJS if the JSON module has already been imported from the
|
||||||
@ -433,14 +426,6 @@ Assuming an `index.mjs` with
|
|||||||
import packageConfig from './package.json';
|
import packageConfig from './package.json';
|
||||||
```
|
```
|
||||||
|
|
||||||
The `--experimental-json-modules` flag is needed for the module
|
|
||||||
to work.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --experimental-modules index.mjs # fails
|
|
||||||
node --experimental-modules --experimental-json-modules index.mjs # works
|
|
||||||
```
|
|
||||||
|
|
||||||
## Experimental Wasm Modules
|
## Experimental Wasm Modules
|
||||||
|
|
||||||
Importing Web Assembly modules is supported under the
|
Importing Web Assembly modules is supported under the
|
||||||
@ -763,7 +748,7 @@ success!
|
|||||||
[CommonJS]: modules.html
|
[CommonJS]: modules.html
|
||||||
[ECMAScript-modules implementation]: https://github.com/nodejs/modules/blob/master/doc/plan-for-new-modules-implementation.md
|
[ECMAScript-modules implementation]: https://github.com/nodejs/modules/blob/master/doc/plan-for-new-modules-implementation.md
|
||||||
[Node.js EP for ES Modules]: https://github.com/nodejs/node-eps/blob/master/002-es-modules.md
|
[Node.js EP for ES Modules]: https://github.com/nodejs/node-eps/blob/master/002-es-modules.md
|
||||||
[WHATWG JSON modules]: https://github.com/whatwg/html/issues/4315
|
[WHATWG JSON modules specification]: https://html.spec.whatwg.org/#creating-a-json-module-script
|
||||||
[ES Module Integration Proposal for Web Assembly]: https://github.com/webassembly/esm-integration
|
[ES Module Integration Proposal for Web Assembly]: https://github.com/webassembly/esm-integration
|
||||||
[dynamic instantiate hook]: #esm_dynamic_instantiate_hook
|
[dynamic instantiate hook]: #esm_dynamic_instantiate_hook
|
||||||
[the official standard format]: https://tc39.github.io/ecma262/#sec-modules
|
[the official standard format]: https://tc39.github.io/ecma262/#sec-modules
|
||||||
|
@ -108,9 +108,6 @@ Requires Node.js to be built with
|
|||||||
.It Fl -es-module-specifier-resolution
|
.It Fl -es-module-specifier-resolution
|
||||||
Select extension resolution algorithm for ES Modules; either 'explicit' (default) or 'node'
|
Select extension resolution algorithm for ES Modules; either 'explicit' (default) or 'node'
|
||||||
.
|
.
|
||||||
.It Fl -experimental-json-modules
|
|
||||||
Enable experimental JSON interop support for the ES Module loader.
|
|
||||||
.
|
|
||||||
.It Fl -experimental-modules
|
.It Fl -experimental-modules
|
||||||
Enable experimental ES module support and caching modules.
|
Enable experimental ES module support and caching modules.
|
||||||
.
|
.
|
||||||
|
@ -8,7 +8,6 @@ const { getOptionValue } = require('internal/options');
|
|||||||
|
|
||||||
const preserveSymlinks = getOptionValue('--preserve-symlinks');
|
const preserveSymlinks = getOptionValue('--preserve-symlinks');
|
||||||
const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main');
|
const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main');
|
||||||
const experimentalJsonModules = getOptionValue('--experimental-json-modules');
|
|
||||||
const typeFlag = getOptionValue('--input-type');
|
const typeFlag = getOptionValue('--input-type');
|
||||||
const experimentalWasmModules = getOptionValue('--experimental-wasm-modules');
|
const experimentalWasmModules = getOptionValue('--experimental-wasm-modules');
|
||||||
const { resolve: moduleWrapResolve,
|
const { resolve: moduleWrapResolve,
|
||||||
@ -29,6 +28,7 @@ const extensionFormatMap = {
|
|||||||
'__proto__': null,
|
'__proto__': null,
|
||||||
'.cjs': 'commonjs',
|
'.cjs': 'commonjs',
|
||||||
'.js': 'module',
|
'.js': 'module',
|
||||||
|
'.json': 'json',
|
||||||
'.mjs': 'module'
|
'.mjs': 'module'
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ const legacyExtensionFormatMap = {
|
|||||||
'__proto__': null,
|
'__proto__': null,
|
||||||
'.cjs': 'commonjs',
|
'.cjs': 'commonjs',
|
||||||
'.js': 'commonjs',
|
'.js': 'commonjs',
|
||||||
'.json': 'commonjs',
|
'.json': 'json',
|
||||||
'.mjs': 'module',
|
'.mjs': 'module',
|
||||||
'.node': 'commonjs'
|
'.node': 'commonjs'
|
||||||
};
|
};
|
||||||
@ -44,9 +44,6 @@ const legacyExtensionFormatMap = {
|
|||||||
if (experimentalWasmModules)
|
if (experimentalWasmModules)
|
||||||
extensionFormatMap['.wasm'] = legacyExtensionFormatMap['.wasm'] = 'wasm';
|
extensionFormatMap['.wasm'] = legacyExtensionFormatMap['.wasm'] = 'wasm';
|
||||||
|
|
||||||
if (experimentalJsonModules)
|
|
||||||
extensionFormatMap['.json'] = legacyExtensionFormatMap['.json'] = 'json';
|
|
||||||
|
|
||||||
function resolve(specifier, parentURL) {
|
function resolve(specifier, parentURL) {
|
||||||
if (NativeModule.canBeRequiredByUsers(specifier)) {
|
if (NativeModule.canBeRequiredByUsers(specifier)) {
|
||||||
return {
|
return {
|
||||||
|
@ -117,11 +117,6 @@ void EnvironmentOptions::CheckOptions(std::vector<std::string>* errors) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (experimental_json_modules && !experimental_modules) {
|
|
||||||
errors->push_back("--experimental-json-modules requires "
|
|
||||||
"--experimental-modules be enabled");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (experimental_wasm_modules && !experimental_modules) {
|
if (experimental_wasm_modules && !experimental_modules) {
|
||||||
errors->push_back("--experimental-wasm-modules requires "
|
errors->push_back("--experimental-wasm-modules requires "
|
||||||
"--experimental-modules be enabled");
|
"--experimental-modules be enabled");
|
||||||
@ -271,10 +266,6 @@ DebugOptionsParser::DebugOptionsParser() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EnvironmentOptionsParser::EnvironmentOptionsParser() {
|
EnvironmentOptionsParser::EnvironmentOptionsParser() {
|
||||||
AddOption("--experimental-json-modules",
|
|
||||||
"experimental JSON interop support for the ES Module loader",
|
|
||||||
&EnvironmentOptions::experimental_json_modules,
|
|
||||||
kAllowedInEnvironment);
|
|
||||||
AddOption("--experimental-modules",
|
AddOption("--experimental-modules",
|
||||||
"experimental ES Module support and caching modules",
|
"experimental ES Module support and caching modules",
|
||||||
&EnvironmentOptions::experimental_modules,
|
&EnvironmentOptions::experimental_modules,
|
||||||
|
@ -91,7 +91,6 @@ class DebugOptions : public Options {
|
|||||||
class EnvironmentOptions : public Options {
|
class EnvironmentOptions : public Options {
|
||||||
public:
|
public:
|
||||||
bool abort_on_uncaught_exception = false;
|
bool abort_on_uncaught_exception = false;
|
||||||
bool experimental_json_modules = false;
|
|
||||||
bool experimental_modules = false;
|
bool experimental_modules = false;
|
||||||
std::string es_module_specifier_resolution;
|
std::string es_module_specifier_resolution;
|
||||||
bool experimental_wasm_modules = false;
|
bool experimental_wasm_modules = false;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Flags: --experimental-modules --experimental-json-modules
|
// Flags: --experimental-modules
|
||||||
import '../common/index.mjs';
|
import '../common/index.mjs';
|
||||||
|
|
||||||
import { strictEqual, deepStrictEqual } from 'assert';
|
import { strictEqual, deepStrictEqual } from 'assert';
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
// Flags: --experimental-modules --experimental-json-modules
|
// Flags: --experimental-modules
|
||||||
|
|
||||||
import '../common/index.mjs';
|
import '../common/index.mjs';
|
||||||
import { strictEqual } from 'assert';
|
import { strictEqual } from 'assert';
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user