module 、export 、import分别有什么作用

在 JavaScript 中,moduleexportimportES6 模块系统 的核心关键字,用于实现代码的模块化组织和管理。以下是它们的详细作用:


一、module 的作用

module(模块)是一个独立的 JavaScript 文件,具有独立作用域 ,通过 exportimport 与其他模块交互。

  • 特点
    • 每个文件默认是一个模块。
    • 模块内部的变量、函数、类等默认是私有的(除非显式导出)。
    • 模块通过 importexport 实现依赖管理。

二、export 的作用

export 用于将模块内部的变量、函数、类等导出,供其他模块使用。

1. 导出方式

  • 命名导出(Named Export):导出多个具名值。

    javascript 复制代码
    // math.js
    export const PI = 3.14159;              // 导出常量
    export function add(a, b) { return a + b; } // 导出函数
    export class Calculator { /* ... */ }   // 导出类
  • 默认导出(Default Export):一个模块只能有一个默认导出。

    javascript 复制代码
    // logger.js
    const log = (message) => console.log(message);
    export default log; // 默认导出

2. 导出规则

  • 命名导出需在导入时使用相同名称,默认导出可任意命名。
  • 导出可以是变量、函数、类,甚至是字面量。

三、import 的作用

import 用于从其他模块导入已导出的内容,分为命名导入和默认导入。

1. 导入方式

  • 命名导入:导入指定的具名导出。

    javascript 复制代码
    // app.js
    import { PI, add } from './math.js'; // 导入多个命名导出
    console.log(PI); // 3.14159
  • 默认导入:导入模块的默认导出。

    javascript 复制代码
    // app.js
    import logger from './logger.js'; // 导入默认导出(可自定义名称)
    logger("Hello World");
  • 混合导入:同时导入默认导出和命名导出。

    javascript 复制代码
    // app.js
    import log, { LOG_LEVEL } from './logger.js'; 
  • 整体导入:导入所有命名导出为一个对象。

    javascript 复制代码
    // app.js
    import * as math from './math.js';
    console.log(math.PI); // 3.14159

2. 导入规则

  • 导入路径可以是相对路径(./../)或绝对路径。
  • 导入的变量是只读引用(不可直接修改导出值)。

四、核心对比

关键字 作用 示例
module 定义一个独立作用域的代码单元 每个 .js 文件默认是一个模块
export 导出模块内容供外部使用 export const name = 'John';
import 引入其他模块的导出内容 import { name } from './module.js';

五、关键细节

1. 默认导出 vs 命名导出

  • 默认导出:适合模块主要功能的单一导出(如工具类、配置对象)。
  • 命名导出:适合导出多个相关功能(如工具函数集合)。

2. 动态导入(Dynamic Import)

使用 import() 函数实现按需加载模块(返回 Promise):

javascript 复制代码
// 动态加载模块(如路由懒加载)
button.addEventListener('click', async () => {
  const module = await import('./module.js');
  module.doSomething();
});

3. 模块的静态分析

  • ES6 模块是静态的(导入/导出必须在顶层作用域,不可动态生成路径)。
  • 静态特性便于打包工具(如 Webpack、Rollup)进行 Tree Shaking(删除未使用代码)。

六、示例:完整模块交互

模块定义(userModule.js):

javascript 复制代码
// 命名导出
export const MAX_AGE = 100;
export function getUserName() { return 'John'; }

// 默认导出
export default class User {
  constructor(name) { this.name = name; }
}

模块导入(app.js):

javascript 复制代码
import User, { MAX_AGE, getUserName } from './userModule.js';

const user = new User('Alice');
console.log(MAX_AGE);       // 100
console.log(getUserName()); // 'John'

七、注意事项

  1. 浏览器中使用 ES6 模块 :需在 <script> 标签添加 type="module"

    html 复制代码
    <script type="module" src="app.js"></script>
  2. Node.js 中使用 ES6 模块 :需将文件后缀改为 .mjs 或在 package.json 中设置 "type": "module"

  3. 避免循环依赖:模块 A 依赖模块 B,模块 B 又依赖模块 A 可能导致错误。


总结

  • module:代码组织的基本单元,提供独立作用域。
  • export:暴露模块功能,支持命名导出和默认导出。
  • import :引入其他模块的功能,支持按需加载和静态优化。
    三者结合,实现代码的高效模块化管理和复用。
相关推荐
天蓝色的鱼鱼1 小时前
shadcn/ui,给你一个真正可控的UI组件库
前端
布列瑟农的星空1 小时前
前端都能看懂的Rust入门教程(三)——控制流语句
前端·后端·rust
Mr Xu_1 小时前
Vue 3 中计算属性的最佳实践:提升可读性、可维护性与性能
前端·javascript
jerrywus1 小时前
我写了个 Claude Code Skill,再也不用手动切图传 COS 了
前端·agent·claude
玖月晴空2 小时前
探索关于Spec 和Skills 的一些实战运用-Kiro篇
前端·aigc·代码规范
子兮曰2 小时前
深入理解滑块验证码:那些你不知道的防破解机制
前端·javascript·canvas
Highcharts.js2 小时前
【Highcharts】如何用命令行渲染导出图片?
javascript·导出·开发文档·highcharts·命令行渲染·命令行功能
会一丢丢蝶泳的咻狗2 小时前
Sass实现,蛇形流动布局
前端·css
攀登的牵牛花2 小时前
前端向架构突围系列 - 状态数据设计 [8 - 4]:有限状态机 (FSM) 在复杂前端逻辑中的应用
前端
Lsx_2 小时前
前端视角下认识 AI Agent 和 LangChain
前端·人工智能·agent