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

深入解析:深入浅出 ES Module

深入解析:深入浅出 ES Module

概述

在 JavaScript 模块化发展历程中,为解决全局变量污染,代码依赖管理等问题,先后出现了 CommonJS(CJS)、AMD、CMD、UMD、ES6 Module(ESM)五大主流方案。不同方案因设计目标、运行环境(浏览器 / Node)的差异,形成了各自的语法特性与生态定位。

其中ES6 Module是 ES6 官方定义的标准化模块化方案,旨在统一浏览器与服务器端的模块化语法,解决传统模块化方案(如 CommonJS、AMD)的碎片化问题。

核心特性

基础语法

导出(export)

// 模块A:moduleA.js
// 1. 命名导出(方式1:声明时导出)
export const name = 'ES6 Module';
export function add(a, b) {
return a + b;
}
// 2. 命名导出(方式2:集中导出)
const age = 6;
const multiply = (a, b) => a * b;
export { age, multiply as multiplyFn }; // as重命名导出
// 3. 默认导出(方式1:直接导出)
export default class ModuleClass {
constructor() {
this.version = '1.0.0';
}
}
// 4. 默认导出(方式2:先声明后导出)
const defaultObj = { type: 'module' };
export default defaultObj;

导入语法(import)

  • 导入命名成员:需用大括号包裹导入的成员名称,与导出名称一致(可通过as重命名);
  • 导入默认成员:无需大括号,可自定义接收名称;
  • 整体导入:用 * as 模块名 导入整个模块的所有导出成员,访问时需通过 模块名.成员名 的方式;
  • 导入执行:若导入模块仅需执行其代码(如执行初始化逻辑,无需使用其导出成员),可直接使用 import './moduleA.js'。’
// 模块B:moduleB.js
// 1. 导入命名成员(原样接收)
import { name, add } from './moduleA.js';
console.log(name); // 输出:ES6 Module
console.log(add(2, 3)); // 输出:5
// 2. 导入命名成员(重命名接收)
import { age, multiplyFn as multiply } from './moduleA.js';
console.log(age); // 输出:6
console.log(multiply(2, 3)); // 输出:6
// 3. 导入默认成员(自定义名称)
import ModuleClass from './moduleA.js'; // 无需大括号
const instance = new ModuleClass();
console.log(instance.version); // 输出:1.0.0
// 4. 混合导入(命名成员+默认成员)
import ModuleClass, { name as moduleName } from './moduleA.js';
console.log(moduleName); // 输出:ES6 Module
// 5. 整体导入
import * as ModuleA from './moduleA.js';
console.log(ModuleA.name); // 输出:ES6 Module
console.log(ModuleA.add(2, 3)); // 输出:5
console.log(new ModuleA.default().version); // 输出:1.0.0(默认成员需通过.default访问)
// 6. 导入执行
import './moduleA.js'; // 仅执行moduleA.js的代码,不使用其导出成员

模块方案对比

CJS(CommonJS)

Node.js 原生支持的模块化方案,面向服务端,采用运行时动态加载,通过require导入、module.exports导出;

AMD(Asynchronous Module Definition)

面向浏览器端的异步模块化方案,解决浏览器加载模块时 “阻塞页面渲染” 问题,代表实现为 RequireJS;

  • 设计目标
    • 解决浏览器端同步加载模块阻塞页面渲染问题,通过异步方式加载模块,加载完成后执行回调函数;
    • 支持依赖前置(提前声明所有依赖),确保模块执行时依赖已加载完成。
  • 特点
    • 异步加载: 通过 <script> 标签动态创建请求加载模块,加载完成后触发回调函数,不阻塞 HTML 解析与页面渲染;
    • 依赖前置:模块定义时需提前声明所有依赖,如define([‘jquery’], …),RequireJS 会先加载依赖模块,所有依赖加载完成后,再执行当前模块的工厂函数;
    • 运行环境:仅支持浏览器端,Node 端需通过amd-loader等工具转换;
    • 支持多种路径写法:支持相对路径(如./moduleA)、绝对路径(如/js/moduleA)、模块别名(如jquery)。

UMD(Universal Module Definition)

通用模块定义,兼容 ESM、CJS、AMD 三种方案,可在浏览器与 Node 端通用,主要用于第三方库发布。

ESM(ES6 Module)

ES6 官方标准化方案,兼顾浏览器与 Node 端,采用编译时静态加载,支持 Tree-Shaking,通过 import/export 语法实现。

  • 设计目标
    • ES6 官方统一浏览器与 Node 端的模块化方案,解决传统方案碎片化问题;
    • 基于编译时静态加载设计,支持 Tree-Shaking。
  • 特点
    • 编译时静态加载:JavaScript 引擎在编译阶段分析模块依赖,构建依赖树,不执行模块代码,因为是静态编译的时候做了分析,所以很自然的支持 Tree Shaking。
    • 值的引用传递:导入的成员是对导出模块成员的引用,若导出模块修改非const变量,导入模块会同步变化。
    • 默认启用严格模式:禁止未声明的变量使用。
http://www.jsqmd.com/news/326436/

相关文章:

  • 2026年福建营销推广公司推荐:五大优选机构技术、模式与效果全解析
  • 2026年新疆营销策划公司推荐:覆盖乌鲁木齐与各地州场景的深度服务评测
  • SQL 注入深度解析,这一篇就够了!
  • 技术赋能与效果归因双轮驱动 | 2026年福建营销推广公司TOP5实证研究榜单推荐
  • BUUCTF刷题MISC[一] (29-32)
  • 2026年湖南营销推广公司推荐:五大权威评测榜单与全域增长选型终极指南
  • 2026年福建营销推广公司推荐与排名:全域智能运营时代的技术驱动型伙伴全景评测
  • 2026年天津青少年法治教育展厅价格多少,三月雨收费详情
  • FY_Layout概述与入门
  • 2026年市场上诚信的黄麻榻榻米床垫品牌推荐榜,实现理想的睡眠体验
  • 2026年树脂行业新风向,这些企业引领市场潮流,国产MBR膜/医疗实验室污水处理设备/纯水反渗透膜,树脂实力厂家哪家权威
  • 2026年广东营销推广公司权威测评报告:基于百家客户匿名反馈的口碑深度解析
  • 解析muduo源码之 ThreadLocal.h
  • 2026年浙江营销推广公司甄选指南:技术驱动与全域增长落地全景解析
  • 靠谱的生物显微镜厂家中上海炳宇光学厂口碑排名情况如何
  • 2026年广东营销推广公司推荐:基于实战案例与稳定性的TOP5权威榜单
  • 2026年福建营销推广公司推荐:全域增长场景深度评测与权威排名解析
  • 【小程序毕设源码分享】基于springboot+小程序的个人运动健康管理平台的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 收藏备用|非AI程序员也能零门槛上手!腾讯IMA平台靠RAG技术搭建专属大模型知识库
  • 2026年山西广告公司推荐与评价:技术驱动与本地深耕的五大服务商解析
  • 2026年福建营销推广公司专项测评及排名报告:权威选型指引
  • 永磁同步电机谐波注入、谐波抑制5/7次谐波电流,MATLAB simulink仿真模型。 欢迎...
  • 如何为辽宁企业选营销伙伴?2026年营销策划公司全面评测与推荐,直击本地适配痛点
  • Markdown 中, KaTeX 排版特效样例
  • 2026年哪些保健品能提高免疫力?
  • 2026年河北广告公司推荐:河北各地市企业适配性全面排名,解决预算有限与效果模糊痛点
  • 如何为不同场景选广告公司?2026年山西广告公司全面评测与推荐,直击效果与预算痛点
  • 智能体Agent开发
  • 2026年北京、天津等地青少年法治教育展厅设计公司排名及推荐
  • WIN 键失效问题