@@ -142,46 +142,56 @@ CommonJS. This includes the following:
142142* Lexical redeclarations of the CommonJS wrapper variables (`require`, `module`,
143143 `exports`, `__dirname`, `__filename`).
144144
145- ### Modules loaders
146-
147- Node.js has two systems for resolving a specifier and loading modules.
148-
149- There is the CommonJS module loader:
150-
151- * It is fully synchronous.
152- * It is responsible for handling `require()` calls.
153- * It is monkey patchable.
154- * It supports [folders as modules][].
155- * When resolving a specifier, if no exact match is found, it will try to add
156- extensions (`.js`, `.json`, and finally `.node`) and then attempt to resolve
157- [folders as modules][].
158- * It treats `.json` as JSON text files.
159- * `.node` files are interpreted as compiled addon modules loaded with
160- `process.dlopen()`.
161- * It treats all files that lack `.json` or `.node` extensions as JavaScript
162- text files.
163- * It can only be used to [load ECMAScript modules from CommonJS modules][] if
164- the module graph is synchronous (that contains no top-level `await`).
165- When used to load a JavaScript text file that is not an ECMAScript module,
166- the file will be loaded as a CommonJS module.
167-
168- There is the ECMAScript module loader:
169-
170- * It is asynchronous, unless it's being used to load modules for `require()`.
171- * It is responsible for handling `import` statements and `import()` expressions.
172- * It is not monkey patchable, can be customized using [loader hooks][].
173- * It does not support folders as modules, directory indexes (e.g.
174- `'./startup/index.js'`) must be fully specified.
175- * It does no extension searching. A file extension must be provided
176- when the specifier is a relative or absolute file URL.
177- * It can load JSON modules, but an import type attribute is required.
178- * It accepts only `.js`, `.mjs`, and `.cjs` extensions for JavaScript text
179- files.
180- * It can be used to load JavaScript CommonJS modules. Such modules
181- are passed through the `cjs-module-lexer` to try to identify named exports,
182- which are available if they can be determined through static analysis.
183- Imported CommonJS modules have their URLs converted to absolute
184- paths and are then loaded via the CommonJS module loader.
145+ ### Module resolution and loading
146+
147+ Node.js has two types of module resolution and loading, chosen based on how the module is requested.
148+
149+ When a module is requested via `require()` (available by default in CommonJS modules,
150+ and can be dynamically generated using `createRequire()` in both CommonJS and ES Modules):
151+
152+ * Resolution:
153+ * The resolution initiated by `require()` supports [folders as modules][].
154+ * When resolving a specifier, if no exact match is found, `require()` will try to add
155+ extensions (`.js`, `.json`, and finally `.node`) and then attempt to resolve
156+ [folders as modules][].
157+ * It does not support URLs as specifiers by default.
158+ * Loading:
159+ * `.json` files are treated as JSON text files.
160+ * `.node` files are interpreted as compiled addon modules loaded with `process.dlopen()`.
161+ * `.ts`, `.mts` and `.cts` files are treated as [TypeScript][] text files.
162+ * Files with any other extension, or without extensions, are treated as JavaScript
163+ text files.
164+ * `require()` can only be used to [load ECMAScript modules from CommonJS modules][] if
165+ the [ECMAScript module][ES Module] _and its dependencies_ are synchronous
166+ (i.e. they do not contain top-level `await`).
167+
168+ When a module is requested via static `import` statements (only available in ES Modules)
169+ or `import()` expressions (available in both CommonJS and ES Modules):
170+
171+ * Resolution:
172+ * The resolution of `import`/`import()` does not support folders as modules,
173+ directory indexes (e.g. `'./startup/index.js'`) must be fully specified.
174+ * It does not perform extension searching. A file extension must be provided
175+ when the specifier is a relative or absolute file URL.
176+ * It supports `file://` and `data:` URLs as specifiers by default.
177+ * Loading:
178+ * `.json` files are treated as JSON text files. When importing JSON modules,
179+ an import type attribute is required (e.g.
180+ `import json from './data.json' with { type: 'json' }`).
181+ * `.node` files are interpreted as compiled addon modules loaded with
182+ `process.dlopen()`, if [`--experimental-addon-modules`][] is enabled.
183+ * `.ts`, `.mts` and `.cts` files are treated as [TypeScript][] text files.
184+ * It accepts only `.js`, `.mjs`, and `.cjs` extensions for JavaScript text
185+ files.
186+ * `.wasm` files are treated as [WebAssembly modules][].
187+ * Any other file extensions will result in a [`ERR_UNKNOWN_FILE_EXTENSION`][] error.
188+ Additional file extensions can be facilitated via [customization hooks][].
189+ * `import`/`import()` can be used to load JavaScript [CommonJS modules][commonjs].
190+ Such modules are passed through the `cjs-module-lexer` to try to identify named
191+ exports, which are available if they can be determined through static analysis.
192+
193+ Regardless of how a module is requested, the resolution and loading process can be customized
194+ using [customization hooks][].
185195
186196### `package.json` and file extensions
187197
@@ -1151,21 +1161,25 @@ This field defines [subpath imports][] for the current package.
11511161[Node.js documentation for this section]: https://github.com/nodejs/node/blob/HEAD/doc/api/packages.md#conditions-definitions
11521162[Runtime Keys]: https://runtime-keys.proposal.wintercg.org/
11531163[Syntax detection]: #syntax-detection
1164+ [TypeScript]: typescript.md
1165+ [WebAssembly modules]: esm.md#wasm-modules
11541166[WinterCG]: https://wintercg.org/
11551167[`"exports"`]: #exports
11561168[`"imports"`]: #imports
11571169[`"main"`]: #main
11581170[`"name"`]: #name
11591171[`"type"`]: #type
11601172[`--conditions` / `-C` flag]: #resolving-user-conditions
1173+ [`--experimental-addon-modules`]: cli.md#--experimental-addon-modules
11611174[`--no-addons` flag]: cli.md#--no-addons
11621175[`ERR_PACKAGE_PATH_NOT_EXPORTED`]: errors.md#err_package_path_not_exported
1176+ [`ERR_UNKNOWN_FILE_EXTENSION`]: errors.md#err_unknown_file_extension
11631177[`package.json`]: #nodejs-packagejson-field-definitions
1178+ [customization hooks]: module.md#customization-hooks
11641179[entry points]: #package-entry-points
11651180[folders as modules]: modules.md#folders-as-modules
11661181[import maps]: https://github.com/WICG/import-maps
11671182[load ECMAScript modules from CommonJS modules]: modules.md#loading-ecmascript-modules-using-require
1168- [loader hooks]: esm.md#loaders
11691183[packages folder mapping]: https://github.com/WICG/import-maps#packages-via-trailing-slashes
11701184[self-reference]: #self-referencing-a-package-using-its-name
11711185[subpath exports]: #subpath-exports
0 commit comments