位置: 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开放的意思吗)

  • 微信怎么取消自动扣费(微信怎么取消自动删除聊天记录)

    微信怎么取消自动扣费(微信怎么取消自动删除聊天记录)

  • 凯迪仕密码锁怎么进入管理员界面(凯迪仕密码锁怎么用密码开门)

    凯迪仕密码锁怎么进入管理员界面(凯迪仕密码锁怎么用密码开门)

  • 红米10xpro屏幕尺寸是多大(红米10x的屏幕大小)

    红米10xpro屏幕尺寸是多大(红米10x的屏幕大小)

  • oppo便签突然没了(oppoa11便签桌面上没有)

    oppo便签突然没了(oppoa11便签桌面上没有)

  • 华为手机滚动截屏不够长怎么办(华为手机滚动截屏怎么使用)

    华为手机滚动截屏不够长怎么办(华为手机滚动截屏怎么使用)

  • 金立8001是什么型号(金立8003l是什么型号)

    金立8001是什么型号(金立8003l是什么型号)

  • 苹果脸部识别怎么突然不能用(苹果脸部识别怎么删除第二个人)

    苹果脸部识别怎么突然不能用(苹果脸部识别怎么删除第二个人)

  • 电脑的显卡可以随便换吗(电脑的显卡可以随便装吗)

    电脑的显卡可以随便换吗(电脑的显卡可以随便装吗)

  • 微信好友上限多少(微信好友上限多少人)

    微信好友上限多少(微信好友上限多少人)

  • 华为畅享10有没有指纹解锁(华为畅享10有没有nfc功能)

    华为畅享10有没有指纹解锁(华为畅享10有没有nfc功能)

  • 手机怎样查看别人的qq密码(手机怎样查看别人的聊天记录)

    手机怎样查看别人的qq密码(手机怎样查看别人的聊天记录)

  • vivos5怎么导出联系人(vivoy55如何导出联系人)

    vivos5怎么导出联系人(vivoy55如何导出联系人)

  • 网站关键词怎么加(网站关键词怎么优化排名)

    网站关键词怎么加(网站关键词怎么优化排名)

  • 淘宝拼团要自己找人吗(淘宝拼团有什么好处)

    淘宝拼团要自己找人吗(淘宝拼团有什么好处)

  • 天猫最长几天确认收货(天猫最多几天确认收货)

    天猫最长几天确认收货(天猫最多几天确认收货)

  • ipiphone11电池容量(iphone电池容量)

    ipiphone11电池容量(iphone电池容量)

  • 商家可以投诉骑手吗(商家可以投诉骑手 骑手有什么影响)

    商家可以投诉骑手吗(商家可以投诉骑手 骑手有什么影响)

  • 黑鲨手机突然充电变慢(黑鲨手机突然充电很慢)

    黑鲨手机突然充电变慢(黑鲨手机突然充电很慢)

  • 苹果手机快手闪退怎么回事(苹果手机快手闪退进不去怎么办)

    苹果手机快手闪退怎么回事(苹果手机快手闪退进不去怎么办)

  • 苹果x几个喇叭(苹果x喇叭有几个孔是发声的)

    苹果x几个喇叭(苹果x喇叭有几个孔是发声的)

  • 微信如何查询建群时间(微信如何查询建设卡余额)

    微信如何查询建群时间(微信如何查询建设卡余额)

  • 抖音一直闪退怎么办(抖音一直闪退怎么回事)

    抖音一直闪退怎么办(抖音一直闪退怎么回事)

  • sci期刊投稿指南 计算机科学 人工智能方向 145本sci期刊目录 从一区到四区(2022年 最新影响因子更新了)(sci期刊投稿步骤)

    sci期刊投稿指南 计算机科学 人工智能方向 145本sci期刊目录 从一区到四区(2022年 最新影响因子更新了)(sci期刊投稿步骤)

  • 个人取得上市公司股票期权个人所得税
  • 福利企业发放职工集资利息是不是要交个人所得税
  • 事业单位固定资产
  • 发票额开多了多出的金额怎么处理?
  • 标书费收据丢失怎么办
  • 会计人员必备的知识和技能
  • 免抵税额计入什么科目
  • 酒店式公寓配套服务包括哪些
  • 资本溢价公积金计算公式
  • 附加税交税依据
  • 理财产品取得收益要交税吗
  • 管理费用怎么记忆
  • 物流车辆挂靠账务怎么处理?
  • 销售返利是冲减收入还是做销售费用
  • 固定资产折旧年限及残值率
  • 四川中级会计报名需要上传哪些资料
  • 支票作废了需要什么材料
  • 办理银行承兑汇票贴现的会计分录
  • 服务费的进项税能抵扣么
  • 糖尿病患者在什么情况下无需
  • rundll.exe是什么程序
  • 主营业务收入发票
  • hypertrm.exe系统错误
  • kb4592438安装失败
  • PHPfor循环语句10的阶乘
  • 按揭贷款到账时间
  • 银行存款收款凭证属于什么凭证
  • 长期投资有哪些渠道
  • 如何使用nodejs
  • 不得抵扣的增值税怎么处理
  • 气象数据32766
  • 普通纳税人怎么交税
  • 前端开发配置
  • HttpServletRequest 获取参数
  • 发票写的是信息怎么办
  • 自然人所属税务机关怎么选
  • 持有至到期投资属于什么科目
  • 结转本期损益怎么看亏损
  • 帝国cms界面
  • 如何关闭mysqld
  • mongodb从入门到商业实战
  • 不动产租赁需要资质吗
  • 公司注销后实收资本要交税吗
  • 现金支付无发票怎么报销
  • 开具信用证的费用能开专票吗
  • 企业营改增税率是多少
  • 应交税金在贷方是什么意思
  • 银行承兑汇票收款人是谁
  • 公司账户收入多少要扣税
  • 以前年度负债调整
  • 同一张发票报销两次会被发现吗
  • 缴纳工会经费的依据
  • 允许税前扣除的税金及附加包括哪些
  • 内部交易内部交易收益造成的当期折旧的多计额
  • 银行承兑到期后怎么兑现
  • 净资产收益率计算公式
  • 什么是现金等价物列举
  • sqlserver数据库怎么导出
  • tcpdump的用法
  • 苹果mac怎么清理缓存
  • linux用
  • fedora系统
  • freebsd 安装
  • PRISMSVR.EXE - PRISMSVR是什么进程 有什么用
  • linux小技巧
  • window8设置在哪里
  • JS、jQuery中select的用法详解
  • 彻底弄懂js中的this指向
  • shell脚本加密不可破解
  • bat文件命令大全
  • node.js django
  • shell section
  • jquery获取点击元素
  • jQuery ztree实现动态树形多选菜单
  • 基于JAVASCRIPT实现的可视化工具是
  • 广东省为什么电不够用
  • 查询完毕
  • 科研用地是否缴纳土地使用税
  • 境外付款需要什么手续
  • 深圳税务局官方客服电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设