我想让我的 ES 模块可以以下两种样式导入:
import * as mylib from "./mylib.mjs";
import mylib from "./mylib.mjs";
然后我用以下风格写了
mylib.mjs
:
export function foo(){
}
export function bar(){
}
export function baz(){
}
// ... and many export functions...(1)
export default {foo, bar, baz, /* ... and many function names...(2) */};
但我总是担心
export default(2)
中缺少一些名字。如果添加了新的 export functions(1)
,我也必须将其添加到 function names(2)
中。我经常忘记这一点。
在 CommonJS 中,使用
exports
使这变得更聪明。 ES模块中是否有相当于exports
的变量?
exports.foo=function () {
};
exports.bar=function () {
};
exports.baz=function () {
};
exports.default=exports;// No need to change here when function export is added.
这不是我建议做的事情,因为我觉得桶文件是一种反模式,最好有一种加载模块的方法,但你可以做的事情是组织“接近”你想要的东西你的项目是这样的:
.
└── src/
├── mylib/
│ └── mod.mjs
├── mylib.mjs
└── consumer.mjs
export function foo(){
}
export function bar(){
}
export function baz(){
}
export * from './mylib/mod.mjs'
export * as default from './mylib/mod.mjs'
import * as mylibNs from './mylib.mjs'
import mylib from './mylib.mjs'
需要额外的文件来管理导出,但您不必在多个位置更新导出的名称。
当然,如果您同意模块中的循环引用,您可以只有一个文件,如下所示:
mylib.mjs
export function foo() {
console.log('foo')
}
export function bar() {
console.log('bar')
}
export * as default from './mylib.mjs'
它将以与以前相同的方式使用,但
default
属性将是对模块本身的引用,即
mylib.default.foo === mylib.foo
。这是使用 Node.js v20.12.0 进行测试的。