JavaScript模块化(二)CommonJS

全面理解JavaScript模块化:CommonJS与ES6模块规范 cjs 与 es6 模块化使用 阅读详情

介绍


CommonJS提出JavaScript不仅针对浏览器,它做为一个规范,在服务器端被广泛使用,最常见到的就是node中的使用
事实上,node就是基于CommonJS规范来写的,在CommonJS规范中,每个js文件作为一个模块,CommonJS在服务器端和浏览器端的加载是不一样的

基本语法


暴露模块

在CommonJS规范中,我们通过module.exports和exports.xxx来暴露模块内部的变量和方法

module.exports = val  
exports.key = val  

暴露本质:暴露出exports对象
对于module.exports来说,等同于将等号后面的内容覆盖原来的exports对象
而对于exports.xxx来说,就是在exports对象上增添属性
对于上面那两行代码来说,本质上就是:

  • module.exports = val:将val赋值给exports对象,结果就是exports=val
  • exports.key = val:将val赋值给exports对象的key属性,若没有就新建该属性,结果就是exports={key : val}

通过本质可以看出

  • module.exports因为会修改整个exports对象,所以重复写会使得后写的覆盖先写的,而exports.xxx只会不断添加属性,除非xxx是相同的,否则就可以一直叠加下去
module.exports = {
    foo(){
        console.log('foo');
    }
}
module.exports = {
    bar(){
        console.log('bar');
    }
}

在这里,后写的module.exports会把之前的module.exports覆盖掉,exports对象将只剩一个bar方法

exports.foo = function(){
    console.log('foo');
}
exports.bar = function(){
    console.log('bar');
}

而这里的exports.xxx则会使得暴露出去的exports对象同时有foo和bar方法
此外,要注意的是,CommonJS输出的内容是值的拷贝,也即是说在导入模块后,修改模块方法并不会影响到原有的模块的内容

引入模块

require(xxx)
第三方模块:直接使用模块名
如下面使用node创建服务器,就直接引用了http模块(代码来自node官网)

// node创建服务器的代码
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

自定义模块:使用文件路径,后缀名默认为js

// module.js
exports.foo = function(){
	console.log('foo');
}
// mian.js
const module = require('./module.js')
module.foo()

使用require时要注意相对路径的写法

  • ‘/xxx’ :表示根目录的xxx文件;
  • ‘./xxx’ :表示和当前文件同一文件夹下的xxx文件;
  • ‘…/xxx’ :表示当前文件的上级目录的xxx文件;
  • ’xxx’:表示要在node_modules寻找相应的模块

加载机制


不同端的加载方式

在服务器端模块的加载是同步的:可能出现阻塞
在浏览器端模块需要提前编译打包处理,即使请求发送到了服务端,但是之前的模块还没加载好,所以客户端会一直等待
正因其加载的不同,CommonJS更适合在服务器端使用,在服务器中同步加载,只要将所有导入都放在模块(文件)顶部(至少要放在使用该模块相应内容的上一行),我们就可以保证在引用其他模块的方法前已经加载好这些模块,而对于浏览器环境来说,我们不知道网络情况如何,如果我们发起了一个异步请求,而这些模块还没加载好的时候我们执行了接下来的代码,而这些代码里面又需要这个模块的方法,那就会报错
就如下面的代码

require('jquery')
var _body = $('body')

在浏览器环境下,如果jquery模块还没加载好,那么$(‘body’)就会报错,所以在浏览器中不适合使用CommonJS规范
此外,浏览器不认识require,需要提前处理语法,可以通过使用browserify打包来处理

模块缓存

在Node下加载模块时,Node会将加载的模块缓存下来,在下次请求该模块时直接丛缓存中获取该模块,所以多次使用require实际上只会请求一次模块

使用


  • 服务端:Node
  • 浏览器端:需要进行打包,可以使用browserify打包
    browserify需要在全局安装后再在本地安装才能使用
npm i browserify -g
npm i browserify

安装后通过browserify命令打包

browserify main.js -o bundle.js

main.js是要打包的文件,bundle.js是打包生成的文件

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

相关推荐

Javascript模块化编程系列二: 模块化的标准化(CommonJS & AMD)

前言 Javascript模块化编程系列一: 模块化的驱动  在前一篇介绍了为什么要进行Javascript模块化编程。至于如何实现模块化,不同的开发组织和个人具体的实现方式肯定是不一样。如何统一一个规范呢? CommonJS 就在做的工作就包含了这部分。 CommonJS CommonJS 是一个由服务的Javascript运行库作者组成的小组,他们一直致力于暴

oscar999的专栏 2554

CommonJS的理解

CommonJS

全栈科学家的博客 8823

common-scripts:这是程序员最常用的脚本

common-scripts 在这里积累下程序员最常使用的脚本 程序员经常会遇到许多重复性的工作,或是人工操作步骤复杂的工作等,都是可以通过脚本来实现,大大提交工作效率。 本着用多少,学多少的思想,积累。 概念 任何一个知识点,都需要对整体、概要有个了解,主要是为了在脑海中形成一张图,以后遇到问题,结合上下文,自己能够判断问题的范围、边界。 参见: 语法级别 bash syntax 编写脚本过程中,常用的或必须掌握的语法点有 变量,声明、赋值、使用 字符串,单引号 / 双引号(区别)、位置、截取、拼接 数组,定义、赋值、取值、长度、遍历 参数,传递、取值、特殊字符处理参数 流程控制,if, else, for, while, case, break... 函数,定义、调用、参数、返回值(数值/字符) 有了以上这些知识点,就可以写出很灵活、可用性高的脚本了。在此列出常用语法。 参见: 常用脚

CommonJS模块和ES6模块的区别?深入CommonJS源码,带你手写自己的CommonJS

CommonJS模块和ES6模块的区别 。深入CommonJS源码,带你手写自己的CommonJS。node模块化

weixin_51472145的博客 4764

记录LeNet的硬件加速器设计(一)

LeNet的硬件加速器设计实现。

2301_81029398的博客 3543

什么是 MDB-RS232,为什么需要 MDB-RS232适配器 ?

在您需要设计一个售货机,首先需要选择适合您机器的主板,比如安卓主板、树莓派、工控机或者PLC等,这些主板都是没有MDB接口的,而支付设备,比如你选择的纸币器,硬币器,都是MDB接口。那您就需要这个 MDB 适配器,来把MDB接口的支付设备连接到这些串口的主板上,进行通信和控制。MDB-RS232旨在将MDB 协议转换为 RS232 协议,并执行必要的电压转换以及数据路由工作。,能够让主板轻松执行其他任务,不需要考虑协议的具体软硬件的兼容和稳定性问题。专业的设计指导和协助协议分析,丰富的开发文档。

waferstar的博客 1382

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

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

lph159的博客 3556

Xilinx_JESD204B

Xilinx_JESD204B_AXI配置 说明:通过FPGA的高速数据接口JESD204B对AD9625进行高速采集。 环境:Vivado2018.3。 IP核:JESD204(7.2)。 参考手册:pg066_jesd204 v7.2。 资料以及IP_licence:JESD204B AXI协议资料:AXI 文章目录JESD204B概述JESD204B接口术语JESD204B 层JESD204B_AXI介绍AXI介绍JESD204B__AXI_Lite接口AXI-Lite接口介绍AXI-Lite接口信号

Crazzy_M的博客 1万+

简述JavaScript模块化编程(二)

前置阅读:简述JavaScript模块化(一) 在前面一文中,我们对前端模块化所经历的三个阶段进行了了解: CommonJs,由于是同步的,所以主要应用于服务器端,以Node.js为代表。 AMD,异步模块定义,预加载,推荐依赖前置。以require.js为代表。 CMD,通用模块加载,懒加载,推荐依赖就近。以Sea.js为代表。 而在ES6已经大行其道的今天,ES...

weixin_30394669的博客 431

软解调详解

在这个示例中,生成了一个随机的比特序列,将其调制为QPSK信号,添加了高斯白噪声,然后计算了每个比特的LLR,并根据LLR的符号进行了解调判决。软解调是一种基于接收信号的概率估计进行解调的方法。与传统的硬解调相比,软解调不仅考虑了接收信号的幅度和相位信息,还利用统计特性计算每个比特为0或1的概率,从而提高了解调性能。软解调过程中涉及的主要公式包括对数似然比(LLR)的计算公式、信号的概率分布函数以及解调判决公式等。软解调的计算处理流程包括信号接收、预处理、相位估计、LLR计算、解调判决和输出等步骤。

ahah12345678的博客 1226

【WorkBuddy专栏09】WorkBuddy多模态能力深度揭秘

【WorkBuddy专栏09】AI不止会聊天——WorkBuddy多模态能力深度揭秘

AI人人懂 2112

CommonJS

CommonJS一、CommonJS1.模块的导出2.模块的导入3.CommonJS规范4.nodejs对CommonJS的实现5.实例6.练习 一、CommonJS 在nodejs中,由于有且仅有一个入口文件(启动文件),而开发一个应用肯定会涉及到多个文件配合,因此,nodejs对模块化的需求比浏览器端要大的多 由于nodejs刚刚发布的时候,前端没有统一的、官方的模块化规范,因此,它选择使用社区提供的CommonJS作为模块化规范 在学习CommonJS之前,首先认识两个重要的概念:模块的导出和模块的

xun__xing的博客 1546

手把手入门YOLO到改进优化教程 | 【P5进阶篇】YOLOv8损失函数改进实战-损失函数IoU之KLD Loss

在本节,将从 KLD Loss(Kullback–Leibler Divergence Loss)的理论到实战代码实现,带你把 KLD Loss融合进 YOLOv8 的训练框架中。并通过训练日志与实验结果,验证 KLD Loss 在实际工程中的优势。

嵌入式阿齐Archie 2万+

JS模块化(二)CommonJS的应用

JS模块化(二)CommonJS的应用 基本使用 暴露出去 module.exports = value或者是exports.xxx = value 引入进来 let xxx = require("./modules/xxx"); CommonJS-node(服务端) 首先部署出文件的结构 ├─modules │ modules1.js │ modules2.js │ ...

Z_hao_nan的博客 349

怎样让你的论文看起来“像人写的”?只用三招直接去除AI味(附提示词)

当然如果你在实际使用中还有其他需求,比如降重润色、改写翻译等,也可以结合七哥的专业写作平台来辅助,这个高级学术平台已经内置了ChatGPT4o、ChatGPT4.1、Claude3.7、满血版DeepSeek-R1等AI大模型,帮你写文献综述、干课题申报、写论文等学术任务绝对每一点问题。比如我自己的一套学术写作平台,其中的“降重与润色”模块整合了多种GPTs应用,除了能帮助调整语言风格、避免雷同表达,还可以顺带降个重,对于提升学术文本的整体质量还是非常有用的。一、为什么用AI写出来的文章会有AI味?

智能AI让学术科研更容易 1686

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JavaScript模块化开发(二)——CommonJS规范

本文转载自原地址,感谢Feeldesign Studio的无私分享! 从本文开始介绍常见的模块化规范。 模块化规范,主要是为了统一模块化的编写方式,比如不同团队的Java代码,总能用import的方式来加载,C#的话也有using,JavaScript本身没有内置的模块系统(ES6中引入了模块系统,不过等到普及可能是n年后的事情了),JavaScript的模块化规范,一般都是致力于提高 ...

Sam 198

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Javascript模块化编程(二)commonJS规范和AMD规范

commonJS规范(同步引入模块的规范) 对外暴露 module.exports; 引入require("模块路径"); const gulp = require("gulp"); gulp.task(); //同步执行,必须等数据下载完成以后,才能够执行。如果加载的时间长,整个应用都会停在那里等 【注】只能用于服务端情况。 ECMA6的规范(异步操作内部做好) 对外暴露 export default 引入 import A.

Cupid 190

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Javascript模块化编程及CommonJS和AMD规范浅析(二)

第一部分介绍了Javascript模块原型和理论概念,本文介绍如何将它们用于实战,我们采用的是一个非常流行的库require.js。 一、为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了。后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载。下面的网页代码,相信很多人都见过。            

零度的博客专栏 421

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

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

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

深入浅出 JavaScript 的模块化:从 CommonJS 到 ES Modules

同步 vs 异步:CommonJS 是同步加载模块,适合服务器端使用;而 ES6 模块支持异步加载,适合现代浏览器的使用场景。静态 vs 动态:ES6 模块支持静态分析,可以进行更好的优化(如 tree-shaking);CommonJS 主要通过动态的require加载模块。默认导出:CommonJS 使用进行默认导出,而 ES6 模块使用。模块化是 JavaScript 发展过程中不可或缺的一个特性,从 CommonJS 到 ES6 模块,模块化的实现方式不断演进,带来了更高效、更灵活的开发体验。

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

JS模块化总结 | CommonJS、ES6

JS模块化总结 | CommonJS、ES6

yavlgloss的博客 2331

javascript模块化之CommonJS、AMD、CMD、UMD、ES6

这是一篇关于js模块化编程的总结记录 javascript模块化之CommonJS、AMD、CMD、UMD、ES6

皖林的博客 2万+

JavaScript模块化——JS模块化介绍与CommonJS规范

对于JS模块化中的CJS介绍和JS模块化的介绍

PleaSure乐事的博客 1819

Node.js:深入探秘 CommonJS 模块化的奥秘

在Node.js上下文环境中提供了一个module对象和一个exports对象。module代表当前模块,exports是当前模块的一个属性,代表要导出的一些API。一个文件就是一个模块,把方法或者变量作为属性挂载在exports对象上即可将其作为模块的一部分进行导出。// add.js在另一个文件中,我们可以通过requireadd(1, 2);// 输出 3Node.js的模块系统基于CommonJS规范,但在实现上进行了优化和扩展。

2301_79793626的博客 1517

【JavaScript】经典的模块化规范——CommonJS和ES6

本文介绍了JavaScript中两种经典的模块化规范:CommonJS和ES6模块化。CommonJS主要用于Node.js服务器端,通过exports和module.exports导出数据,最终导出的是module.exports的值。ES6模块化是官方标准,支持浏览器和Node.js,提供了多种导出和导入方式。两种规范在数据引用上有区别:CommonJS导出的是值的拷贝,而ES6导出的是值的引用。文章还比较了两种规范的特点,并说明了在浏览器和Node.js中运行ES6模块的方法。

v0_persistent的博客 2203
上一篇: JavaScript模块笔记(一)模块化由来
下一篇: JavaScript模块化(四)CMD
前端小黑
博客等级 码龄9年 148粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值