CJS 默认导出
cjsDefault 选项用于改善生成 CommonJS (CJS) 模块时的兼容性。该选项默认启用。
工作原理
当你的模块只有一个默认导出且输出格式为 CJS 时,robuild 会自动转换:
JavaScript 输出:
export default ...转换为module.exports = ...
TypeScript 声明文件 (.d.cts):
export default ...转换为export = ...
这确保使用 CommonJS require 语法的消费者(require('your-module'))能直接获取默认导出,提高与旧版工具和环境的互操作性。
启用/禁用
CLI
sh
# 自动模式(默认)
robuild ./src/index.ts --cjs-default auto
# 强制启用
robuild ./src/index.ts --cjs-default true
# 禁用转换
robuild ./src/index.ts --cjs-default false1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
配置文件
build.config.ts
ts
import { defineConfig } from 'robuild'
export default defineConfig({
entries: [
{
type: 'bundle',
input: './src/index.ts',
format: ['esm', 'cjs'],
dts: true,
cjsDefault: true, // 默认值,可省略
},
],
})1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
示例
源代码:
ts
// src/index.ts
export default function greet(name: string = 'World') {
return `Hello, ${name}!`
}1
2
3
4
2
3
4
生成的 CJS 输出 (dist/index.cjs):
js
function greet(name = "World") {
return `Hello, ${name}!`;
}
module.exports = greet;1
2
3
4
2
3
4
生成的 ESM 输出 (dist/index.mjs):
js
function greet(name = "World") {
return `Hello, ${name}!`;
}
export { greet as default };1
2
3
4
2
3
4
生成的 ESM 类型声明 (dist/index.d.mts):
ts
declare function greet(name?: string): string;
export { greet as default };1
2
2
生成的 CJS 类型声明 (dist/index.d.cts):
ts
declare function greet(name?: string): string;
export = greet;1
2
2
消费者使用方式
启用 cjsDefault 后,消费者可以更简洁地使用你的模块:
ESM 消费者:
ts
import greet from 'your-module'
greet('World') // Hello, World!1
2
2
CJS 消费者:
js
const greet = require('your-module')
greet('World') // Hello, World!1
2
2
两种方式都能直接获得 greet 函数,无需 .default 属性。
package.json 配置
为了完整支持 ESM 和 CJS 消费者,建议配置 exports 字段:
json
{
"name": "your-module",
"exports": {
".": {
"import": {
"types": "./dist/index.d.mts",
"default": "./dist/index.mjs"
},
"require": {
"types": "./dist/index.d.cts",
"default": "./dist/index.cjs"
}
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
使用场景
- 创建同时兼容 ESM 和 CJS 的库
- 提高与旧版 Node.js 工具的兼容性
- 简化消费者的导入语法
注意事项
TIP
cjsDefault 主要影响只有默认导出的模块。如果你的模块同时有命名导出和默认导出,输出行为可能会有所不同。
WARNING
在某些情况下,混合使用默认导出和命名导出可能会产生 MIXED_EXPORT 警告。启用 cjsDefault 可以帮助避免这类警告。
