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

  • 4k修复版什么意思(4k修复技术用什么软件)

    4k修复版什么意思(4k修复技术用什么软件)

  • 微信对方把你删了发信息他看得到吗(微信对方把你删了为什么还能发信息)

    微信对方把你删了发信息他看得到吗(微信对方把你删了为什么还能发信息)

  • 18650电池用5v充电器充电吗(18650电池用5v充电器可以吗)

    18650电池用5v充电器充电吗(18650电池用5v充电器可以吗)

  • 顶级域名和一级域名的区别(顶级域名一级域名二级域名三级域名什么区别?)

    顶级域名和一级域名的区别(顶级域名一级域名二级域名三级域名什么区别?)

  • 钉钉直播举报人是匿名吗(在钉钉举报直播间老师能看到是谁举报的吗?)

    钉钉直播举报人是匿名吗(在钉钉举报直播间老师能看到是谁举报的吗?)

  • 苹果国行资源机是什么意思(苹果国行资源机和国行区别)

    苹果国行资源机是什么意思(苹果国行资源机和国行区别)

  • 酷狗vip下载的歌是永久的吗(酷狗vip下载的歌曲怎么转换mp3)

    酷狗vip下载的歌是永久的吗(酷狗vip下载的歌曲怎么转换mp3)

  • 华为手机状态栏hd是什么意思(华为手机状态栏不见了怎么调出来)

    华为手机状态栏hd是什么意思(华为手机状态栏不见了怎么调出来)

  • word怎么加底纹(word怎么加底纹样式)

    word怎么加底纹(word怎么加底纹样式)

  • 支付宝待支付订单在哪里(支付宝待支付订单怎么付款)

    支付宝待支付订单在哪里(支付宝待支付订单怎么付款)

  • 怎么改wifi密码网站(小米路由器怎么改wifi密码)

    怎么改wifi密码网站(小米路由器怎么改wifi密码)

  • ps怎么去除摩尔纹(ps怎样去除摩尔纹)

    ps怎么去除摩尔纹(ps怎样去除摩尔纹)

  • 咸鱼怎么搜索用户的ID(咸鱼怎么搜索用户?)

    咸鱼怎么搜索用户的ID(咸鱼怎么搜索用户?)

  • 计算机软件通常分为(计算机软件)

    计算机软件通常分为(计算机软件)

  • b站怎么删除自己的动态(b站怎么删除自己发的弹幕)

    b站怎么删除自己的动态(b站怎么删除自己发的弹幕)

  • 淘宝怎么换身份证绑定(淘宝怎么换身份认证)

    淘宝怎么换身份证绑定(淘宝怎么换身份认证)

  • 苹果蓝牙耳机如何调节音量(苹果蓝牙耳机如何重新配对)

    苹果蓝牙耳机如何调节音量(苹果蓝牙耳机如何重新配对)

  • 如何在电脑上制作一寸照片(如何在电脑上制作电子版文件)

    如何在电脑上制作一寸照片(如何在电脑上制作电子版文件)

  • vivoy81s返回键怎么改(vivoy81s返回键怎么调出来)

    vivoy81s返回键怎么改(vivoy81s返回键怎么调出来)

  • word文档字体怎样设计成行书(word文档字体怎么对齐)

    word文档字体怎样设计成行书(word文档字体怎么对齐)

  • iphone xr 快充多少w(苹果xr快充是多少v)

    iphone xr 快充多少w(苹果xr快充是多少v)

  • qq帆船图标什么意思(qq有帆船图标)

    qq帆船图标什么意思(qq有帆船图标)

  • Tenda腾达AC9路由器怎么设置上网 Tenda腾达AC9路由器设置上网方法(腾达ac9路由器怎么样)

    Tenda腾达AC9路由器怎么设置上网 Tenda腾达AC9路由器设置上网方法(腾达ac9路由器怎么样)

  • 房产税的征收范围包括农村吗
  • 金蝶能够反年结账吗
  • 非正常损失的货物,增值税做什么科目
  • 增值税减免税申报明细表免税代码和名称
  • 弃置费用的财务费用可以税前扣除吗
  • 设备采购及安装属于工程还是货物
  • 外地施工如何找工人
  • 固定资产明细表范本
  • 取暖补贴国家标准
  • 提取备用金现金流量
  • 税控盘抵扣增值税怎么做账
  • 自产自销产品如何入库存
  • 企事业承包承租经营所得税率是多少
  • 金蝶期末调汇怎么生成凭证
  • 样品开发费用怎么记账
  • 补缴员工社保银行怎么查
  • 通讯费补贴入什么科目
  • 电子商务平台怎么下载中标通知书
  • 生产车间领用材料45000元,投入生产
  • 如何玩转win11
  • 进项票未认证怎么入账
  • 攀岗的企业性质有哪些
  • 机械设备购置的程序是什么
  • 爱沙尼亚的故事
  • windows11激活密钥多少钱
  • 关联企业之间销售货物
  • php 二叉树的遍历
  • 火狐十大必用插件
  • 取得的进项税发票抵扣
  • php redis使用
  • 购买办公楼之后怎么入账
  • react中的key的作用
  • 印度泰姬陵建筑
  • 汇兑差额如何计算
  • yolov3数据集格式
  • php 解压缩
  • XGboost算法预测股价模型
  • apdl命令流手册下载
  • 税控机清单
  • mysql使用指南
  • SQL Server 跨库同步数据
  • 红字发票还要交税吗
  • linux mysql 安装与操作
  • 收益性支出包括哪些内容
  • 公司向个人借款怎么做账
  • 信息技术服务费的税率是多少
  • 契税是指什么?
  • 子公司与母公司资质能相互借用吗
  • 购买的车位如何做账
  • 上期计提的费用怎么入账
  • 主营业务收入借方什么意思
  • 工程服务预交税怎么算
  • 费用报销单填写标准
  • 企业哪些项目可以立项
  • 电子支付支付是什么意思
  • sql中的join
  • sqlserver数据库和mysql区别
  • 微软官方重做系统
  • win10隐藏设置
  • 启用5g后流量有什么影响
  • watch programmes
  • win7旗舰版32位系统激活
  • win7系统怎么重置网络
  • mac 系统查看
  • win7诊断策略服务未运行是电脑问题还是网络
  • apache2 rewrite
  • linux 互传文件
  • ping命令的基本使用方法
  • nodejs如何配置环境变量
  • delect删除
  • nodejs调用打印机
  • 用shell写一个脚本,对文本中无序的一列数字排序
  • Android带有注册界面的简单app
  • javascript文本框获得焦点
  • win10的安装方式有哪些
  • unity she
  • javascript常用函数大全
  • 江苏电子税务局客服电话
  • 印花税核定依据填写什么
  • 贵阳市税务电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设