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

CommonJS 功能介绍

CommonJS是JavaScript的模块化规范,主要用于服务器端(如Node.js)的模块化开发,其核心功能和特点如下:

一、核心功能

  1. 模块定义与导出

    • module.exports:用于导出模块的内容,可以是函数、对象、变量等。例如:
      module.exports = function(a, b) { return a + b; }; // 导出单个函数
      module.exports = { add, subtract }; // 导出多个方法[^1^][^4^]
      
    • exportsmodule.exports的简写引用,用于简化导出操作。例如:
      exports.sayHello = function(name) { return `Hello, ${name}`; }; [^4^]```
  2. 模块导入

    • require():同步导入模块并返回其导出的内容。例如:
      const math = require('./math'); // 导入整个模块
      const { add } = require('./math'); // 解构导入[^1^][^4^]
      

二、关键特点

  1. 同步加载

    • 模块加载是同步的,执行require时会阻塞后续代码,直到模块加载完成。适用于服务器端本地文件加载(速度快),但不适合浏览器环境[1][4]。
  2. 单例模式与缓存

    • 每个模块在首次加载后会被缓存,后续require同一模块直接返回缓存实例。例如:
      const moduleA = require('./module');
      const moduleB = require('./module');
      console.log(moduleA === moduleB); // true[^1^][^4^]
      
  3. 动态导入

    • 支持运行时动态加载模块,根据条件灵活导入不同模块。例如:
      if (condition) {const moduleA = require('./moduleA');
      } else {const moduleB = require('./moduleB');
      }[^1^][^4^]
      
  4. 文件即模块

    • 每个文件视为独立模块,拥有单独的作用域,避免全局变量污染[2][4]。

三、模块加载机制

  1. 加载流程

    • 路径解析:优先从缓存中查找模块;若未缓存,则检查是否为核心模块(如fs);否则按路径查找文件模块[4]。
    • 文件扩展名:自动按.js.json.node顺序补全后缀[2]。
    • 编译与执行:加载后立即编译并执行模块代码[4]。
  2. 循环依赖处理

    • 通过缓存机制解决循环依赖,但需注意模块的加载顺序和状态[3][4]。

四、应用场景

  1. 服务器端开发

    • Node.js默认使用CommonJS,适合后端代码的组织与管理。例如,通过require引入数据库驱动、路由模块等[1][4]。
  2. 前端开发

    • 需通过构建工具(如Webpack、Browserify)将CommonJS模块转换为浏览器兼容格式。例如:
      # 使用Webpack打包
      webpack --entry ./src/index.js --output ./dist/bundle.js [^5^]
      

五、与ES模块(ESM)的对比

特性CommonJSES模块(ESM)
语法require()module.exportsimportexport
加载方式同步加载(阻塞)异步加载(非阻塞)
动态导入支持require()动态加载需使用import()返回Promise
缓存机制模块单例缓存无默认缓存(可通过import实现)
适用环境服务器端(Node.js)浏览器端、现代前端工程
静态分析不支持(运行时解析)支持(编译时优化)

六、总结

CommonJS通过同步加载、单例缓存和简单的API设计,成为服务器端JavaScript模块化的事实标准。虽然ES模块在现代前端开发中更受青睐,但在Node.js生态和旧项目中,CommonJS仍具有重要价值[1][4][5]。

http://www.dtcms.com/a/284415.html

相关文章:

  • 基于dcmtk的dicom工具 第二章 图像接受StoreSCP(2)
  • Python Day16
  • Java行为型模式---备忘录模式
  • 从零开始的云计算生活——第三十三天,关山阻隔,ELK日志分析
  • rtp传输推流h265
  • Unity使用GTCRN实现流式语音增强
  • SpringBoot一Web Flux、函数式Web请求的使用、和传统注解@Controller + @RequestMapping的区别
  • 探微“元宇宙”:概念内涵、形态发展与演变机理
  • CSS面试题及详细答案140道之(41-60)
  • Kiro AI IDE上手初体验!亚马逊出品,能否撼动Cursor的王座?
  • Amazon S3成本优化完全指南:从入门到精通
  • 8 几何叠加分析
  • 系统设计时平衡超时时间与多因素认证(MFA)带来的用户体验下降
  • 量子计算的安全与伦理:当技术革命叩击数字时代的潘多拉魔盒
  • sqli-labs靶场通关笔记:第25-26a关 and、or、空格和注释符多重过滤
  • 4G模块 A7680通过MQTT协议连接到腾讯云
  • AI赋能Baklib,重塑企业知识管理与客户支持方式
  • Curr. Res. Food Sci.|福州大学吕旭聪团队:富硒鼠李糖乳杆菌GG重塑肠-肝轴,显著缓解酒精性肝损伤
  • 网络通信之基础知识
  • deep learning(李宏毅)--(六)--loss
  • day19-四剑客与正则-特殊符号正则-awk
  • [yotroy.cool] 记一次 Git 移除某个不该提交的文件
  • iOS WebView 调试与性能优化 跨平台团队高效协作方法解析
  • PyTorch生成式人工智能(18)——循环神经网络详解与实现
  • 可视化图解算法56:岛屿数量
  • Word 中为什么我的图片一拖就乱跑,怎么精确定位?
  • python使用pymysql库
  • modbus 校验
  • 泛型与类型安全深度解析及响应式API实战
  • Java 集合框架详解:Collection 接口全解析,从基础到实战