位置: IT常识 - 正文

CommonJS的理解(commonjs的特点)

编辑:rootadmin
CommonJS的理解 CommonJS是什么?

推荐整理分享CommonJS的理解(commonjs的特点),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:commonjs require,commonjs实现原理,commonjs requirejs,common.js是用来干嘛的,commonjs原理,commonjs原理,commonjs教程,commonjs教程,内容如对您有帮助,希望把文章链接给更多的朋友!

我们主流的前端框架vue/react都是基于node来构建的。在NodeJS出现之前,由于没有特别复杂的页面,前端是没有模块化这个概念的,而NodeJS诞生之后,它使用CommonJS的模块化规范。从此,js模块化开始快速发展。因此,我们知道,commonjs就是一个模块化的规范。目前流行的js模块化规范有CommonJS、AMD、CMD、UMD以及ES6的模块系统。

至于什么是模块化?你能看到这里说明你已经工作有点时间了,这个不需要太多的解释,自行领悟吧。小编文采不行,不知道怎么解释,简单来说,一般来说,一个文件就是一个模块,这个文件内的作用域唯一,可以向外暴露变量,函数等。模块化的出现减少了代码的繁琐,利于代码复用和日后维护等等作用,实在高明!

前面我们说过,NodeJS是使用CommonJS的模块化规范。CommonJS它有四个核心的比较重要的环境变量,分别是modele, exports,require,global.  

modele, exports

如果你有一定的工作经验,那么你一定见过如下代码:

module.exports = {//...............}以及var math = require('XXXX');

module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口,不建议直接使用exports(为什么呢?只能说不熟悉的容易出错,而且使用不方便)。然后我们在其他模块需要引入的地方使用require来引入。

module.exports和exports都能导出,那么究竟这两个之间有什么不同的呢?

exports 导出实际还是使用了module.exports。因为node在内部对exports进行了赋值。

var exports = module.exports;

exports在导出的时候,需要添加属性或者方法,因为它指向的是module.exports,module.exports变量本就是一个对象,实际导出也是导出这个变量。不可以直接给exports赋值一个变量或者函数,这是错误的。。。

exports = '我是错误的导出';//错误的exports = function(){ }; //错误的

正确的是这样:

exports.XXX = '我是错误的导出';//正确的exports.XXX = function(){ }; //正确的CommonJS的理解(commonjs的特点)

看到这里你应该知道为什么不建议使用exports暴露了吧!!

补充下,modules对象都有哪些属性:

module.id,模块的识别符,通常是带有绝对路径的模块文件名;module.filename,模块的文件名,带有绝对路径;module.loaded,返回一个boolean值,表示模块是否已经完成加载;module.parent,返回一个对象,表示调用该模块的模块;module.children,返回一个数组,表示该模块内用到的其他模块;module.exports,表示模块对外输出的值; require

require就是加载模块的。所有加载的模块都会缓存保存在require.cache中。

使用require加载模块的时候,必须加 ./ 路径,不加的话只会去node_modules文件找。

// 引用自定义的模块时,参数包含路径,可省略.jsvar math = require('./math');// 引用核心模块时,不需要带路径var http = require('http');

这里了解下require使用时候的内部处理流程:

1.在执行到require语句的时候,先检查是否存在这个模块的缓存;

2.如果没找到缓存,那么就会创建一个新的module实例,并且缓存下exports导出的值。如果没发现exports的模块那么会报错;

3.如果缓存存在的话,执行module.load()这个方法,去加载这个模块,读取文件内容后,使用module.compile()执行文件代码;

4.如果解析的过程中,出现异常,就从缓存中删除这个模块;

5.如果没有出现异常,最后返回这个模块的module.exports;

global

global对象是nodejs的全局对象,上边挂在了一些最基本的全局方法。

CommonJS模块的缓存

从require引入我们使用了缓存。当我们第一次加载模块的时候,node会加载他并且缓存下来,之后使用的时候就会直接从缓存内读取module.exports的值。缓存是根据绝对路径识别模块的,如果同样的模块名,但是保存在不同的路径,require命令还是会重新加载该模块。所以加载模块只会在第一次,后面如果需要重新加载可以通过清除缓存。

CommonJS的缺点

首先我们需要了解CommonJS的加载方式是同步加载的,这意味着只有前面执行完成才会继续执行。因为同步就会存在一个问题,加载的速度受到影响。Node.js主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑非同步加载的方式,所以CommonJS规范比较适用。但是,如果是浏览器环境,要从服务器端加载模块,这时就必须采用非同步模式,因此浏览器端一般采用AMD规范。

本文链接地址:https://www.jiuchutong.com/zhishi/299442.html 转载请保留说明!

上一篇:文心一言 VS ChatGPT,国产大模型和国外的差距有多大?(文心一言 VS ChatGPT)

下一篇:终于,OpenAI开放ChatGPT API,成本直降90%,百万token才2美元(open开放的意思吗)

  • 苹果手表怎么换表盘图案(苹果手表怎么换手机绑定)

    苹果手表怎么换表盘图案(苹果手表怎么换手机绑定)

  • ios15更新后无痕浏览去哪了(苹果ios15无痕浏览怎么设置)

    ios15更新后无痕浏览去哪了(苹果ios15无痕浏览怎么设置)

  • 手机充电慢是怎么回事(手机充电慢是怎么回事华为)

    手机充电慢是怎么回事(手机充电慢是怎么回事华为)

  • 拼多多三级限制有解除的可能吗(拼多多三级限制多久可以解封)

    拼多多三级限制有解除的可能吗(拼多多三级限制多久可以解封)

  • 淘宝补发货怎么查物流(淘宝补发货怎么查看)

    淘宝补发货怎么查物流(淘宝补发货怎么查看)

  • 爱奇艺怎么竖屏观看(爱奇艺如何竖屏)

    爱奇艺怎么竖屏观看(爱奇艺如何竖屏)

  • 十进制225的二进制是(十进数225转换成二进制数)

    十进制225的二进制是(十进数225转换成二进制数)

  • qq如何清除聊天记录全部(qq如何清除聊天背景图)

    qq如何清除聊天记录全部(qq如何清除聊天背景图)

  • 蓝牙耳机怎么强制关机(蓝牙耳机怎么强制开机键)

    蓝牙耳机怎么强制关机(蓝牙耳机怎么强制开机键)

  • 支付宝拉黑对方知道吗(支付宝拉黑对方对方还可以发信息吗)

    支付宝拉黑对方知道吗(支付宝拉黑对方对方还可以发信息吗)

  • 华为手机怎么调时间(华为手机怎么调回彩色屏)

    华为手机怎么调时间(华为手机怎么调回彩色屏)

  • 无线话筒被锁怎么解锁(无线话筒锁定怎么解锁)

    无线话筒被锁怎么解锁(无线话筒锁定怎么解锁)

  • ps磨砂质感怎么做(ps做磨砂质感)

    ps磨砂质感怎么做(ps做磨砂质感)

  • 手机上怎么挂医院的号(手机上怎么挂医院急诊)

    手机上怎么挂医院的号(手机上怎么挂医院急诊)

  • 手机来电不显示姓名怎么回事(手机来电不显示联系人名字怎么办)

    手机来电不显示姓名怎么回事(手机来电不显示联系人名字怎么办)

  • airpods支持iphone几(airpods支持快充吗)

    airpods支持iphone几(airpods支持快充吗)

  • 数字证书的功能包括什么(数字证书的功能和作用是什么)

    数字证书的功能包括什么(数字证书的功能和作用是什么)

  • kindle499和558对比(kindle558 658区别)

    kindle499和558对比(kindle558 658区别)

  • qq的自动回复怎么弄操作流程(qq的自动回复怎么弄)

    qq的自动回复怎么弄操作流程(qq的自动回复怎么弄)

  • 华为手机qq怎么设置自动回复(华为手机qq怎么分身)

    华为手机qq怎么设置自动回复(华为手机qq怎么分身)

  • 华为手环3pro使用方法(华为手环3pro使用时间长)

    华为手环3pro使用方法(华为手环3pro使用时间长)

  • vivo解锁跳广告怎么解决(vivo手机解锁有广告新闻)

    vivo解锁跳广告怎么解决(vivo手机解锁有广告新闻)

  • 乐视电视怎么看电视台(乐视电视怎么看中央台和地方台)

    乐视电视怎么看电视台(乐视电视怎么看中央台和地方台)

  • 个人出租非住房房产税怎么计算
  • 受托加工开票如何选名称
  • 未分配利润转增股本会计处理
  • 企业所得税季度预缴怎么计算
  • 发票跨季度可以用吗
  • 固定资产遭受自然灾害账务处理
  • 占用农村宅基地建豪宅
  • 一般纳税人只交进项税吗
  • 财报分析推荐书籍
  • 职工宿舍租赁费
  • 一般纳税人是什么等级
  • 白酒五行属火还是水
  • 公司承担的个人所得税怎么做分录
  • 应收账款减值准备和坏账准备的区别
  • 递延所得税资产是什么
  • 免税农产品加工企业
  • 融资租赁纳税人是指
  • 利润分配在利润表中如何列示
  • 营改增后的劳务费怎么开
  • 委托加工代收代缴增值税吗
  • linux系统中将加密过的密码放到什么文件中
  • 处置子公司属于调整事项吗
  • 销售预售卡如何入账
  • php ftell
  • php递归遍历文件夹
  • 苏黎世湖天鹅
  • 微信小程序分包加载
  • 浅谈中国式现代化3000字论文
  • vue如何销毁页面
  • pyecharts 表格
  • sendmailadmin
  • 大小周是否违反劳动法
  • Ant Design-vue 解决input前后空格问题(推荐)
  • 织梦下载站源码带采集
  • 交易性金融资产是什么意思
  • 开票服务名称可以自己添加吗
  • 职工食堂的费用怎么入账
  • 科技经费使用
  • 企业基金分红具备的条件
  • 年终奖的个税税率
  • 餐饮服务收入的增值税
  • sqlserver判断查询结果是否为空
  • 装修专票是几个点
  • 待认证进项税额认证以后怎么做分录
  • 备用金怎么回冲
  • 工程检测单位
  • 派出所报销项目有哪些
  • 事业单位发放生育津贴从哪年执行的
  • 跨年红冲收入记在本年度
  • 考核奖金属于工资吗
  • 微信支付宝收入支出怎么做流水账
  • 保险公司的返点能要吗
  • 车间成本项目如何结转
  • 会计常用表格都有哪些技能
  • 会计软件什么范围分为单用户和多用户呢
  • sql必会知识
  • sqlcipher c#
  • freebsd 配置ip
  • win7怎么启用显卡
  • Mac借助其他电脑做系统
  • OfcPfwSvc.exe - OfcPfwSvc是什么进程 有什么用
  • windows 相机打不开
  • 80端口被system 占用解决方法
  • fdisk硬盘分区工具
  • windows7怎么解除密码
  • windows8.1玩穿越火线
  • Win10预览版桌面图标和任务栏不翼而飞怎么办?
  • windows8桌面图标没有了
  • 一个简单的灵魂福楼拜
  • js怎么删除
  • 设计一个windows
  • unity3d怎么用
  • shell执行多个命令
  • python 多线程处理
  • javascript.
  • Python调用大漠插件
  • python smtplib模块详解
  • 如何查询自己公司的对公账号
  • 运费没有发票怎么报销
  • 浙江医保怎么使用
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设