JavaScript中export有命名导出和默认导出两种:命名导出支持多个、需同名导入,利于树摇和类型推断;默认导出仅一个、导入名可自定,适合主入口,二者常混合使用。

JavaScript 中的 export 有两种主要方式:命名导出(named export)和默认导出(default export),它们在使用场景、语法、灵活性和模块设计思路上有明显区别。
命名导出支持多个导出,结构清晰可预测
一个模块可以有任意多个命名导出,每个导出必须有明确的名字,导入时也必须用对应的名字(或重命名)。这适合导出工具函数、常量、类等逻辑上并列的成员。
- 导出语法:
export const PI = 3.14;、export function add(a, b) { return a + b; }、export { foo, bar }; - 导入语法:
import { PI, add } from './math.js';或import { PI as MathPI } from './math.js'; - 不能直接
import math from './math.js'(会报错),因为没有默认导出
默认导出只允许一个,更灵活但语义较弱
每个模块最多有一个默认导出,可以是函数、类、对象、基本值等任意类型。导入时名字可自定,不依赖原名,适合封装“主接口”或单入口模块。
- 导出语法:
export default function() { ... }或export default class App { ... }或export default { version: '1.0' }; - 导入语法:
import App from './App.js';(无需大括号)、import MyComponent from './Component.js'; - 也可混用:
export default function render() { ... }; export const VERSION = '2.0';,然后import render, { VERSION } from './index.js';
命名导出利于类型推断与树摇,更适合库开发
打包工具(如 Webpack、Rollup)和 TypeScript 能更准确地分析命名导出的引用关系,实现按需引入和自动移除未使用代码(tree-shaking)。默认导出若为匿名函数或动态值,可能影响优化效果。
立即学习“Java免费学习笔记(深入)”;
- 例如 Lodash 的
import { debounce } from 'lodash'可只打包debounce,而import _ from 'lodash'往往引入整个包 - TypeScript 对
import { useState } from 'react'的类型提示比import React from 'react'更精准
默认导出更适合应用层主模块,减少命名冲突
在应用入口(如 main.js、App.vue、index.tsx)中,用默认导出能避免每次 import 都要查文档记名字,也降低多人协作时的命名协商成本。
- 比如
export default createApp(App);→import app from './main.js';简洁直观 - 若用命名导出
export const app = createApp(App);,则所有使用者都得写import { app } from './main.js';,略显冗余 - 当模块只暴露一个核心功能时,默认导出语义更自然
实际项目中常混合使用:用命名导出暴露细粒度能力,用默认导出提供开箱即用的组合接口。关键不是选哪种,而是保持团队约定一致,让导入者一眼明白模块的“主次”关系。


















