ESM 从 index.js 文件夹中导入所有文件无效
ESM importing all files from folder with index.js not working
考虑这个非常简单的项目:esm-test
在 Node.js v13.
上运行
这个项目在他的 package.json
中有 "type":"module"
所以 Node.js 默认情况下会将所有文件 .js
视为 ECMAScript 模块。参见:ECMAScript Modules - Enabling.
它有以下非常简单的结构:
- package.json
- src/
- stuff/
- a.js
- b.js
- index.js
- app.js
文件app.js
是包入口点。
我的目的是使用 index.js
文件从 stuff/
文件夹导入所有文件。我知道在 ES6 中,文件夹中有一个 index.js
文件可以让您隐式地从文件夹执行导入,而无需在导入语句中指定 index.js
。
所以我可以做到:
import { a, b } from './stuff'
而不是:
import a from './stuff/a.js'
import b from './stuff/b.js'
但这对我不起作用。它显示以下错误:
internal/modules/esm/default_resolve.js:96
let url = moduleWrapResolve(specifier, parentURL);
^
Error: Cannot find module C:\projects\esm-test\src\stuff imported from C:\projects\esm-test\src\app.js
at Loader.resolve [as _resolve] (internal/modules/esm/default_resolve.js:96:13)
at Loader.resolve (internal/modules/esm/loader.js:72:33)
at Loader.getModuleJob (internal/modules/esm/loader.js:156:40)
at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:42:40)
at link (internal/modules/esm/module_job.js:41:36) {
code: 'ERR_MODULE_NOT_FOUND'
}
与 CommonJS 模块一起工作。但是我想用ESM做。
你能帮我解决这个问题吗?
在 esm 中自动导入 index.js 是 node.js 当前版本的实验性功能。您可以在启动服务器时使用标志 --experimental-specifier-resolution=node
。
EX- node --experimental-specifier-resolution=node index
请参阅此 link 了解更多信息 https://nodejs.org/api/esm.html#esm_resolver_algorithm
为了与 "type":"module" 一起工作,您需要导入文件名和扩展名,即 "index.js",它不会查找 index.js默认情况下,其他文件也需要包含扩展名,即 a.js
a.js / b.js
class a {
constructor(name) {
this.name = name;
}
sayName() {
console.log('Hi, my name is ', this.name + '.');
}
}
export default a;
./stuff/index.js
import a from './a.js';
import b from './b.js';
export {
a,
b
};
//Or "export default" depending on your needs.
export default {
a,
b
};
app.js
import { a, b } from './stuff/index.js'
如果您有多个命名导出,则需要像这样导入。
import * as a from './a.js';
考虑这个非常简单的项目:esm-test
在 Node.js v13.
上运行这个项目在他的 package.json
中有 "type":"module"
所以 Node.js 默认情况下会将所有文件 .js
视为 ECMAScript 模块。参见:ECMAScript Modules - Enabling.
它有以下非常简单的结构:
- package.json
- src/
- stuff/
- a.js
- b.js
- index.js
- app.js
文件app.js
是包入口点。
我的目的是使用 index.js
文件从 stuff/
文件夹导入所有文件。我知道在 ES6 中,文件夹中有一个 index.js
文件可以让您隐式地从文件夹执行导入,而无需在导入语句中指定 index.js
。
所以我可以做到:
import { a, b } from './stuff'
而不是:
import a from './stuff/a.js'
import b from './stuff/b.js'
但这对我不起作用。它显示以下错误:
internal/modules/esm/default_resolve.js:96
let url = moduleWrapResolve(specifier, parentURL);
^
Error: Cannot find module C:\projects\esm-test\src\stuff imported from C:\projects\esm-test\src\app.js
at Loader.resolve [as _resolve] (internal/modules/esm/default_resolve.js:96:13)
at Loader.resolve (internal/modules/esm/loader.js:72:33)
at Loader.getModuleJob (internal/modules/esm/loader.js:156:40)
at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:42:40)
at link (internal/modules/esm/module_job.js:41:36) {
code: 'ERR_MODULE_NOT_FOUND'
}
与 CommonJS 模块一起工作。但是我想用ESM做。
你能帮我解决这个问题吗?
在 esm 中自动导入 index.js 是 node.js 当前版本的实验性功能。您可以在启动服务器时使用标志 --experimental-specifier-resolution=node
。
EX- node --experimental-specifier-resolution=node index
请参阅此 link 了解更多信息 https://nodejs.org/api/esm.html#esm_resolver_algorithm
为了与 "type":"module" 一起工作,您需要导入文件名和扩展名,即 "index.js",它不会查找 index.js默认情况下,其他文件也需要包含扩展名,即 a.js
a.js / b.js
class a {
constructor(name) {
this.name = name;
}
sayName() {
console.log('Hi, my name is ', this.name + '.');
}
}
export default a;
./stuff/index.js
import a from './a.js';
import b from './b.js';
export {
a,
b
};
//Or "export default" depending on your needs.
export default {
a,
b
};
app.js
import { a, b } from './stuff/index.js'
如果您有多个命名导出,则需要像这样导入。
import * as a from './a.js';