当前位置: 首页 > news >正文

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 模块是现代前端开发的必备技能。

http://www.jsqmd.com/news/874246/

相关文章:

  • 小波分析多尺度数据融合算法应用【附算法】
  • Harness与Agent SDK的边界划分:最佳实践
  • 学 Simulink—— 双定子永磁同步电机(DS‑PMSM)的协同控制与转矩提升仿真(带 MATLAB 脚本(直接运行))
  • 2026年5月陕西控制电缆采购聚焦:西安华联电力电缆有限公司为何成为优选 - 2026年企业推荐榜
  • 回归模型.
  • 2026酒店民宿装修设计优质服务商推荐指南:厂房装修设计、商业空间装修设计、四川公装公司、四川公装装修公司、展厅装修设计选择指南 - 优质品牌商家
  • 5分钟搞定视频号批量下载:开源工具让效率提升20倍
  • 如何高效使用Obsidian Text Generator插件:实战进阶指南
  • 国曙GOSHINE正式亮相:一家人力资源服务机构的“长期主义”转向!
  • 绵阳本地围栏厂家实测排行:绵阳庭院大门厂家、绵阳快速卷闸门厂家、绵阳智能门窗、绵阳智能门窗厂家、绵阳水晶卷帘门厂家选择指南 - 优质品牌商家
  • Rust Trait系统设计模式:实现灵活的多态和代码复用
  • 2026荣县名表回收优质商家推荐榜:自贡名表回收、荣县黄金回收、金条黄金回收电话、附近黄金回收、高价名表回收、高价黄金回收选择指南 - 优质品牌商家
  • LeetCode 1424:对角线遍历 II | 前缀和分组
  • AI系列【仅供参考】:TRAE 支持自定义模型了,配置个 DeepSeek V4 试试
  • 【应用实战】基于Dify与多Agent的凭证与档案管理
  • API接口签名验证实战
  • 【火电机组、风能、储能】高比例风电电力系统储能运行及配置分析(Matlab代码实现)
  • 数据科学实践案例与项目管理
  • 大模型从0训练LLaMA全流程实战——基于昇腾910B集群
  • JWT令牌安全实践详解
  • AI系列【仅供参考】:周末用笔记本搞点大事:手把手教学部署 1.5、7B 版本 DeepSeek 智能助手
  • 黄仁勋放话:AI基建要烧掉4万亿美元 谁买单?
  • LeetCode 930:和相同的二元子数组 | 前缀和与哈希表
  • 从微服务到 Agent 服务:架构思维的迁移
  • 微服务安全防护实战:OAuth2与JWT鉴权
  • 【带RL负载的全波桥式整流器】功能齐全的单相非控整流器(Simulink)
  • 运维系列虚拟化系列OpenStack系列【仅供参考】:创建 VXLAN - 每天5分钟玩转 OpenStack(111)部署 instance 到 VXLAN - 每天5分钟玩转 OpenSt
  • LeetCode 1314:矩阵区域和 | 二维前缀和
  • 3分钟解决Mac与Windows文件交换难题:Nigate免费NTFS读写工具完全指南
  • 吴恩达:2026年是AI的黄金时代?普通人如何抓住最后上车窗口?