mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
doc: clarify module system selection
Refs: https://github.com/nodejs/node/pull/41345#discussion_r777115823 PR-URL: https://github.com/nodejs/node/pull/41383 Reviewed-By: Guy Bedford <guybedford@gmail.com> Reviewed-By: Geoffrey Booth <webadmin@geoffreybooth.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
# Command-line options
|
# Command-line API
|
||||||
|
|
||||||
<!--introduced_in=v5.9.1-->
|
<!--introduced_in=v5.9.1-->
|
||||||
|
|
||||||
@@ -11,9 +11,9 @@ To view this documentation as a manual page in a terminal, run `man node`.
|
|||||||
|
|
||||||
## Synopsis
|
## Synopsis
|
||||||
|
|
||||||
`node [options] [V8 options] [script.js | -e "script" | -] [--] [arguments]`
|
`node [options] [V8 options] [<program-entry-point> | -e "script" | -] [--] [arguments]`
|
||||||
|
|
||||||
`node inspect [script.js | -e "script" | <host>:<port>] …`
|
`node inspect [<program-entry-point> | -e "script" | <host>:<port>] …`
|
||||||
|
|
||||||
`node --v8-options`
|
`node --v8-options`
|
||||||
|
|
||||||
@@ -21,6 +21,33 @@ Execute without arguments to start the [REPL][].
|
|||||||
|
|
||||||
For more info about `node inspect`, see the [debugger][] documentation.
|
For more info about `node inspect`, see the [debugger][] documentation.
|
||||||
|
|
||||||
|
## Program entry point
|
||||||
|
|
||||||
|
The program entry point is a specifier-like string. If the string is not an
|
||||||
|
absolute path, it's resolved as a relative path from the current working
|
||||||
|
directory. That path is then resolved by [CommonJS][] module loader. If no
|
||||||
|
corresponding file is found, an error is thrown.
|
||||||
|
|
||||||
|
If a file is found, its path will be passed to the [ECMAScript module loader][]
|
||||||
|
under any of the following conditions:
|
||||||
|
|
||||||
|
* The program was started with a command-line flag that forces the entry
|
||||||
|
point to be loaded with ECMAScript module loader.
|
||||||
|
* The file has an `.mjs` extension.
|
||||||
|
* The file does not have a `.cjs` extension, and the nearest parent
|
||||||
|
`package.json` file contains a top-level [`"type"`][] field with a value of
|
||||||
|
`"module"`.
|
||||||
|
|
||||||
|
Otherwise, the file is loaded using the CommonJS module loader. See
|
||||||
|
[Modules loaders][] for more details.
|
||||||
|
|
||||||
|
### ECMAScript modules loader entry point caveat
|
||||||
|
|
||||||
|
When loading [ECMAScript module loader][] loads the program entry point, the `node`
|
||||||
|
command will only accept as input only files with `.js`, `.mjs`, or `.cjs`
|
||||||
|
extensions; and with `.wasm` extensions when
|
||||||
|
[`--experimental-wasm-modules`][] is enabled.
|
||||||
|
|
||||||
## Options
|
## Options
|
||||||
|
|
||||||
<!-- YAML
|
<!-- YAML
|
||||||
@@ -277,8 +304,8 @@ Enable experimental JSON support for the ES Module loader.
|
|||||||
added: v9.0.0
|
added: v9.0.0
|
||||||
-->
|
-->
|
||||||
|
|
||||||
Specify the `module` of a custom experimental [ECMAScript Module loader][].
|
Specify the `module` of a custom experimental [ECMAScript module loader][].
|
||||||
`module` may be either a path to a file, or an ECMAScript Module name.
|
`module` may be any string accepted as an [`import` specifier][].
|
||||||
|
|
||||||
### `--experimental-policy`
|
### `--experimental-policy`
|
||||||
|
|
||||||
@@ -1931,15 +1958,19 @@ $ node --max-old-space-size=1536 index.js
|
|||||||
```
|
```
|
||||||
|
|
||||||
[Chrome DevTools Protocol]: https://chromedevtools.github.io/devtools-protocol/
|
[Chrome DevTools Protocol]: https://chromedevtools.github.io/devtools-protocol/
|
||||||
[ECMAScript Module loader]: esm.md#loaders
|
[CommonJS]: modules.md
|
||||||
|
[ECMAScript module loader]: esm.md#loaders
|
||||||
|
[Modules loaders]: packages.md#modules-loaders
|
||||||
[OSSL_PROVIDER-legacy]: https://www.openssl.org/docs/man3.0/man7/OSSL_PROVIDER-legacy.html
|
[OSSL_PROVIDER-legacy]: https://www.openssl.org/docs/man3.0/man7/OSSL_PROVIDER-legacy.html
|
||||||
[REPL]: repl.md
|
[REPL]: repl.md
|
||||||
[ScriptCoverage]: https://chromedevtools.github.io/devtools-protocol/tot/Profiler#type-ScriptCoverage
|
[ScriptCoverage]: https://chromedevtools.github.io/devtools-protocol/tot/Profiler#type-ScriptCoverage
|
||||||
[Source Map]: https://sourcemaps.info/spec.html
|
[Source Map]: https://sourcemaps.info/spec.html
|
||||||
[Subresource Integrity]: https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity
|
[Subresource Integrity]: https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity
|
||||||
[V8 JavaScript code coverage]: https://v8project.blogspot.com/2017/12/javascript-code-coverage.html
|
[V8 JavaScript code coverage]: https://v8project.blogspot.com/2017/12/javascript-code-coverage.html
|
||||||
|
[`"type"`]: packages.md#type
|
||||||
[`--cpu-prof-dir`]: #--cpu-prof-dir
|
[`--cpu-prof-dir`]: #--cpu-prof-dir
|
||||||
[`--diagnostic-dir`]: #--diagnostic-dirdirectory
|
[`--diagnostic-dir`]: #--diagnostic-dirdirectory
|
||||||
|
[`--experimental-wasm-modules`]: #--experimental-wasm-modules
|
||||||
[`--heap-prof-dir`]: #--heap-prof-dir
|
[`--heap-prof-dir`]: #--heap-prof-dir
|
||||||
[`--openssl-config`]: #--openssl-configfile
|
[`--openssl-config`]: #--openssl-configfile
|
||||||
[`--redirect-warnings`]: #--redirect-warningsfile
|
[`--redirect-warnings`]: #--redirect-warningsfile
|
||||||
@@ -1952,6 +1983,7 @@ $ node --max-old-space-size=1536 index.js
|
|||||||
[`dns.lookup()`]: dns.md#dnslookuphostname-options-callback
|
[`dns.lookup()`]: dns.md#dnslookuphostname-options-callback
|
||||||
[`dns.setDefaultResultOrder()`]: dns.md#dnssetdefaultresultorderorder
|
[`dns.setDefaultResultOrder()`]: dns.md#dnssetdefaultresultorderorder
|
||||||
[`dnsPromises.lookup()`]: dns.md#dnspromiseslookuphostname-options
|
[`dnsPromises.lookup()`]: dns.md#dnspromiseslookuphostname-options
|
||||||
|
[`import` specifier]: esm.md#import-specifiers
|
||||||
[`process.setUncaughtExceptionCaptureCallback()`]: process.md#processsetuncaughtexceptioncapturecallbackfn
|
[`process.setUncaughtExceptionCaptureCallback()`]: process.md#processsetuncaughtexceptioncapturecallbackfn
|
||||||
[`tls.DEFAULT_MAX_VERSION`]: tls.md#tlsdefault_max_version
|
[`tls.DEFAULT_MAX_VERSION`]: tls.md#tlsdefault_max_version
|
||||||
[`tls.DEFAULT_MIN_VERSION`]: tls.md#tlsdefault_min_version
|
[`tls.DEFAULT_MIN_VERSION`]: tls.md#tlsdefault_min_version
|
||||||
|
|||||||
@@ -94,12 +94,12 @@ provides interoperability between them and its original module format,
|
|||||||
|
|
||||||
<!-- type=misc -->
|
<!-- type=misc -->
|
||||||
|
|
||||||
Node.js treats JavaScript code as CommonJS modules by default.
|
Node.js has two module systems: [CommonJS][] modules and ECMAScript modules.
|
||||||
Authors can tell Node.js to treat JavaScript code as ECMAScript modules
|
|
||||||
|
Authors can tell Node.js to use the ECMAScript modules loader
|
||||||
via the `.mjs` file extension, the `package.json` [`"type"`][] field, or the
|
via the `.mjs` file extension, the `package.json` [`"type"`][] field, or the
|
||||||
`--input-type` flag. See
|
[`--input-type`][] flag. Outside of those cases, Node.js will use the CommonJS
|
||||||
[Modules: Packages](packages.md#determining-module-system) for more
|
module loader. See [Determining module system][] for more details.
|
||||||
details.
|
|
||||||
|
|
||||||
<!-- Anchors to make sure old links find a target -->
|
<!-- Anchors to make sure old links find a target -->
|
||||||
|
|
||||||
@@ -1443,6 +1443,7 @@ success!
|
|||||||
[CommonJS]: modules.md
|
[CommonJS]: modules.md
|
||||||
[Conditional exports]: packages.md#conditional-exports
|
[Conditional exports]: packages.md#conditional-exports
|
||||||
[Core modules]: modules.md#core-modules
|
[Core modules]: modules.md#core-modules
|
||||||
|
[Determining module system]: packages.md#determining-module-system
|
||||||
[Dynamic `import()`]: https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Dynamic_Imports
|
[Dynamic `import()`]: https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Dynamic_Imports
|
||||||
[ES Module Integration Proposal for WebAssembly]: https://github.com/webassembly/esm-integration
|
[ES Module Integration Proposal for WebAssembly]: https://github.com/webassembly/esm-integration
|
||||||
[Import Assertions]: #import-assertions
|
[Import Assertions]: #import-assertions
|
||||||
@@ -1454,6 +1455,7 @@ success!
|
|||||||
[WHATWG JSON modules specification]: https://html.spec.whatwg.org/#creating-a-json-module-script
|
[WHATWG JSON modules specification]: https://html.spec.whatwg.org/#creating-a-json-module-script
|
||||||
[`"exports"`]: packages.md#exports
|
[`"exports"`]: packages.md#exports
|
||||||
[`"type"`]: packages.md#type
|
[`"type"`]: packages.md#type
|
||||||
|
[`--input-type`]: cli.md#--input-typetype
|
||||||
[`ArrayBuffer`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer
|
[`ArrayBuffer`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer
|
||||||
[`SharedArrayBuffer`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer
|
[`SharedArrayBuffer`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer
|
||||||
[`TypedArray`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray
|
[`TypedArray`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray
|
||||||
|
|||||||
@@ -61,7 +61,38 @@ module.exports = class Square {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
The module system is implemented in the `require('module')` module.
|
The CommonJS module system is implemented in the [`module` core module][].
|
||||||
|
|
||||||
|
## Enabling
|
||||||
|
|
||||||
|
<!-- type=misc -->
|
||||||
|
|
||||||
|
Node.js has two module systems: CommonJS modules and [ECMAScript modules][].
|
||||||
|
|
||||||
|
By default, Node.js will treat the following as CommonJS modules:
|
||||||
|
|
||||||
|
* Files with a `.cjs` extension;
|
||||||
|
|
||||||
|
* Files with a `.js` extension when the nearest parent `package.json` file
|
||||||
|
contains a top-level field [`"type"`][] with a value of `"commonjs"`.
|
||||||
|
|
||||||
|
* Files with a `.js` extension when the nearest parent `package.json` file
|
||||||
|
doesn't contain a top-level field [`"type"`][]. Package authors should include
|
||||||
|
the [`"type"`][] field, even in packages where all sources are CommonJS. Being
|
||||||
|
explicit about the `type` of the package will make things easier for build
|
||||||
|
tools and loaders to determine how the files in the package should be
|
||||||
|
interpreted.
|
||||||
|
|
||||||
|
* Files with an extension that is not `.mjs`, `.cjs`, `.json`, `.node`, or `.js`
|
||||||
|
(when the nearest parent `package.json` file contains a top-level field
|
||||||
|
[`"type"`][] with a value of `"module"`, those files will be recognized as
|
||||||
|
CommonJS modules only if they are being `require`d, not when used as the
|
||||||
|
command-line entry point of the program).
|
||||||
|
|
||||||
|
See [Determining module system][] for more details.
|
||||||
|
|
||||||
|
Calling `require()` always use the CommonJS module loader. Calling `import()`
|
||||||
|
always use the ECMAScript module loader.
|
||||||
|
|
||||||
## Accessing the main module
|
## Accessing the main module
|
||||||
|
|
||||||
@@ -1047,6 +1078,7 @@ This section was moved to
|
|||||||
[ECMAScript Modules]: esm.md
|
[ECMAScript Modules]: esm.md
|
||||||
[GLOBAL_FOLDERS]: #loading-from-the-global-folders
|
[GLOBAL_FOLDERS]: #loading-from-the-global-folders
|
||||||
[`"main"`]: packages.md#main
|
[`"main"`]: packages.md#main
|
||||||
|
[`"type"`]: packages.md#type
|
||||||
[`ERR_REQUIRE_ESM`]: errors.md#err_require_esm
|
[`ERR_REQUIRE_ESM`]: errors.md#err_require_esm
|
||||||
[`Error`]: errors.md#class-error
|
[`Error`]: errors.md#class-error
|
||||||
[`__dirname`]: #__dirname
|
[`__dirname`]: #__dirname
|
||||||
@@ -1054,6 +1086,7 @@ This section was moved to
|
|||||||
[`import()`]: https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Dynamic_Imports
|
[`import()`]: https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Dynamic_Imports
|
||||||
[`module.children`]: #modulechildren
|
[`module.children`]: #modulechildren
|
||||||
[`module.id`]: #moduleid
|
[`module.id`]: #moduleid
|
||||||
|
[`module` core module]: module.md
|
||||||
[`module` object]: #the-module-object
|
[`module` object]: #the-module-object
|
||||||
[`package.json`]: packages.md#nodejs-packagejson-field-definitions
|
[`package.json`]: packages.md#nodejs-packagejson-field-definitions
|
||||||
[`path.dirname()`]: path.md#pathdirnamepath
|
[`path.dirname()`]: path.md#pathdirnamepath
|
||||||
|
|||||||
@@ -51,12 +51,13 @@ along with a reference for the [`package.json`][] fields defined by Node.js.
|
|||||||
## Determining module system
|
## Determining module system
|
||||||
|
|
||||||
Node.js will treat the following as [ES modules][] when passed to `node` as the
|
Node.js will treat the following as [ES modules][] when passed to `node` as the
|
||||||
initial input, or when referenced by `import` statements within ES module code:
|
initial input, or when referenced by `import` statements or `import()`
|
||||||
|
expressions:
|
||||||
|
|
||||||
* Files ending in `.mjs`.
|
* Files with an `.mjs` extension.
|
||||||
|
|
||||||
* Files ending in `.js` when the nearest parent `package.json` file contains a
|
* Files with a `.js` extension when the nearest parent `package.json` file
|
||||||
top-level [`"type"`][] field with a value of `"module"`.
|
contains a top-level [`"type"`][] field with a value of `"module"`.
|
||||||
|
|
||||||
* Strings passed in as an argument to `--eval`, or piped to `node` via `STDIN`,
|
* Strings passed in as an argument to `--eval`, or piped to `node` via `STDIN`,
|
||||||
with the flag `--input-type=module`.
|
with the flag `--input-type=module`.
|
||||||
@@ -67,12 +68,13 @@ field, or string input without the flag `--input-type`. This behavior is to
|
|||||||
preserve backward compatibility. However, now that Node.js supports both
|
preserve backward compatibility. However, now that Node.js supports both
|
||||||
CommonJS and ES modules, it is best to be explicit whenever possible. Node.js
|
CommonJS and ES modules, it is best to be explicit whenever possible. Node.js
|
||||||
will treat the following as CommonJS when passed to `node` as the initial input,
|
will treat the following as CommonJS when passed to `node` as the initial input,
|
||||||
or when referenced by `import` statements within ES module code:
|
or when referenced by `import` statements, `import()` expressions, or
|
||||||
|
`require()` expressions:
|
||||||
|
|
||||||
* Files ending in `.cjs`.
|
* Files with a `.cjs` extension.
|
||||||
|
|
||||||
* Files ending in `.js` when the nearest parent `package.json` file contains a
|
* Files with a `.js` extension when the nearest parent `package.json` file
|
||||||
top-level field [`"type"`][] with a value of `"commonjs"`.
|
contains a top-level field [`"type"`][] with a value of `"commonjs"`.
|
||||||
|
|
||||||
* Strings passed in as an argument to `--eval` or `--print`, or piped to `node`
|
* Strings passed in as an argument to `--eval` or `--print`, or piped to `node`
|
||||||
via `STDIN`, with the flag `--input-type=commonjs`.
|
via `STDIN`, with the flag `--input-type=commonjs`.
|
||||||
@@ -83,6 +85,48 @@ future-proof the package in case the default type of Node.js ever changes, and
|
|||||||
it will also make things easier for build tools and loaders to determine how the
|
it will also make things easier for build tools and loaders to determine how the
|
||||||
files in the package should be interpreted.
|
files in the package should be interpreted.
|
||||||
|
|
||||||
|
### Modules loaders
|
||||||
|
|
||||||
|
Node.js has two systems for resolving a specifier and loading modules.
|
||||||
|
|
||||||
|
There is the CommonJS module loader:
|
||||||
|
|
||||||
|
* It is fully synchronous.
|
||||||
|
* It is responsible for handling `require()` calls.
|
||||||
|
* It is monkey patchable.
|
||||||
|
* It supports [folders as modules][].
|
||||||
|
* When resolving a specifier, if no exact match is found, it will try to add
|
||||||
|
extensions (`.js`, `.json`, and finally `.node`) and then attempt to resolve
|
||||||
|
[folders as modules][].
|
||||||
|
* It treats `.json` as JSON text files.
|
||||||
|
* `.node` files are interpreted as compiled addon modules loaded with
|
||||||
|
`process.dlopen()`.
|
||||||
|
* It treats all files that lack `.json` or `.node` extensions as JavaScript
|
||||||
|
text files.
|
||||||
|
* It cannot be used to load ECMAScript modules (although it is possible to
|
||||||
|
[load ECMASCript modules from CommonJS modules][]). When used to load a
|
||||||
|
JavaScript text file that is not an ECMAScript module, it loads it as a
|
||||||
|
CommonJS module.
|
||||||
|
|
||||||
|
There is the ECMAScript module loader:
|
||||||
|
|
||||||
|
* It is asynchronous.
|
||||||
|
* It is responsible for handling `import` statements and `import()` expressions.
|
||||||
|
* It is not monkey patchable, can be customized using [loader hooks][].
|
||||||
|
* It does not support folders as modules, directory indexes (e.g.
|
||||||
|
`'./startup/index.js'`) must be fully specified.
|
||||||
|
* It does no extension searching. A file extension must be provided
|
||||||
|
when the specifier is a relative or absolute file URL.
|
||||||
|
* It can load JSON modules, but an import assertion is required (behind
|
||||||
|
`--experimental-json-modules` flag).
|
||||||
|
* It accepts only `.js`, `.mjs`, and `.cjs` extensions for JavaScript text
|
||||||
|
files.
|
||||||
|
* It can be used to load JavaScript CommonJS modules. Such modules
|
||||||
|
are passed through the `es-module-lexer` to try to identify named exports,
|
||||||
|
which are available if they can be determined through static analysis.
|
||||||
|
Imported CommonJS modules have their URLs converted to absolute
|
||||||
|
paths and are then loaded via the CommonJS module loader.
|
||||||
|
|
||||||
### `package.json` and file extensions
|
### `package.json` and file extensions
|
||||||
|
|
||||||
Within a package, the [`package.json`][] [`"type"`][] field defines how
|
Within a package, the [`package.json`][] [`"type"`][] field defines how
|
||||||
@@ -1236,6 +1280,9 @@ This field defines [subpath imports][] for the current package.
|
|||||||
[`esm`]: https://github.com/standard-things/esm#readme
|
[`esm`]: https://github.com/standard-things/esm#readme
|
||||||
[`package.json`]: #nodejs-packagejson-field-definitions
|
[`package.json`]: #nodejs-packagejson-field-definitions
|
||||||
[entry points]: #package-entry-points
|
[entry points]: #package-entry-points
|
||||||
|
[folders as modules]: modules.md#folders-as-modules
|
||||||
|
[load ECMASCript modules from CommonJS modules]: modules.md#the-mjs-extension
|
||||||
|
[loader hooks]: esm.md#loaders
|
||||||
[self-reference]: #self-referencing-a-package-using-its-name
|
[self-reference]: #self-referencing-a-package-using-its-name
|
||||||
[subpath exports]: #subpath-exports
|
[subpath exports]: #subpath-exports
|
||||||
[subpath imports]: #subpath-imports
|
[subpath imports]: #subpath-imports
|
||||||
|
|||||||
@@ -88,6 +88,6 @@ Now, open any preferred web browser and visit `http://127.0.0.1:3000`.
|
|||||||
If the browser displays the string `Hello, World!`, that indicates
|
If the browser displays the string `Hello, World!`, that indicates
|
||||||
the server is working.
|
the server is working.
|
||||||
|
|
||||||
[Command-line options]: cli.md#command-line-options
|
[Command-line options]: cli.md#options
|
||||||
[Installing Node.js via package manager]: https://nodejs.org/en/download/package-manager/
|
[Installing Node.js via package manager]: https://nodejs.org/en/download/package-manager/
|
||||||
[web server]: http.md
|
[web server]: http.md
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"doc/api/synopsis.md": {
|
"doc/api/synopsis.md": {
|
||||||
"command line options": "cli.html#command-line-options",
|
"command line options": "cli.html#options",
|
||||||
"web server": "http.html"
|
"web server": "http.html"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user