Skip to content

export 导出

具名导出

导出先前声明的值:

js
const something = true
export { something }

导出时重命名:

js
export { something as somethingElse }

声明后立即导出值:

js
// `var`, `let`, `const`, `class`, 和 `function` 都是有效的
export const something = true

默认导出

导出单个值作为源模块的默认导出:

js
export default something

仅当你的源模块只有一个导出时才推荐这种做法。

尽管规范允许,但在同一个模块中混合默认和命名导出是不好的做法。

提示

具名导出默认导出 可以同时存在。

js
export default 'Default Export'
export const namedExport = 'Named Export'
js
import defaultExport, { namedExport } from 'module'

提示

CommonJS 本身的规范并没有直接支持默认导出和具名导出的同时存在,但可以通过某些方式实现。

  • 默认导出:

    js
    module.exports = 'Default Export'
  • 具名导出:

    js
    exports.namedExport = 'Named Export'
  • 同时实现默认导出和具名导出:

    js
    module.exports = {
      default: 'Default Export',
      namedExport: 'Named Export',
    }

这种同时存在的方式虽然在技术上可行,使用默认导出时需要通过 module.exports.default 访问:

js
const module = require('module')
console.log(module.default) // 默认导出
console.log(module.namedExport) // 具名导出

这可能与用户的预期不一致,因为在 ESM 中,用户希望直接访问默认导出:

js
import module from 'module'
console.log(module) // 默认导出

绑定是如何工作的?

ES 模块导出 live bindings,而不是值,因此可以在初始导入后更改值。

js
import { count, increment } from './incrementer.js'

console.log(count) // 0
increment()
console.log(count) // 1

count += 1 // Error - 只有 incrementer.js 可以更改这个变量
js
export let count = 0

export function increment() {
  count += 1
}

基于 MIT 许可发布