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

相关推荐
笨蛋©10 小时前
[实战] 制造业质量控制中气泡图(Balloon Drawing)的标准化生成与检验计划集成
ai·数字化·质量管理·制造业·图纸识别
狒狒热知识10 小时前
媒体发稿软文营销行业价值升级从简单发稿到品牌全案传播服务进化
大数据·人工智能
数字供应链安全产品选型10 小时前
2025年Gartner中国安全技术成熟度曲线解读:软件供应链安全从“过热”到“落地”的演进之路
人工智能·web安全·单元测试·软件供应链安全
jarvisuni10 小时前
Claude Code的六种种授权模式!安全和效率控制
人工智能
必胜刻10 小时前
Go 调用Coze工作流实现 AI 游戏生成
开发语言·ai·golang·gin
南屹川10 小时前
【数据库】Elasticsearch实战:从入门到精通
人工智能
2601_9578848410 小时前
多平台自媒体内容矩阵的AI调度引擎:从账号管理到线索闭环的全链路技术拆解
人工智能·矩阵·媒体
刘一说10 小时前
AI科技热点日报 | AI Daily Report
人工智能·科技
财经资讯数据_灵砚智能10 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年5月23日
大数据·人工智能·python·信息可视化·自然语言处理