探秘CommonJS:Node.js模块化核心解析

前端Javascript模块化 CommonJS与ES Module区别 ES Module 的静态结构支持编译时删除未使用代码(如 Webpack 的 Tree Shaking),而 CommonJS 因动态加载无法实现此优化。ES Module的普及促使npm生态向ESM迁移,工具链(如Webpack、Rollup、Vite)全面支持ESM,形成从开发到构建的完整解决方案。从“脚本堆砌”到“工程化设计”,模块化推动了组件化开发、Monorepo架构和微前端实践,例如通过Webpack和Vite实现模块联邦与即时编译。模块化通过独立作用域隔离变量,避免全局命名冲突。 阅读详情

CommonJS 是 JavaScript 的模块化规范,主要应用于 服务器端环境(尤其是 Node.js),其核心目标是解决代码组织、依赖管理和作用域隔离问题 。以下是其核心要点:


🔧 一、核心特性

  1. 同步加载
    模块通过 require() 同步加载并执行,后续代码需等待模块加载完成后执行,适用于 I/O 快速的服务器环境(如本地文件读取) 。

  2. 作用域隔离
    每个文件视为独立模块,模块内定义的变量、函数默认私有(不污染全局作用域),仅通过导出接口对外暴露功能 。

    // math.js
    const privateVar = 10; // 私有变量
    module.exports = { add: (a, b) => a + b + privateVar }; // 导出接口
    
  3. 导出与导入语法

    • 导出:使用 module.exports 或 exports 对象(注:exports 本质是 module.exports 的引用) 。
      // 正确导出(推荐直接赋值 module.exports)
      module.exports = { add, subtract }; 
      
      // 或追加属性(避免 exports 被重写)
      exports.add = (a, b) => a + b; 
      
    • 导入:通过 require(模块路径) 同步加载其他模块 。
      const math = require('./math');
      console.log(math.add(1, 2)); // 输出 13(含私有变量值)
      
  4. 缓存机制
    模块首次加载后被缓存,后续调用 require() 直接返回缓存结果,避免重复执行 。可通过 delete require.cache[modulePath] 清除缓存强制重新加载。


⚙️ 二、实现原理

  1. 模块包装
    Node.js 将模块代码包裹在立即执行函数中,注入 module、exports、require 等变量:

    (function(exports, require, module, __filename, __dirname) {
      // 模块代码
    });
    

    从而实现作用域隔离和局部变量私有化 。

  2. 路径解析与加载
    require() 根据路径规则(./、../、绝对路径或核心模块名)定位文件,按 .js → .json → .node 顺序解析,支持目录加载(优先找 package.json 的 main 字段或 index.js) 。

  3. 循环依赖处理
    当模块 A 依赖 B,B 又依赖 A 时:

    • B 加载时会获取 A 的未完成导出对象(此时 A 可能仅执行了部分代码) 。
    • 依赖执行顺序影响导出结果(需合理设计代码结构避免逻辑混乱)。

⚠️ 三、局限性与适用场景

场景优势局限性
服务器端同步加载无阻塞,代码简洁易维护不适用于浏览器(网络请求阻塞)
模块复用清晰的依赖管理,避免全局污染动态导入导致静态分析困难
生态兼容Node.js 原生支持,生态成熟浏览器端需编译工具转换(如 Webpack)

🔄 四、演进与现状

  • 历史地位:CommonJS 填补了服务端 JavaScript 模块化的空白,成为 Node.js 的基石 。
  • 现代替代:ES Modules(ESM)凭借静态分析、异步加载等优势成为语言标准,逐步取代 CommonJS 。
  • 过渡方案:Node.js 支持 .mjs 扩展名或 package.json 的 "type": "module" 启用 ESM,同时兼容 CommonJS 语法 。

💡 总结:CommonJS 是服务器端模块化的经典方案,其同步加载、闭包隔离和缓存机制高效支撑了 Node.js 生态,但浏览器兼容性不足推动 ESM 成为未来主流 。

OpenClaw实战系列06:持久记忆与RAG知识库构建——让AI真正“记住”你 本文介绍了OpenClaw AI助理的持久记忆与RAG知识库构建功能。OpenClaw采用"文件即真理"的独特设计,所有记忆都以Markdown文件形式存储,支持直接编辑和Git版本管理。记忆系统分为三层:长期精炼记忆(MEMORY.md)、日常日志(按日期存储)和归档记忆。文章详细说明了环境配置步骤,包括安装必要组件、创建目录结构、设置API密钥,并提供了OpenClaw主配置文件的完整参数说明。该系统实现了跨会话、跨平台的持久化记忆,使AI助理能真正理解用户需求。 阅读详情

相关推荐

FX2N-2AD模块实战:从硬件连接到FROM/TO指令编程详解

本文详细解析FX2N-2AD模拟量输入模块的硬件连接与FROM/TO指令编程技巧,涵盖BFM缓冲存储器配置、梯形图程序设计及工程实战经验。通过实例演示如何实现精准信号采集与数据处理,特别针对PLC系统中的常见故障提供解决方案,助力工业自动化工程师高效完成设备调试与维护。

prometheus9mon的博客 507

JavaScript模块化演进:从CommonJS到ES Module的全面解析

JavaScript模块化演进:从CommonJS到ES Module的全面解析

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 3984

BookSim2.0 教程

本文是yz关于BookSim2.0的个人学习经验与教程。 1.介绍 什么是BookSim2.0 BookSim2.0 是周期正确的互联网络模拟器(A Cycle-Accurate Interconnection Network Simulator),被设计用来伴随William James Dally 等人出版的的书籍 Principles and Practices of INterconnection on Networks使用。 此后其功能不断得到扩展。当前的主要版本 BookSim 2.0 支持广泛

更新一些计算机体系架构NoC,GEM5, AXI4,还有machine learning 的日常 5736

【Node.js】CommonJS 模块化规范详解

CommonJS 是一套为 JavaScript 提供模块化支持的规范,它最初的目标是为服务器端 JavaScript 提供模块化机制。Node.js 采用了 CommonJS 作为其模块系统的基础,帮助开发者更好地组织代码,避免命名冲突,同时支持模块重用。CommonJS 是 Node.js 的核心模块化规范,提供了简单易用的模块导入导出方式。虽然随着 ES Modules 的普及,前端领域逐渐转向使用 ESM,但在服务器端开发中,CommonJS 依然占据重要地位。

lph159的博客 3555

人形机器人专题:人形机器人关节,从Optimus选型看关节的发展

今天分享的是深度研究报告:《(报告出品方:中泰页。

GPT20236688的博客 3223

内存|内存的概念、内存的作用、内存的物理结构及内存使用

内存是硬件,是用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理。内存是与CPU沟通的桥梁,计算机中所有程序的运行都要依靠内存,内存对计算机的影响非常大。本文简单介绍了内存的概念、作用、物理结构以及使用,内存远不止如此,后续文章会逐步深入讲解。

qq_59938293的博客 2万+

JavaScript模块化Exports&Import:从ES6到CommonJS,电商项目实战解析

🔥 彻底搞懂JavaScript模块化!本文深度解析ES6模块和CommonJS的差异与实战应用,通过一个完整的电商商品管理系统案例,展示如何优雅地组织前端代码。包含命名导出/默认导出的最佳实践、动态导入技巧、Node.js中的模块配置,以及TypeScript类型定义的实际运用。

肖哥弹架构博客 1168

电子数据取证实战:从“平航杯”竞赛看计算机检材分析的关键技术与案例解析

本文通过'平航杯'电子数据取证竞赛案例,深入解析计算机检材分析的关键技术,包括USB设备追踪、浏览器历史分析、AI换脸取证、虚拟货币交易追踪等实战技巧。重点探讨了数字痕迹的发现与关联,以及电子取证工具链的应用,为从业人员提供实用的技术参考和案例分析。

www00的博客 536

Node.js--CommonJS 模块化规范详解:使用方法、缓存机制与模块解析

Node.js 中的 CommonJS 模块化规范是最常用的模块化方式,它通过 module.exports 导出模块内容,require 导入模块内容,帮助开发者将代码拆分成多个独立的模块。本文详细介绍了 CommonJS 的基本用法,包括如何使用 module.exports 导出对象、函数、类等,如何使用 require 导入模块,以及模块的缓存机制。我们还讨论了 exports 和 module.exports 的区别,强调不能直接赋值 exports,否则会导致模块导出失败。

2402_84971234的博客 1640

30天入门 SAP BTP 开发系列之三:了解 SAP BTP Global Account 的概念

90天之后 Trial 账号会被删除,该账号在 SAP BTP 上创建的内容会被清空,不过我们可以再创建一个新的 Tria 账号。本文简单介绍了 SAP BTP 里 Global Account 的概念,下一篇文章我会介绍 SAP BTP 控制台里和 Global Account 相关的一些操作。,创建 SAP BTP 的 Trial,在可选 Region 列表里,在两个可选项中二选一,选择了。或订阅合同时,SAP BTP 会在后台为其生成一个对应的。在企业拥抱云原生架构的过程中,SAP BTP 的。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 999

【NodeRed】node-red-contrib-opcua实现PLC读写

在之前的博文【Node-RED】node-red-contrib-opcua-server模块使用(1)中,我们介绍了用node-red-contrib-opcua-server模块实现OPCUA服务端的,以及二次开发的内容。本节博文中我们采用官方社区自带的node-red-contrib-opcua组件开展对OPCUA客户端的介绍,详细阐述用该组件中OpcUa-Client节点实现客户端对PLC的读写,以及实现过程中遇到的问题。由于官方社区中并没有找到该组件的介绍实例,这也是本博文编写的第1个原因。

weixin_48618536的博客 957

JavaScript模块化演变史(CommonJS核心原理大揭秘)

掌握JavaScript模块化演进关键,深入解析CommonJS用法及其核心原理。适用于Node.js开发场景,通过require和module.exports实现模块加载与导出,提升代码复用性与维护性。原理清晰、实践性强,值得收藏。

CodeNexus的博客 991

密码学系列3-Elgamal加密及其IND-CPA安全性证明

但这没有任何影响,敌手本身就只能知道公钥,他并没有能力知道挑战者是否知道对应的私钥。所以上述整个游戏就是一个模拟实验,敌手无法区分挑战者运行的是这个模拟实验,还是真正的按照第一节的算法构造的实验(挑战者知道私钥…为什么合起来的时候有1/2:因为T既可能是随机的也可能是g^{ab},这两种情况概率为1/2。能够攻破Elgamal加密方案,那么挑战者利用敌手的能力构建下面游戏,来求解困难性问题DDH。就是挑战者选的随机数,虽然挑战者自己也不知道。),否则挑战者输出0,作为DDH的回答。

qq_41359358的博客 1249

从CommonJS到ESM:Node.js服务端应用的模块化革命

ESM不是“换个写法”,而是要求你从动态运行时思维转向静态设计思维。它让代码更可预测、更易优化,与现代前端生态无缝融合。Node.js官方已将ESM作为未来方向(v20+将默认启用),现在正是拥抱它的黄金期。

JakeMa1024的博客 2082

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ES6的模块化和commonJS的模块化有什么区别?

ES6模块更适合于现代JavaScript开发,具有静态分析、支持异步加载、模块化和更清晰的语法。CommonJS模块主要用于Node.js环境,特点是同步加载、动态模块解析,适用于服务器端开发,但不太适合浏览器环境,除非通过打包工具进行转换。两者各有优缺点,通常在浏览器环境中使用 ES6 模块,在Node.js中则更常用 CommonJS,但在现代应用中,尤其是配合构建工具(如 Webpack、Babel)时,ES6 模块正逐渐成为标准。

dzhnb的博客 1592

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

深入理解 Node.js 模块化(CommonJS):原理、用法与避坑指南

虽然现在 Node.js 也支持 ES Modules,但是掌握 CommonJS 仍然是 Node.js 开发者的必备技能!

weixin_44732078的博客 1361

深入浅出 Node.js 模块机制:CommonJS 与 ES Modules 的对比

Node.js 的模块化机制从最初的 CommonJS 发展到如今的 ES Modules,展现了 JavaScript 的演进历程。在开发中,应根据项目需求选择合适的模块机制,同时为未来的迁移留足空间。模块机制虽小,却影响深远。希望本文能帮助你更好地理解并运用 Node.js 的模块系统!

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 1310

Node.js 中模块化

Node.js 中模块化

m0_61787196的博客 1038

Cookies.js 模块化架构:AMD、CommonJS、Node.js环境适配指南

Cookies.js是一款轻量级的JavaScript客户端Cookie操作库,通过模块化架构设计实现了对AMD、CommonJS和Node.js等多种环境的无缝适配。本文将深入解析其跨环境兼容的实现原理,帮助开发者快速掌握在不同项目架构中集成和使用Cookies.js的最佳实践。 ## 📦 模块化架构设计解析 Cookies.js采用UMD(Universal Module Definit

gitblog_00329的博客 913

JavaScript模块化-CommonJS规范

到底什么是模块化、模块化开发呢?事实上模块化开发最终的目的是将程序划分成一个个小的结构;这个结构中编写属于自己的逻辑代码,有自己的作用域,定义变量名词时不会影响到其他的结构;这个结构可以将自己希望暴露的变量、函数、对象等导出给其结构使用;也可以通过某种方式,导入另外结构中的变量、函数、对象等;上面说提到的结构,就是模块;按照这种结构划分开发程序的过程,就是模块化开发的过程;无论你多么喜欢JavaScript,以及它现在发展的有多好,它都有很多的缺陷:对于早期的JavaScript没有模块化来说,确确实实带来

m0_71485750的博客 870

模块化开发:当CommonJS遇见ES Module

本文对比了JavaScript的两种模块化方案:CommonJS和ES Module。CommonJS是Node.js默认的同步加载模块系统,适合服务器端开发;ES Module则是ES6引入的异步加载标准,支持静态分析和实时绑定,是现代前端开发的首选。文章详细解析了两者的语法特点、加载机制、适用场景及互操作性,并提供了实践建议:新项目优先使用ES Module,Node.js项目可逐步迁移,库开发建议双模式支持。通过乐高积木的类比,生动说明了模块化对代码组织和维护的重要性。

坚持不懈 一往无前 1478

HoRain云--Node.js模块化终极指南:CommonJS vs ESM

本文对比了CommonJS和ESModule两种JavaScript模块化方案的核心差异与使用场景。从加载机制(运行时动态 vs 编译时静态)、导出行为(值拷贝 vs 值引用)、循环依赖处理等维度进行解析,指出ESM更适合现代开发,支持Tree-Shaking优化和浏览器原生加载。对于Node.js项目,建议新项目启用ESM,旧项目保持CommonJS兼容。文章还提供了Node.js中混用两种模块的示例代码,帮助开发者根据实际需求选择合适的模块化方案。

2401_86544677的博客 1007

Node.js 模块化规范详解

Node.js支持CommonJS和ECMAScript Modules(ESM)两种模块规范。CommonJS通过require()同步加载模块,适合服务端开发;ESM使用import/export语法,支持异步加载,是JavaScript官方标准。两种规范在文件后缀(.js/.mjs)和package.json配置上有所区别,可以互相调用但存在限制。新项目推荐使用ESM以获得更好的未来发展支持,而旧项目或依赖兼容性需求可能仍需使用CommonJS。

分享前端工程化、AI 应用、Agent 开发与大模型实践! 1229

Node.js中解释CommonJS模块系统

CommonJS是一种旨在解决JavaScript作为服务器端语言在模块化编程方面局限性的规范。Node.js是CommonJS成功应用的代表,这使得CommonJS模块系统成为Node.js开发的重要组成部分。在CommonJS模块系统中,每个文件被看作是一个独立的模块。模块具有私有的作用域,即模块内部定义的变量不会泄露到全局作用域中。这种机制有效地避免了变量命名冲突和污染全局环境。私有作用域的示例:config.js// 导出数据库配置server.js${

有我更精彩的博客 1255

ES6 模块化 与 CommonJS 的核心概念解析

掌握 ES6 模块化与 CommonJS 的核心差异,能帮助你在不同场景下合理选择模块系统,优化代码结构并避免常见陷阱(如循环依赖、内存泄漏)。掌握 ES6 模块化与 CommonJS 的核心差异,能帮助你在不同场景下合理选择模块系统,优化代码结构并避免常见陷阱(如循环依赖、内存泄漏)。:导出的是值的引用,导入和导出指向同一内存地址。:导出的是值的引用,导入和导出指向同一内存地址。:导出的是值的拷贝,后续修改不影响原始值。:导出的是值的拷贝,后续修改不影响原始值。:静态加载可能导致未初始化引用错误。

SUNGUOGUO1的博客 847

JavaScript模块化终极指南:从CommonJS到ESM的完整演进解析

在现代前端开发中,**JavaScript模块化**是每个开发者必须掌握的核心技能。从最初的CommonJS到如今的ES Modules(ESM),前端模块化经历了革命性的演进过程,彻底改变了我们组织和管理代码的方式。🔥 ## 📈 前端模块化演进历程 JavaScript模块化的发展可以分为几个重要阶段: **1. 无模块化时代** 在早期JavaScript中,代码通常通过全局变量和函

gitblog_00333的博客 768

node.js中使用jquery

首先需要jquery以及jsdom。

wno704的博客 403
上一篇: 前端模块化开发实战指南
下一篇: ES6模块详解:核心语法与最佳实践
代码的余温
博客等级 码龄2年 1149粉丝 207原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码的余温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值