# output.exports
类型: | "auto" | "default"| "named"| "none" |
---|---|
CLI: | --exports <exportMode> |
默认: | 'auto' |
该选项用于指定导出模式。默认是 auto,指根据 input 模块导出推测你的意图:
- default – 适用于只使用 export default ... 的情况;请注意,此操作可能会导致生成想要在与 ESM 输出可互换的 CommonJS 输出时出现问题,具体可见下文
- named – 适用于使用命名导出的情况
- none – 适用于没有导出的情况(比如,当你在构建应用而非库时)
由于这只是一个输出的转换过程,因此仅当默认导出是所有入口 chunk 的唯一导出时,你才能选择 default。同样地,仅当没有导出时,才能选择 none,否则 Rollup 将会抛出错误。
default 和 named 之间的差异会影响其他人使用你的 bundle 的方式。例如,如果该选项的值为 default 时,那么 CommonJS 用户可以通过以下方式使用你的库,例如:
// your-lib 包入口
export default 'Hello world';
// CommonJS 消费者
/* require( "your-lib" ) 返回 "Hello World" */
const hello = require('your-lib');
如果该选项的值是 named,那么用户则通过以下方式使用你的库:
// your-lib 包入口
export const hello = 'Hello world';
// CommonJS 消费者
/* require( "your-lib" ) 返回 {hello: "Hello World"} */
const hello = require('your-lib').hello;
/* 或使用解构 */
const { hello } = require('your-lib');
问题是,如果你使用 named 导出,但 也 会有一个 default 导出,用户将不得不类似这样做来使用默认到处:
// your-lib 包入口
export default 'foo';
export const bar = 'bar';
// CommonJS 消费者
/* require( "your-lib" ) 返回 {default: "foo", bar: "bar"} */
const foo = require('your-lib').default;
const bar = require('your-lib').bar;
/* 或使用解构 */
const { default: foo, bar } = require('your-lib');
请注意:一些工具,如 Babel、TypeScript、Webpack 和 @rollup/plugin-commonjs,它们能够解析 CommonJS 的 require(...) 调用,并将其转换为 ES 模块。如果你正在生成想要在与这些工具的 ESM 输出可互换的 CommonJS 输出,则应始终使用 named 导出模式。原因是这些工具中大多数默认情况下会在 require 中返回 ES 模块的命名空间,其中默认导出是 .default 属性。
换句话说,对于这些工具,你无法创建一个包接口,在该接口中 const lib = require("your-lib") 能够产生与 import lib from "your-lib" 相同的结果。但是,使用 named 导出模式,const {lib} = require("your-lib") 将与 import {lib} from "your-lib" 等效。