Skip to content

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
}

导入方读取到的是当前绑定的最新值,而不是第一次导入时的静态快照。

默认导出和具名导出怎么选

通常可以这样判断:

  • 模块只有一个核心能力时,默认导出可读性较强
  • 模块需要暴露多个稳定成员时,具名导出更清晰
  • 公共工具集合、组件集合通常更适合具名导出

使用建议

  • 对外接口尽量少而稳定,不要把内部工具函数全部导出。
  • 统一出口文件适合做聚合,但不要转发过度导致来源难追。
  • 默认导出不要滥用,否则模块职责会变得模糊。
  • 看到导出和导入对不上时,先检查是默认导出还是具名导出。

基于 MIT 许可发布