JavaScript 模块化语法 import、export示例详解

 更新时间:2025年04月01日 11:52:00   作者:女巫的黑猫  
ES6 模块化 (import / export) 是 JavaScript 官方推荐的模块化方案,解决了 代码复用、作用域管理、依赖管理 等问题,本文给大家介绍了JavaScript 模块化语法 import、export示例代码,感兴趣的朋友一起看看吧

JavaScript 模块化语法 import、export 详解

1. 为什么需要模块化?

在 JavaScript 早期,所有代码都是写在一个 全局作用域 中,这样做的问题是:

  • 变量污染:所有变量、函数都是全局的,容易互相干扰。
  • 文件依赖管理困难:多个 JS 文件之间的依赖关系混乱,难以维护。
  • 代码复用困难:无法方便地拆分和复用代码。

为了解决这些问题,模块化 方案应运而生。

2. JavaScript 模块化的发展

2.1 早期的模块化方案

在 ES6 之前,JS 主要依赖以下方案进行模块化:

  • IIFE(立即执行函数表达式):用函数封装代码,避免污染全局变量。
  • CommonJS(Node.js 使用):
    • require() 引入模块。
    • module.exports 导出模块。
  • AMD(Asynchronous Module Definition)
    • 主要用于浏览器端,使用 define()require() 加载模块(如 RequireJS)。
  • UMD(Universal Module Definition)
    • 兼容 CommonJS 和 AMD,用于同时支持浏览器和 Node.js。

但这些方案都有一定的缺陷,比如 CommonJS 是同步加载的,不适用于浏览器端,AMD 又显得过于复杂。

3. ES6 模块化(ESM)—— import & export

ES6 在 2015 年引入了 importexport 关键字,成为 JavaScript 官方的模块化方案(ECMAScript Modules, ESM)。

3.1 基本用法

ES6 模块化使用 export 导出模块,import 导入模块。

(1)导出模块 (export)

在一个 JavaScript 文件中,我们可以使用 export 关键字导出变量、函数或类。

✅ 导出方式 1:命名导出(Named Export)

// math.js
export const PI = 3.14159;
export function add(a, b) {
    return a + b;
}
export class Calculator {
    multiply(a, b) {
        return a * b;
    }
}

✅ 导出方式 2:默认导出(Default Export)

// greet.js
export default function greet(name) {
    return `Hello, ${name}!`;
}

(2)导入模块 (import)

✅ 导入方式 1:导入命名导出

import { PI, add, Calculator } from './math.js';
console.log(PI); // 3.14159
console.log(add(2, 3)); // 5
const calc = new Calculator();
console.log(calc.multiply(2, 3)); // 6

✅ 导入方式 2:导入默认导出

import greet from './greet.js';
console.log(greet('Alice')); // Hello, Alice!

✅ 导入方式 3:重命名导入

import { add as sum } from './math.js';
console.log(sum(2, 3)); // 5

✅ 导入方式 4:整体导入

import * as MathUtils from './math.js';
console.log(MathUtils.PI); // 3.14159
console.log(MathUtils.add(2, 3)); // 5

4. export 详解

4.1 命名导出(Named Export)

命名导出可以导出多个变量、函数或类:

export const name = 'Alice';
export function greet() {
    return 'Hello!';
}
export class User {}

导入时需要使用 相同的名称

import { name, greet, User } from './module.js';

4.2 默认导出(Default Export)

默认导出通常用于 导出单个模块,例如:

export default function greet() {
    return 'Hello!';
}

导入时可以使用 任何名称

import myGreet from './module.js';
console.log(myGreet()); // Hello!

4.3 默认导出 + 命名导出

export default function main() {
    console.log('Default function');
}
export const version = '1.0';
export function helper() {
    console.log('Helper function');
}

导入:

import main, { version, helper } from './module.js';
main(); // Default function
console.log(version); // 1.0
helper(); // Helper function

5. import 详解

5.1 import 只能在模块顶级使用

import 语句不能放在 条件语句或函数内部,否则会报错:

if (true) {
    import { add } from './math.js'; // ❌ 错误
}

正确用法:

import { add } from './math.js';
if (true) {
    console.log(add(2, 3));
}

5.2 动态导入 import()

ES2020 引入了 动态导入,适用于 按需加载(懒加载)

if (someCondition) {
    import('./math.js').then(({ add }) => {
        console.log(add(2, 3));
    });
}

也可以用 async/await

async function loadMath() {
    const math = await import('./math.js');
    console.log(math.add(2, 3));
}
loadMath();

6. ES6 模块 vs CommonJS

特性ES6 模块(ESM)CommonJS(CJS)
关键字import / exportrequire() / module.exports
运行方式预解析(静态导入)运行时(动态导入)
是否支持顶层导入✅ 是❌ 否
是否支持异步导入import()❌ 仅同步
适用环境浏览器 & Node.js (ESM)Node.js (CJS)
默认方式适用于浏览器和前端Node.js 默认方式

特性ES6 模块(ESM)CommonJS(CJS)关键字import / exportrequire() / module.exports运行方式预解析(静态导入)运行时(动态导入)是否支持顶层导入✅ 是❌ 否是否支持异步导入✅ import()❌ 仅同步适用环境浏览器 & Node.js (ESM)Node.js (CJS)默认方式适用于浏览器和前端Node.js 默认方式

7. 浏览器中如何使用 import / export

7.1 直接使用 <script type="module">

<script type="module">
    import { add } from './math.js';
    console.log(add(2, 3));
</script>

7.2 通过 Webpack / Vite / Rollup

现代前端工具(如 Webpack)可以 打包 ES6 模块 以支持更旧的浏览器:

npm install webpack

8. 结论

  • ES6 模块化 (import / export) 是 JavaScript 官方推荐的模块化方案,解决了 代码复用、作用域管理、依赖管理 等问题。
  • 默认导出 (export default) 适用于导出单个对象或函数。
  • 命名导出 (export {}) 适用于导出多个变量、函数或类。
  • 动态导入 (import()) 可实现 懒加载,适用于按需加载模块。
  • ESM 和 CommonJS 不兼容,但 Node.js 也开始支持 ESM(.mjs 文件)。

相关文章

  • 18个JavaScript编写简洁高效代码的技巧分享

    18个JavaScript编写简洁高效代码的技巧分享

    在这篇文章中,小编将和大家分享18个JavaScript技巧,以及一些你应该知道的示例代码,以编写简洁高效的代码,感兴趣的小伙伴快跟随小编一起学习一下吧
    2024-01-01
  • 功能强大的Bootstrap组件(结合js)

    功能强大的Bootstrap组件(结合js)

    这篇文章主要介绍了功能强大的Bootstrap组件,介绍js结合Bootstrap组件的使用方法,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 微信小程序 仿美团分类菜单 swiper分类菜单

    微信小程序 仿美团分类菜单 swiper分类菜单

    本文主要介绍了微信小程序仿美团分类菜单(swiper分类菜单)的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • 深入理解JavaScript中实例对象和new命令

    深入理解JavaScript中实例对象和new命令

    典型的面向对象编程语言(比如C++和 Java),都有“类”(class)这个概念。所谓“类”就是对象的模板,对象就是“类”的实例,下面这篇文章主要给大家介绍了关于JavaScript中实例对象和new命令的相关资料,需要的朋友可以参考下
    2022-12-12
  • Javascript生成带参数的二维码示例

    Javascript生成带参数的二维码示例

    这篇文章主要给大家介绍了Javascript生成带有参树二维码的方法,实现的方法还是很简单的,有需要的朋友们可以参考借鉴。下面来一起看看吧。
    2016-10-10
  • echarts自定义tooltip中的内容代码示例

    echarts自定义tooltip中的内容代码示例

    在ECharts中,通过formatter函数自定义图例样式,可以实现更灵活的图表展示,满足特定的视觉需求,这篇文章主要介绍了echarts自定义tooltip中内容的相关资料,需要的朋友可以参考下
    2024-10-10
  • JS实现图片预加载之无序预加载功能代码

    JS实现图片预加载之无序预加载功能代码

    这篇文章主要介绍了JS实现图片预加载之无序预加载功能代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-05-05
  • js实现选中页面文字将其分享到新浪微博

    js实现选中页面文字将其分享到新浪微博

    这篇文章主要介绍了js实现选中页面文字将其分享到新浪微博,需要的朋友可以参考下
    2015-11-11
  • javascript设置文本框光标的方法实例小结

    javascript设置文本框光标的方法实例小结

    这篇文章主要介绍了javascript设置文本框光标的方法,结合实例形式总结分析了javascript针对文本框光标的位置、设置及文本操作的相关技巧,需要的朋友可以参考下
    2016-11-11
  • js如何使用Pagination+PageHelper实现分页

    js如何使用Pagination+PageHelper实现分页

    本文主要介绍了js如何使用Pagination+PageHelper实现分页,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论