JavaScript模块化有ES6(静态、活绑定、编译时加载)和CommonJS(动态、值拷贝、运行时加载)两大体系,二者在加载时机、导出机制、循环依赖处理及环境支持上存在本质差异。
JavaScript模块化经历了从无到有、从手动管理到标准统一的过程。ES6模块(import/export)是语言原生支持的标准化方案,而CommonJS(require/module.exports)是Node.js早期采用的运行时模块系统,二者在设计目标、加载机制和使用场景上有本质差异。
ES6模块在代码解析阶段就确定依赖关系,即“静态分析”,所有import必须位于顶层作用域,不能放在条件语句或函数中。这使得工具可以做摇树优化(tree-shaking)、提前报错和跨文件类型推导。
CommonJS则是在代码执行时动态加载,require()可以出现在任意位置,甚至可拼接路径、配合变量使用,灵活性高但牺牲了静态可分析性。
import x from './a.js' —— 必须写死路径,不可动态const x = require('./' + name) —— CommonJS允许这种动态引入ES6模块导出的是**活绑定(live binding)**:导出的变量与原始模块内部保持同步。如果模块A导出一个对象,模块B导入后修改该对象属性,模块A内部也能感知变化。
立即学习“Java免费学习笔记(深入)”;
CommonJS导出的是**值的浅拷贝**(更准确说是导出时module.exports指向的对象快照)。后续对原对象的重新赋值不会影响已导入的引用,但对象内部属性的修改仍可见(因为是同一内存地址)。
export let count = 0; setTimeout(() => count++, 100); 导入方会看到更新后的值module.exports = { count: 0 }; 后续改写module.exports = { count: 1 },老导入不受影响ES6模块在遇到循环导入时,会返回一个**未初始化的空模
块对象**,待模块执行完毕再填充导出内容。若访问尚未执行完的导出值,会报undefined或ReferenceError(取决于是否已声明)。
CommonJS在循环require时,直接返回当前模块已执行部分的exports对象(可能是不完整的),因此更易出现undefined属性,但通常不会报错。
{}或undefined
require('./b')可能拿到B中已赋值的部分exports,比如{ init: fn },即使B还没执行完现代浏览器原生支持type="module"脚本,Node.js自v12起默认启用ESM(需.mjs扩展名或"type": "module"字段)。但CommonJS仍是Node生态大量包的基础格式。
两者不能直接混用:import不能直接导入CommonJS模块的require结果,反之亦然。Node提供createRequire和import.meta.resolve等API辅助桥接,打包工具(如Webpack、Vite)则通过自动包装实现兼容。
import pkg from 'pkg',Node会自动适配(前提是包有exports字段声明)await import()动态导入,不能用require()
不复杂但容易忽略。理解差异有助于避开构建报错、循环依赖陷阱和意外的值不更新问题。
# javascript
# es6
# java
# js
# node.js
# node
# vite
# 浏览器
# 工具
# ai
# 区别
# 作用域
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
c++如何获取map中所有的键_C++遍历键值对提取所有key的方法
为什么Go需要go mod文件_Go go mod文件作用说明
如何用::实现单例模式_php静态方法与作用域操作符应用【技巧】
c++ namespace命名空间用法_c++避免命名冲突
Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡时长设置【步骤】
Win11怎样安装微信开发者工具_Win11安装开发者工具教程【步骤】
php打包exe后无法读取环境变量_变量配置方法【教程】
如何使用Golang捕获并记录协程panic_保证主程序稳定运行
如何在Golang中写入JSON文件_保存结构体数据到文件
VSC怎么快速定位PHP错误行_错误追踪设置法【方法】
Win11鼠标灵敏度怎么调 Win11鼠标指针移动速度设置【教程】
php接口返回数据乱码怎么办_php接口调试编码问题解决【指南】
Win11视频默认播放器怎么改_Win11关联第三方播放器【步骤】
php和redis连接超时怎么办_phpredis调试连接问题汇总【指南】
Win11怎么制作U盘启动盘_Win11原版系统安装盘制作【详解】
Win11怎么打开旧版计算器_Win11恢复传统计算器应用【详解】
Win11怎么设置默认终端应用_Windows11开发者选项终端
Windows10电脑怎么设置防火墙出站规则_Win10禁止程序联网教程
Windows10怎么查看硬件信息_Windows10硬件信息查询方法【指南】
php订单日志怎么记录评价_php记录订单评价日志方法【方法】
Win11怎么设置环境变量_Win11配置Path路径变量【详解】
php文件怎么变mp4保存_php输出视频流保存为mp4操作【操作】
零基础学会Python自动化办公_高效处理Excel与PDF文档
Python数据挖掘进阶教程_分类回归与聚类案例解析
PHP主流架构怎么监控运行状态_工具推荐【操作】
Win11怎么更改鼠标指针_Windows 11自定义鼠标样式与大小【美化】
如何在Golang中理解指针比较_Golang地址比较与相等判断
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
PHP cURL GET请求:正确设置请求头与身份认证的完整教程
PythonDocker高级项目部署教程_多容器管理与CI/CD流水线
Windows怎样关闭Edge新标签页广告_Windows关闭Edge新标签页设置【步骤】
Mac如何修改Hosts文件?(本地开发与屏蔽网站)
Mac版Final Cut Pro入门_Mac视频剪辑基础操作【教程】
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
Mac如何查看电池健康百分比_Mac系统信息电源检测
PHP接收参数值为空怎么办_判断和处理空参数方法说明【说明】
Python函数接口文档化_自动化说明【指导】
英国搜索:多数英国人认为语言搜索是未来搜索
Win10怎么限制单程序CPU占用上限_Win10任务管理器亲和性或第三方工具均衡负载【技巧】
如何在 Go 中正确反序列化 XML 多节点数组(解决仅解析首个元素的问题)
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
Win11声音忽大忽小怎么办 Win11音频增强功能关闭教程【修复】
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
php嵌入式需要什么环境_搭建php+linux嵌入式开发环境【详解】
Win10怎样安装Excel数据分析工具_Win10安装分析工具包步骤【教程】
php打包exe如何加密代码_防反编译保护方法【技巧】
php控制舵机角度怎么调_php发送pwm信号控制舵机转动【解答】
如何使用Golang encoding/json解析JSON_Golang encoding/json解析与序列化示例
Python异步编程高级项目教程_asyncio协程任务管理实战
Win10文件历史记录怎么用 Win10开启自动备份文件教程【防丢】
2026-01-03
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。