Javascript中export后该不该加default?

在 JavaScript(特别是 ES6 模块系统)中,exportexport default 是两种不同的导出方式,它们在语法、使用方式和导入时的行为上有显著区别。以下是详细的对比和说明:


1. 定义和语法

  • export(命名导出)

    • 用于导出一个模块中的多个具体命名的值(如变量、函数、类等)。

    • 导出的每个值都有一个明确的名称,导入时需要使用相同的名称。

    • 示例:

      javascript 复制代码
      export const name = "Alice";
      export function sayHello() {
        console.log("Hello");
      }
  • export default(默认导出)

    • 用于导出一个模块的"默认值",一个模块只能有一个默认导出。

    • 默认导出的值没有固定的名称,导入时可以自定义名称。

    • 示例:

      javascript 复制代码
      export default function sayHello() {
        console.log("Hello");
      }

2. 导入方式

  • export(命名导出)

    • 导入时需要使用 {} 并指定具体的名称,名称必须与导出时一致。

    • 可以按需导入部分值,也可以使用 * as 导入所有命名导出。

    • 示例:

      javascript 复制代码
      // 文件: module.js
      export const name = "Alice";
      export function sayHello() {
        console.log("Hello");
      }
      
      // 文件: main.js
      import { name, sayHello } from "./module.js";
      console.log(name); // "Alice"
      sayHello(); // "Hello"
      
      // 或者导入所有
      import * as module from "./module.js";
      console.log(module.name); // "Alice"
  • export default(默认导出)

    • 导入时不需要 {},可以自定义名称。

    • 一个模块只能有一个默认导出,导入时直接使用 import 自定义名称 from ...

    • 示例:

      javascript 复制代码
      // 文件: module.js
      export default function sayHello() {
        console.log("Hello");
      }
      
      // 文件: main.js
      import greet from "./module.js"; // 名称 "greet" 是自定义的
      greet(); // "Hello"

3. 数量限制

  • export(命名导出)

    • 一个模块可以有多个命名导出,没有数量限制。

    • 示例:

      javascript 复制代码
      export const a = 1;
      export const b = 2;
      export const c = 3;
  • export default(默认导出)

    • 一个模块只能有一个默认导出,尝试定义多个会导致语法错误。

    • 示例:

      javascript 复制代码
      export default function foo() {}
      export default function bar() {} // 错误:只能有一个默认导出

4. export 结合使用

  • 你可以在同一个模块中同时使用 exportexport default,它们互不冲突。

  • 示例:

    javascript 复制代码
    export const name = "Alice";
    export default function sayHello() {
      console.log("Hello, " + name);
    }
    
    // 导入
    import greet, { name } from "./module.js";
    console.log(name); // "Alice"
    greet(); // "Hello, Alice"

5. 使用场景

  • export(命名导出)

    • 适用于需要导出一组相关功能或值的场景,例如工具模块或常量集合。

    • 示例:导出多个工具函数

      javascript 复制代码
      export const add = (a, b) => a + b;
      export const subtract = (a, b) => a - b;
  • export default(默认导出)

    • 适用于模块有一个主要功能的场景,通常是模块的核心功能或组件。

    • 示例:React 组件

      javascript 复制代码
      export default function MyComponent() {
        return <div>Hello</div>;
      }

6. 行为差异

  • export(命名导出)

    • 导出的值是"实时绑定"的,导入的地方可以感知到值的变化(因为它是引用)。

    • 示例:

      javascript 复制代码
      // module.js
      export let counter = 0;
      setTimeout(() => counter++, 1000);
      
      // main.js
      import { counter } from "./module.js";
      console.log(counter); // 0
      setTimeout(() => console.log(counter), 2000); // 1
  • export default(默认导出)

    • 默认导出是一个具体的值,导出时会被固定(如果是对象,则是引用)。

    • 示例:

      javascript 复制代码
      // module.js
      let counter = 0;
      export default counter;
      setTimeout(() => counter++, 1000);
      
      // main.js
      import counter from "./module.js";
      console.log(counter); // 0
      setTimeout(() => console.log(counter), 2000); // 0(不会变化)

总结

特性 export(命名导出) export default(默认导出)
名称 需要指定具体名称 无需名称,导入时自定义
数量 可多个 只能一个
导入方式 import { name } from ... import anyName from ...
适用场景 导出多个相关值 导出模块的主要功能
绑定行为 实时绑定 值固定(对象为引用)

选择 export 还是 export default 取决于模块的设计需求:

  • 如果模块有多个导出,使用 export
  • 如果模块只有一个主要导出,使用 export default。 在 React Router v7 中,推荐使用命名导出以适应其约定和工具链要求。
相关推荐
崔庆才丨静觅4 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60615 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了5 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅5 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅5 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅5 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment6 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅6 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊6 小时前
jwt介绍
前端
爱敲代码的小鱼6 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax