CommonJS概述及使用

在web开发中,我们的js文件都是在html文件中引入,在浏览器环境运行。但是在nodejs的环境中可没有html文件,且nodejs中,有且只有一个入口文件index.js(在执行程序时,我们只运行这一文件),别的文件均作为模块,配合入口文件实现代码效果。因此可以看出,nodejs对模块化开发的需求比浏览器端要大得多。

目录

1.概述

2.模块的导出

3.模块的导入

4.CommonJS规范

5.nodejs对CommonJS的实现


1.概述

有了这一需求,且彼时nodejs刚刚发布,前端没有官方的模块化标准,因此大家选择了社区提供的CommonJS作为模块化标准。在这里有两个非常重要的概念:模块的导出模块的导入

2.模块的导出

先来解释一下什么是模块,所谓模块其实本质上就是一个JS文件,该文件实现了一定的功能,并在隐藏自己内部实现的情况下,提供了一些接口给其他模块使用。这里可以类比一些API,比如数组方法push,我们并不知道它内部怎么实现将元素放入数组的最后一项,可以认为这一部分被开发者隐藏了,但是我们可以使用它,即它暴露了接口给用户。

由模块的这一特性我们可以知道,模块有两个核心要素,即:隐藏暴露。模块隐藏的是自己的内部实现,暴露的是希望外部使用的接口。举个例子,我们将汽车生产场看作一个模块,其产出的汽车是暴露给用户的接口,而生产过程则是隐藏的内部实现,生产商只把产出的汽车卖给客户,但是不会将生产过程告诉客户。任何一个正常的模块化标准,都应该默认隐藏模块中的所有实现,而通过一些语法或API调用来暴露接口

暴露接口的过程即模块的导出

模块的导出

3.模块的导入

当通过某种语法或API去使用一个模块时,这个过程叫做模块的导入,注意的是,在使用某一模块时,我们使用的是该模块导出的部分,隐藏的部分是永远无法使用的。

4.CommonJS规范

CommonJS导出模块的方法是exports,导入模块的是require,具体规范如下

1)如果一个JS文件中存在exports或require,该JS文件是一个模块

2)模块内的所有代码均为隐藏代码,包括全局变量、全局函数,这些全局的内容均不应该对全局变量造成任何污染

3)如果一个模块需要暴露一些API提供给外部使用,需要通过exports导出,exports是一个空的对象,你可以为该对象添加任何需要导出的内容

4)如果一个模块需要导入其他模块,通过require实现,require是一个函数,传入模块的路径即可返回该模块导出的整个内容

【注】CommonJS只是一个规范,相当于告诉你按什么标准制造汽车,但是具体怎么制造还是得看生产商。因此,有了规范以后,nodejs就去实现模块化了

5.nodejs对CommonJS的实现

为了实现CommonJS规范,nodejs对模块做出了以下处理

1)为了保证高效的执行,仅加载必要的模块。nedejs只有执行到require函数时才会加载并执行模块

2)为了隐藏模块中的代码,nodejs执行模块函数时,会将模块中的所有代码放置到一个函数块中执行,以保证不污染全局变量

3)为了保证顺利的导出模块的内容,nodejs做了以下处理

  • 在模块开始执行前,初始化一个module.exports = {};
  • module.exports即模块的导出值
  • 为了方便开发者便捷的导出,nodejs在初始化完module.exports后,又声明了一个变量exports=module.exports 

4)为了避免反复加载同一个模块,modejs默认开启了模块缓存,如果加载的模块已经被加载过了,则会自动使用之前的导出结果

【注】CommonJS的概念如上,例子已上传,一个是基本使用,另一个是模拟扑克牌发牌的过程

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值