主题
export
export 用于声明“当前模块对外提供什么”。模块内部定义的内容,默认不会自动暴露给其他文件。
具名导出
具名导出适合明确暴露多个成员:
js
export const version = '1.0.0'
export function add(a, b) {
return a + b
}也可以先定义,再统一导出:
js
const version = '1.0.0'
function add(a, b) {
return a + b
}
export { version, add }导出时重命名
如果对外名称和模块内部名称不一致,可以在导出时改名:
js
const internalName = 'v1'
export { internalName as version }默认导出
默认导出适合模块只暴露一个主能力的情况:
js
export default function formatDate(date) {
return String(date)
}一个模块最多只能有一个默认导出。
具名导出和默认导出可以同时存在
js
export default function createApp() {}
export const version = '1.0.0'导入时写法会不同:
js
import createApp, { version } from './app.js'语法上这是允许的,但要注意模块接口是否清晰。
重导出
有时当前模块本身不实现逻辑,只负责转发其他模块的导出:
js
export { add } from './math.js'
export { formatDate } from './date.js'也可以一次性全部转发:
js
export * from './math.js'这种写法常见于统一出口文件。
为什么经常看到 index.js 或入口文件
因为可以把多个子模块统一从一个文件重新导出:
js
export { Button } from './button.js'
export { Input } from './input.js'
export { Select } from './select.js'这样外部只需要从一个入口导入。
导出的是 live binding
export 导出的不是值拷贝,而是绑定本身。
js
export let count = 0
export function increment() {
count += 1
}导入方读取到的是当前绑定的最新值,而不是第一次导入时的静态快照。
默认导出和具名导出怎么选
通常可以这样判断:
- 模块只有一个核心能力时,默认导出可读性较强
- 模块需要暴露多个稳定成员时,具名导出更清晰
- 公共工具集合、组件集合通常更适合具名导出
使用建议
- 对外接口尽量少而稳定,不要把内部工具函数全部导出。
- 统一出口文件适合做聚合,但不要转发过度导致来源难追。
- 默认导出不要滥用,否则模块职责会变得模糊。
- 看到导出和导入对不上时,先检查是默认导出还是具名导出。
