@@ -30,45 +30,37 @@ specifier resolution, and default behavior.
3030The ` --experimental-modules ` flag can be used to enable support for
3131ECMAScript modules (ES modules).
3232
33- ## Running Node.js with an ECMAScript Module
33+ Once enabled, Node.js will treat the following as ES modules when passed to
34+ ` node ` as the initial input, or when referenced by ` import ` statements within
35+ ES module code:
3436
35- There are a few ways to start Node.js with an ES module as its input .
37+ - Files ending in ` .mjs ` .
3638
37- ### Initial entry point with an <code >.mjs</code > extension
39+ - Files ending in ` .js ` , or extensionless files, when the nearest parent
40+ ` package.json ` file contains a top-level field ` "type" ` with a value of
41+ ` "module" ` .
3842
39- A file ending with ` .mjs ` passed to Node.js as an initial entry point will be
40- loaded as an ES module.
43+ - Strings passed in as an argument to ` --eval ` or ` --print ` , or piped to
44+ ` node ` via ` STDIN ` , with the flag ` --input-type= module` .
4145
42- ``` sh
43- node --experimental-modules my-app.mjs
44- ```
45-
46- ### <code >--entry-type=module</code > flag
47-
48- Files ending with ` .js ` or ` .mjs ` , or lacking any extension,
49- will be loaded as ES modules when the ` --entry-type=module ` flag is set.
50-
51- ``` sh
52- node --experimental-modules --entry-type=module my-app.js
53- ```
46+ Node.js will treat as CommonJS all other forms of input, such as ` .js ` files
47+ where the nearest parent ` package.json ` file contains no top-level ` "type" `
48+ field, or string input without the flag ` --input-type ` . This behavior is to
49+ preserve backward compatibility. However, now that Node.js supports both
50+ CommonJS and ES modules, it is best to be explicit whenever possible. Node.js
51+ will treat the following as CommonJS when passed to ` node ` as the initial input,
52+ or when referenced by ` import ` statements within ES module code:
5453
55- For completeness there is also ` --entry-type=commonjs ` , for explicitly running
56- a ` .js ` file as CommonJS. This is the default behavior if ` --entry-type ` is
57- unspecified.
54+ - Files ending in ` .cjs ` .
5855
59- The ` --entry-type=module ` flag can also be used to configure Node.js to treat
60- as an ES module input sent in via ` --eval ` or ` --print ` (or ` -e ` or ` -p ` ) or
61- piped to Node.js via ` STDIN ` .
56+ - Files ending in ` .js ` , or extensionless files, when the nearest parent
57+ ` package.json ` file contains a top-level field ` "type" ` with a value of
58+ ` "commonjs" ` .
6259
63- ``` sh
64- node --experimental-modules --entry-type=module --eval \
65- " import { sep } from 'path'; console.log(sep);"
66-
67- echo " import { sep } from 'path'; console.log(sep);" | \
68- node --experimental-modules --entry-type=module
69- ```
60+ - Strings passed in as an argument to ` --eval ` or ` --print ` , or piped to
61+ ` node ` via ` STDIN ` , with the flag ` --input-type=commonjs ` .
7062
71- ### <code >package.json</code > <code >"type"</code > field
63+ ## <code >package.json</code > <code >"type"</code > field
7264
7365Files ending with ` .js ` or ` .mjs ` , or lacking any extension,
7466will be loaded as ES modules when the nearest parent ` package.json ` file
@@ -97,6 +89,14 @@ If the volume root is reached and no `package.json` is found,
9789Node.js defers to the default, a ` package.json ` with no ` "type" `
9890field.
9991
92+ ` import ` statements of ` .js ` and extensionless files are treated as ES modules
93+ if the nearest parent ` package.json ` contains ` "type": "module" ` .
94+
95+ ``` js
96+ // my-app.js, part of the same example as above
97+ import ' ./startup.js' ; // Loaded as ES module because of package.json
98+ ```
99+
100100## Package Scope and File Extensions
101101
102102A folder containing a ` package.json ` file, and all subfolders below that
@@ -156,6 +156,24 @@ package scope:
156156 extension (since both ` .js ` and ` .cjs ` files are treated as CommonJS within a
157157 ` "commonjs" ` package scope).
158158
159+ ## <code >--input-type</code > flag
160+
161+ Strings passed in as an argument to ` --eval ` or ` --print ` (or ` -e ` or ` -p ` ), or
162+ piped to ` node ` via ` STDIN ` , will be treated as ES modules when the
163+ ` --input-type=module ` flag is set.
164+
165+ ``` sh
166+ node --experimental-modules --input-type=module --eval \
167+ " import { sep } from 'path'; console.log(sep);"
168+
169+ echo " import { sep } from 'path'; console.log(sep);" | \
170+ node --experimental-modules --input-type=module
171+ ```
172+
173+ For completeness there is also ` --input-type=commonjs ` , for explicitly running
174+ string input as CommonJS. This is the default behavior if ` --input-type ` is
175+ unspecified.
176+
159177## Package Entry Points
160178
161179The ` package.json ` ` "main" ` field defines the entry point for a package,
0 commit comments