@@ -142,46 +142,52 @@ 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() ` :
150+
151+ * Resolution:
152+ * The resolution initiated by ` require() ` supports [ folders as modules] [ ] .
153+ * When resolving a specifier, if no exact match is found, ` require() ` will try to add
154+ extensions (` .js ` , ` .json ` , and finally ` .node ` ) and then attempt to resolve
155+ [ folders as modules] [ ] .
156+ * Loading:
157+ * ` .json ` files are treated as JSON text files.
158+ * ` .node ` files are interpreted as compiled addon modules loaded with ` process.dlopen() ` .
159+ * ` .ts ` , ` .mts ` and ` .cts ` files are treated as [ TypeScript] [ ] text files.
160+ * Files with any other extension, or without extensions, are treated as JavaScript
161+ text files.
162+ * ` require() ` only be used to [ load ECMAScript modules from CommonJS modules] [ ] if
163+ the [ ECMAScript module] [ ES Module ] and its dependencies are synchronous
164+ (i.e. they do not contain top-level ` await ` ).
165+
166+ When a module is requested via ` import ` statements or ` import() ` expressions:
167+
168+ * Resolution:
169+ * The resolution of ` import ` /` import() ` does not support folders as modules,
170+ directory indexes (e.g. ` './startup/index.js' ` ) must be fully specified.
171+ * It does not perform extension searching. A file extension must be provided
172+ when the specifier is a relative or absolute file URL.
173+ * Loading:
174+ * ` .json ` files are treated as JSON text files. When importing JSON modules,
175+ an import type attribute is required (e.g.
176+ ` import json from './data.json' with { type: 'json' } ` ).
177+ * ` .node ` files are interpreted as compiled addon modules loaded with
178+ ` process.dlopen() ` , if [ ` --experimental-addon-modules ` ] [ ] is enabled.
179+ * ` .ts ` , ` .mts ` and ` .cts ` files are treated as [ TypeScript] [ ] text files.
180+ * It accepts only ` .js ` , ` .mjs ` , and ` .cjs ` extensions for JavaScript text
181+ files.
182+ * ` .wasm ` files are treated as [ WebAssembly modules] [ ] .
183+ * Any other file extensions will result in a
184+ [ ` ERR_UNKNOWN_FILE_EXTENSION ` ] [ ] error.
185+ * ` import ` /` import() ` can be used to load JavaScript [ CommonJS modules] [ commonjs ] .
186+ Such modules are passed through the ` cjs-module-lexer ` to try to identify named
187+ exports, which are available if they can be determined through static analysis.
188+
189+ Regardless of how a module is requested, the resolution and loading process can be customized
190+ using [ loader hooks] [ ] .
185191
186192### ` package.json ` and file extensions
187193
@@ -1151,21 +1157,25 @@ This field defines [subpath imports][] for the current package.
11511157[ Node.js documentation for this section ] : https://github.com/nodejs/node/blob/HEAD/doc/api/packages.md#conditions-definitions
11521158[ Runtime Keys ] : https://runtime-keys.proposal.wintercg.org/
11531159[ Syntax detection ] : #syntax-detection
1160+ [ TypeScript ] : typescript.md
1161+ [ WebAssembly modules ] : esm.md#wasm-modules
11541162[ WinterCG ] : https://wintercg.org/
11551163[ `"exports"` ] : #exports
11561164[ `"imports"` ] : #imports
11571165[ `"main"` ] : #main
11581166[ `"name"` ] : #name
11591167[ `"type"` ] : #type
11601168[ `--conditions` / `-C` flag ] : #resolving-user-conditions
1169+ [ `--experimental-addon-modules` ] : cli.md#--experimental-addon-modules
11611170[ `--no-addons` flag ] : cli.md#--no-addons
11621171[ `ERR_PACKAGE_PATH_NOT_EXPORTED` ] : errors.md#err_package_path_not_exported
1172+ [ `ERR_UNKNOWN_FILE_EXTENSION` ] : errors.md#err_unknown_file_extension
11631173[ `package.json` ] : #nodejs-packagejson-field-definitions
11641174[ entry points ] : #package-entry-points
11651175[ folders as modules ] : modules.md#folders-as-modules
11661176[ import maps ] : https://github.com/WICG/import-maps
11671177[ load ECMAScript modules from CommonJS modules ] : modules.md#loading-ecmascript-modules-using-require
1168- [ loader hooks ] : esm .md#loaders
1178+ [ loader hooks ] : module .md#customization-hooks
11691179[ packages folder mapping ] : https://github.com/WICG/import-maps#packages-via-trailing-slashes
11701180[ self-reference ] : #self-referencing-a-package-using-its-name
11711181[ subpath exports ] : #subpath-exports
0 commit comments