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

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

什么是 ES 模块?

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

ES 模块 vs CommonJS

特性 CommonJS ES Modules
加载方式 同步 异步
执行时机 运行时 编译时
导出 module.exports export
导入 require() import
顶层 this module.exports undefined

基本用法

导出

javascript 复制代码
// utils.js

// 命名导出
export const PI = 3.14159;
export function add(a, b) {
  return a + b;
}

// 默认导出
export default function greet(name) {
  return `Hello, ${name}!`;
}

导入

javascript 复制代码
// 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';

动态导入

javascript 复制代码
// 动态加载模块
async function loadModule() {
  const module = await import('./utils.js');
  console.log(module.add(2, 3));
}

// 条件加载
if (condition) {
  import('./feature.js').then(module => {
    module.init();
  });
}

模块解析

文件扩展名

javascript 复制代码
// 必须包含扩展名
import { func } from './utils.js';

// 不能省略
import { func } from './utils'; // ❌

绝对路径

javascript 复制代码
// 从 node_modules 导入
import React from 'react';

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

模块作用域

javascript 复制代码
// 模块顶层变量不会污染全局作用域
const privateVar = 'secret';

// 只有导出的内容才能被外部访问
export const publicVar = 'public';

循环依赖

javascript 复制代码
// a.js
import { b } from './b.js';
export const a = 'a';

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

在浏览器中使用

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

在 Node.js 中使用

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

模块打包

Webpack 配置

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

Rollup 配置

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

最佳实践

1. 保持导出简洁

javascript 复制代码
// ❌ 不好:导出过多
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. 使用命名导出

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

3. 避免循环依赖

javascript 复制代码
// ❌ 不好:循环依赖
// a.js
import { b } from './b.js';

// b.js  
import { a } from './a.js';

总结

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

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

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

相关推荐
Godspeed Zhao1 小时前
Level 4自动驾驶系统设计1——功能与场景1
人工智能·机器学习·自动驾驶
ACP广源盛139246256731 小时前
IX6012 PCIe 交换芯片@ACP#RTX Spark 入门级 12 口存储外设扩展方案(对比 ASM1812)
大数据·人工智能·分布式·嵌入式硬件·gpt·spark·电脑
丨白色风车丨1 小时前
OpenCV 实战入门:轮廓检测、模板匹配与命令行参数解析
人工智能·opencv·计算机视觉
zhangfeng11331 小时前
workbuddy 结合deepseekv4-flash 安装打印机 hp laster jet 3050
人工智能·workbuddy
爱看科技2 小时前
三星提速开启AI转型,英伟达/WIMI微美全息推进AI算力建设需求持续旺盛
人工智能
dog2502 小时前
信号权重和流分类的对数规律
人工智能·分类·数据挖掘
道一云黑板报2 小时前
告别提示词工程:为什么“循环工程”才是 AI 编程的未来?
人工智能·驱动开发·软件工程·ai编程
实在智能RPA2 小时前
大模型驱动航班规划实战:2026年企业级Agent重塑航空业调度逻辑
人工智能·ai
叫我:松哥2 小时前
基于Python的共享单车租赁数据分析与预测系统,技术栈flask+boostrap+随机森林+XGBoost
人工智能·python·深度学习·算法·随机森林·数据分析·flask
ShyanZh2 小时前
【skill】HTML PPT Skill:用 Claude Code 一句话生成专业演示文稿
前端·ai·html·powerpoint·skill