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调用来暴露接口
暴露接口的过程即模块的导出
![](/assets/blank.gif)
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的概念如上,例子已上传,一个是基本使用,另一个是模拟扑克牌发牌的过程
CommonJS概述及使用相关推荐
- CommonJS规范(转)
概述 CommonJS是服务器端模块的规范,Node.js采用了这个规范. 根据CommonJS规范,一个单独的文件就是一个模块.加载模块使用require方法,该方法读取一个文件并执行,最后返回文件 ...
- Commonjs规范及Node模块实现
前面的话 Node在实现中并非完全按照CommonJS规范实现,而是对模块规范进行了一定的取舍,同时也增加了少许自身需要的特性.本文将详细介绍NodeJS的模块实现 引入 nodejs是区别于java ...
- es6 模块的语法概述
概述 历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来.其他语言都有这项功能,比如 Ruby 的require.Pytho ...
- Node概述_note
Node概述 Node的执行方式 Node环境和浏览器环境的区别 Node身上全局对象的属性 Node中的模块 Node中导出数据的几种方式 1.什么是Node.js? Node.js 是一个基于&q ...
- JavaScript模块 commonJS、AMD、UMD、ES6
模块化 早期,立即调用函数闭包.类.对象实现 Node有自己的模块系统 ES6,JavaScript依托import.export的静态模块系统(不能实现模块的按需加载) 虽然浏览器很早就支持动态导入 ...
- 模块格式:CommonJS AMD CMD UMD ES6
皆为前端工程化中定义模块(module)的规则,如:模块标识,模块依赖,模块实现,模块对外接口,模块加载: 实现时有:异步,同步,依赖前置,依赖就近,预执行,懒执行,软依赖,硬依赖,模块对象支持类型等 ...
- CommonJs详解
CommonJs详解 1 概述 2 module对象 2.1 module.exports属性 2.2 exports变量 3 AMD规范与CommonJS规范的兼容性 4 require命令 4.1 ...
- 前端模块化详解(CommonJS、AMD、CMD、ES Module)
大家好,我是一碗周,一个不想被喝(内卷)的前端.如果写的文章有幸可以得到你的青睐,万分有幸~ 写在前面 随着前端项目的不断复杂,代码日益膨胀,项目的维护难度随之越来越大,此时模块化也就相继的出现了,本 ...
- 【nodejs开发个人博客】- 0 概述
文章目录 概述 1.nodejs的用途: 2.nodejs的下载和安装 3.nodejs 和javascript的区别 4.模块化 5.server端 和前端的 不同 6.个人博客技术方案 概述 本笔 ...
最新文章
- 安装Redis Live监控服务
- python定时任务_Python3实现定时任务的四种方式
- asynchronous-logging-with-log4j-2--转
- java学习(153):字符输出流
- f分布表完整图a=0.05_2019年05月16日,沪深A股股票分析
- 2018.6.5今天跟着视频做了一个提交Todolist
- ActiveMQ学习总结(4)——业界消息队列简介
- HEVC与VP9编码效率对比
- windows 64位PHP5.5配置xhprof
- redis缓存Hash操作的在主数据中的应用
- 【ITS模型】基于MATLAB的ITS宽带短波信道模型的建模和仿真
- 互联网靠什么赚钱和发展趋势
- 数据结构总结(线性结构,树型结构,图型结构,顺序结构,链式结构)
- 登录江苏人社网办大厅
- Oracle 设置 密码可以重复使用 the password cannot be reused
- mysql之日志时间统计---每类日志时间间隔(间隔超过多少分钟统计出来)
- week9-东东学打牌
- 基于单片机的智能浇花(灌溉)系统设计
- python3 zip破解
- hbase报错总结01_李孟_新浪博客