在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的概念如上,例子已上传,一个是基本使用,另一个是模拟扑克牌发牌的过程

CommonJS概述及使用相关推荐

  1. CommonJS规范(转)

    概述 CommonJS是服务器端模块的规范,Node.js采用了这个规范. 根据CommonJS规范,一个单独的文件就是一个模块.加载模块使用require方法,该方法读取一个文件并执行,最后返回文件 ...

  2. Commonjs规范及Node模块实现

    前面的话 Node在实现中并非完全按照CommonJS规范实现,而是对模块规范进行了一定的取舍,同时也增加了少许自身需要的特性.本文将详细介绍NodeJS的模块实现 引入 nodejs是区别于java ...

  3. es6 模块的语法概述

    概述 历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来.其他语言都有这项功能,比如 Ruby 的require.Pytho ...

  4. Node概述_note

    Node概述 Node的执行方式 Node环境和浏览器环境的区别 Node身上全局对象的属性 Node中的模块 Node中导出数据的几种方式 1.什么是Node.js? Node.js 是一个基于&q ...

  5. JavaScript模块 commonJS、AMD、UMD、ES6

    模块化 早期,立即调用函数闭包.类.对象实现 Node有自己的模块系统 ES6,JavaScript依托import.export的静态模块系统(不能实现模块的按需加载) 虽然浏览器很早就支持动态导入 ...

  6. 模块格式:CommonJS AMD CMD UMD ES6

    皆为前端工程化中定义模块(module)的规则,如:模块标识,模块依赖,模块实现,模块对外接口,模块加载: 实现时有:异步,同步,依赖前置,依赖就近,预执行,懒执行,软依赖,硬依赖,模块对象支持类型等 ...

  7. CommonJs详解

    CommonJs详解 1 概述 2 module对象 2.1 module.exports属性 2.2 exports变量 3 AMD规范与CommonJS规范的兼容性 4 require命令 4.1 ...

  8. 前端模块化详解(CommonJS、AMD、CMD、ES Module)

    大家好,我是一碗周,一个不想被喝(内卷)的前端.如果写的文章有幸可以得到你的青睐,万分有幸~ 写在前面 随着前端项目的不断复杂,代码日益膨胀,项目的维护难度随之越来越大,此时模块化也就相继的出现了,本 ...

  9. 【nodejs开发个人博客】- 0 概述

    文章目录 概述 1.nodejs的用途: 2.nodejs的下载和安装 3.nodejs 和javascript的区别 4.模块化 5.server端 和前端的 不同 6.个人博客技术方案 概述 本笔 ...

最新文章

  1. 安装Redis Live监控服务
  2. python定时任务_Python3实现定时任务的四种方式
  3. asynchronous-logging-with-log4j-2--转
  4. java学习(153):字符输出流
  5. f分布表完整图a=0.05_2019年05月16日,沪深A股股票分析
  6. 2018.6.5今天跟着视频做了一个提交Todolist
  7. ActiveMQ学习总结(4)——业界消息队列简介
  8. HEVC与VP9编码效率对比
  9. windows 64位PHP5.5配置xhprof
  10. redis缓存Hash操作的在主数据中的应用
  11. 【ITS模型】基于MATLAB的ITS宽带短波信道模型的建模和仿真
  12. 互联网靠什么赚钱和发展趋势
  13. 数据结构总结(线性结构,树型结构,图型结构,顺序结构,链式结构)
  14. 登录江苏人社网办大厅
  15. Oracle 设置 密码可以重复使用 the password cannot be reused
  16. mysql之日志时间统计---每类日志时间间隔(间隔超过多少分钟统计出来)
  17. week9-东东学打牌
  18. 基于单片机的智能浇花(灌溉)系统设计
  19. python3 zip破解
  20. hbase报错总结01_李孟_新浪博客

热门文章

  1. Android 硬件 OpenGL ES 模拟设计概述
  2. MySQL 备份与主从复制
  3. kubernetes(七)项目部署方式:蓝绿部署,灰度发布/金丝雀发布,滚动更新
  4. 推荐 | 8 个 SpringBoot 精选项目
  5. 史上最难10道Java面试题!
  6. Redis在持久化时产生的延迟
  7. Netflix选择AVIF作为下一代图片压缩技术
  8. LiveVideoStack冬季招聘(高级策划编辑,市场BD主管)
  9. 技术人的少年感,和年龄无关。
  10. 腾讯蓝鲸智云社区版V6.0.3携手容器管理平台正式发布!