news 2026/5/24 1:03:00

ES 模块:JavaScript 模块化的标准方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ES 模块:JavaScript 模块化的标准方案

ES 模块:JavaScript 模块化的标准方案

什么是 ES 模块?

ES 模块(ES Modules,简称 ESM)是 ECMAScript 2015(ES6)引入的官方模块化规范。

ES 模块 vs CommonJS

特性CommonJSES Modules
加载方式同步异步
执行时机运行时编译时
导出module.exportsexport
导入require()import
顶层 thismodule.exportsundefined

基本用法

导出

// utils.js // 命名导出 export const PI = 3.14159; export function add(a, b) { return a + b; } // 默认导出 export default function greet(name) { return `Hello, ${name}!`; }

导入

// main.js // 导入命名导出 import { PI, add } from './utils.js'; // 导入默认导出 import greet from './utils.js'; // 重命名导入 import { add as sum } from './utils.js'; // 导入所有 import * as utils from './utils.js';

动态导入

// 动态加载模块 async function loadModule() { const module = await import('./utils.js'); console.log(module.add(2, 3)); } // 条件加载 if (condition) { import('./feature.js').then(module => { module.init(); }); }

模块解析

文件扩展名

// 必须包含扩展名 import { func } from './utils.js'; // 不能省略 import { func } from './utils'; // ❌

绝对路径

// 从 node_modules 导入 import React from 'react'; // 绝对路径导入 import { utils } from '/path/to/utils.js';

模块作用域

// 模块顶层变量不会污染全局作用域 const privateVar = 'secret'; // 只有导出的内容才能被外部访问 export const publicVar = 'public';

循环依赖

// a.js import { b } from './b.js'; export const a = 'a'; // b.js import { a } from './a.js'; export const b = 'b';

在浏览器中使用

<script type="module" src="main.js"></script>
// main.js import { greet } from './utils.js'; console.log(greet('World'));

在 Node.js 中使用

{ "type": "module" }
// package.json 设置后可以使用 ESM import fs from 'fs'; import path from 'path';

模块打包

Webpack 配置

module.exports = { entry: './src/main.js', output: { filename: 'bundle.js' }, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: 'babel-loader' } ] } };

Rollup 配置

export default { input: 'src/main.js', output: { file: 'dist/bundle.js', format: 'esm' } };

最佳实践

1. 保持导出简洁

// ❌ 不好:导出过多 export const a = 1; export const b = 2; export const c = 3; // ✅ 好:按需导出 export { a, b } from './constants.js'; export { default as c } from './c.js';

2. 使用命名导出

// ✅ 推荐:命名导出便于 tree-shaking export function util1() {} export function util2() {}

3. 避免循环依赖

// ❌ 不好:循环依赖 // a.js import { b } from './b.js'; // b.js import { a } from './a.js';

总结

ES 模块为 JavaScript 提供了标准化的模块化方案:

  1. 静态分析:支持 tree-shaking
  2. 异步加载:更好的性能优化
  3. 标准规范:跨平台兼容
  4. 清晰语义:明确的导入导出语法

掌握 ES 模块是现代前端开发的必备技能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/24 0:57:14

大气层Atmosphere系统深度解析:解锁Switch潜能的终极技术指南

大气层Atmosphere系统深度解析&#xff1a;解锁Switch潜能的终极技术指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable Atmosphere大气层系统作为Nintendo Switch最稳定、功能最丰富的定…

作者头像 李华
网站建设 2026/5/24 0:56:22

LeetCode 930:和相同的二元子数组 | 前缀和与哈希表

LeetCode 930&#xff1a;和相同的二元子数组 | 前缀和与哈希表 引言 和相同的二元子数组&#xff08;Binary Subarrays With Sum&#xff09;是 LeetCode 第 930 题&#xff0c;难度为 Medium。题目要求在二元数组&#xff08;元素只有 0 和 1&#xff09;中找出子数组和等于 …

作者头像 李华
网站建设 2026/5/24 0:47:28

AI知识管理不是工具升级,而是教学主权重构:一位特级教师用18个月完成“教案→知识流→认知干预”三级跃迁(全程数据脱敏实录)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI知识管理在教育领域的应用 AI知识管理正深刻重塑教育生态&#xff0c;通过智能索引、语义理解与个性化推荐&#xff0c;将碎片化教学资源转化为可检索、可推理、可演化的结构化知识网络。教师可借助自…

作者头像 李华
网站建设 2026/5/24 0:45:13

3分钟搞定Windows桌面整理:NoFences免费开源工具终极指南

3分钟搞定Windows桌面整理&#xff1a;NoFences免费开源工具终极指南 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否每天都要在杂乱的Windows桌面上寻找文件&#xff…

作者头像 李华
网站建设 2026/5/24 0:37:12

书匠策AI:你的毕业论文“导航仪“已上线,全程带飞不迷路!

各位正在和毕业论文"死磕"的同学们&#xff0c;今天这篇内容&#xff0c;可能会刷新你对"写论文"这件事的认知。 先问大家一个扎心的问题&#xff1a;你写论文的时候&#xff0c;有没有一种在迷宫里转圈的感觉&#xff1f; 选题不会选&#xff0c;转圈&am…

作者头像 李华