主题
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 本身的规范并没有直接支持默认导出和具名导出的同时存在,但可以通过某些方式实现。
默认导出:
jsmodule.exports = 'Default Export'
具名导出:
jsexports.namedExport = 'Named Export'
同时实现默认导出和具名导出:
jsmodule.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
}