编写同时具有默认和非默认导出的 ES 模块的最佳方式

问题描述 投票:0回答:1

我想让我的 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.
javascript node.js esmodules
1个回答
0
投票

这不是我建议做的事情,因为我觉得桶文件是一种反模式,最好有一种加载模块的方法,但你可以做的事情是组织“接近”你想要的东西你的项目是这样的: . └── src/ ├── mylib/ │ └── mod.mjs ├── mylib.mjs └── consumer.mjs

mylib/mod.js

export function foo(){ } export function bar(){ } export function baz(){ }

mylib.mjs

export * from './mylib/mod.mjs' export * as default from './mylib/mod.mjs'

consumer.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 进行测试的。

© www.soinside.com 2019 - 2024. All rights reserved.