1. CommonJS规范产生背景

在后端,JavaScript的规范远远落后并且有很多缺陷,这使得难以使用JavaScript开发大型应用。比如:

  • 没有模块系统
  • 标准库较少
  • 没有标准接口
  • 缺乏包管理系统

CommonJS规范 的提出,主要是为了弥补JavaScript没有标准的缺陷。CommonJS API将通过定义处理许多常见应用程序需求的API来填补这一空白,最终提供与Python,Ruby和Java一样丰富的标准库。以达到像Python、Ruby和Java那样具备开发大型应用的基础能力,而不是停留在开发浏览器端小脚本程序的阶段。

应用程序开发人员能够使用CommonJS API编写应用程序,然后跨不同的JavaScript解释器和主机环境运行该应用程序。

2. CommonJS模块规范

CommonJS模块规范主要分为三部分:模块引用、模块定义、模块标识。

2.1 模块引用

//引入http模块,并赋值给变量http
var http = require('http');

require函数的基本功能是,读入并执行一个JavaScript文件,然后返回该模块的exports对象。当我们用require()获取module时,Node会根据module.id找到对应的module,并返回module. exports,这样就实现了模块的输出。

require函数使用一个参数,参数值可以带有完整路径的模块的文件名,也可以为模块名。

require("./module/b"); //相对路径
require("../node/module/c");  //绝对路径

文件目录结构如下:

2.2 模块定义

2.2.1 模块(module)是什么

CommonJS规范规定,一个文件就是一个模块,用module变量代表当前模块。 Node在其内部提供一个Module的构建函数。所有模块都是Module的实例。实例代码如下:

function Module(id, parent) {this.id = id;this.exports = {};this.parent = parent;this.filename = null;this.loaded = false; this.children = []; } module.exports = Module; var module = new Module(filename, parent);

每个模块内部,都有一个module对象,代表当前模块。它的属性如下:

  • module.id 模块的识别符,通常是带有绝对路径的模块文件名。
  • module.filename 模块的文件名,带有绝对路径。
  • module.loaded 返回一个布尔值,表示模块是否已经完成加载。
  • module.parent 返回一个对象,表示调用该模块的模块。
  • module.children 返回一个数组,表示该模块要用到的其他模块。
  • module.exports 初始值为一个空对象{},表示模块对外输出的接口。

2.2.2 exports 属性

exports 属性是module对象的一个属性,它向外提供接口。
如 2.1模块引用 中示例,a.js引入b.js作为一个模块,当在b.js中定义如下方法时:

//加法
function add(num1,num2){console.log(num1+num2);
}

在a.js中调用却报错

var addMethod = require("./module/b");
//调用模块中的add方法
addMethod.add(1,6);

b.js中的函数要能被其他模块使用,就需要暴露一个对外的接口,exports 属性用于完成这一工作。b.js中的方法定义修改如下:

exports.add = function(num1,num2){console.log(num1+num2);
}

在a.js中能够调用。

2.3 模块标识

模块标识就是传递给require方法的参数,必须符合小驼峰命名的字符串,或者以.、..开头的相对路径,或者绝对路径,默认文件名后缀.js。在Node实现中,正是基于这样一个标识符进行模块查找的,如果没有发现指定模块会报错。

根据参数的不同格式,require命令去不同路径寻找模块文件。加载规则如下:

(1)如果参数字符串以“/”开头,则表示加载的是一个位于绝对路径的模块文件。比如,require('/home/marco/foo.js')将加载/home/marco/foo.js。

(2)如果参数字符串以“./”开头,则表示加载的是一个位于相对路径(跟当前执行脚本的位置相比)的模块文件。比如,require('./circle')将加载当前脚本同一目录的circle.js。

(3)如果参数字符串不以“./“或”/“开头,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中),或者一个位于各级node_modules目录的已安装模块(全局安装或局部安装)。

举例来说,脚本/home/user/projects/foo.js执行了require('bar.js')命令,Node会依次搜索以下文件。

/usr/local/lib/node/bar.js/home/user/projects/node_modules/bar.js/home/user/node_modules/bar.js/home/node_modules/bar.js/node_modules/bar.js

这样设计的目的是,使得不同的模块可以将所依赖的模块本地化。

(4)如果参数字符串不以“./“或”/“开头,而且是一个路径,比如require('example-module/path/to/file'),则将先找到example-module的位置,然后再以它为参数,找到后续路径。

(5)如果指定的模块文件没有发现,Node会尝试为文件名添加.js、.json、.node后,再去搜索。.js件会以文本格式的JavaScript脚本文件解析,.json文件会以JSON格式的文本文件解析,.node文件会以编译后的二进制文件解析。

(6)如果想得到require命令加载的确切文件名,使用require.resolve()方法。

CommonJS是同步的,意味着你想调用模块里的方法,必须先用require加载模块。这对服务器端的Nodejs来说不是问题,因为模块的JS文件都在本地硬盘上,CPU的读取时间非常快,同步不是问题。但如果是浏览器环境,要从服务器加载模块。模块的加载将取决于网速,如果采用同步,网络情绪不稳定时,页面可能卡住,这就必须采用异步模式。所以,就有了 AMD解决方案。下一篇我们开始介绍模块化规范的AMD规范;

参考:

https://www.cnblogs.com/huiguo/p/7967241.html

https://nodejs.org/api/modules.html#modules_module_exports

Node.js相关——CommonJS规范相关推荐

  1. js 多个定时器_Node.js系列深入浅出Node模块化开发——CommonJS规范

    前言 本文将为大家透彻的介绍关于Node的模块化--CommonJS的一切. 看完本文可以掌握,以下几个方面: 什么是模块化,以及没有模块化会带来哪些问题,是如何解决的: JavaScript的设计缺 ...

  2. Node.js相关资源

    最近在学习nodejs方面的知识,下面推荐一些好的相关书籍 1. 深入浅出Nodejs. 下载链接: 城通网盘:https://u18444140.ctfile.com/fs/18444140-311 ...

  3. JS模块化规范对比以及在Node.js的实现

    文章目录 写在前面 JavaScript模块化的规范 Node.js 的模块化实现 AMD or CMD 代码示例 ES6模块化标准以及在Node.js的使用 写在前面 关于JavaScript的模块 ...

  4. nodejs01——安装及使用、服务端及客户端、commonjs规范、fs模块的使用(文件操作及目录操作)、stream、buffer、WebServer、端口、动态资源及静态资源、头信息、请求方式

    nodejs的安装及使用 服务端及客户端 commonjs规范 fs模块的使用(文件操作及目录操作) stream buffer // Node.js介绍 Node.js 诞生于2009年,Node. ...

  5. Node.js(一)——(Node.js安装及使用,通过Node.js搭建服务器,模块化及自定义模块,npm/yarn/nvm,内置模块fs的使用,buffer及stream,新闻列表案例)

    目录 1.Node.js介绍 2.安装Node.js 3.使用Node.js实现第一个服务器 3.1初步感受Node.js 3.2Google Chrome 默认非安全端口列表,尽量避免以下端口. 3 ...

  6. Node.js快速入门之基础模块及常用api

    目录 Node特点 模块化 文件 文件读取 文件写入 文件删除 Buffer(缓存数据) 读取/删除目录 输入输出 文件流 写入流 读取流 先流入后流出的整个流程 管道流 Node事件 Os模块和pa ...

  7. Node.js b站教学视频汇总笔记(完)CommonJS模块规范、 require、npm、Express(中间件)、MongoDB、MySQL

    文章目录 Node.js b站教学视频汇总笔记(完)CommonJS模块规范. require.npm.Express(中间件).MongoDB.MySQL 1. Node介绍 为什么要学习Node. ...

  8. Node.js 官网入门教程(一) CommonJS 模块规范、Node.js REPL、console、CLI、exports

    Node.js 官网入门教程(一) CommonJS 模块规范.Node.js REPL.console.CLI.exports 文章目录 Node.js 官网入门教程(一) CommonJS 模块规 ...

  9. Node.js的核心与红利

    唯有明晰历史,才能了然当下,预知未来.作者从历史角度解读Node.js,帮助读者透过猜忌和谣言,看清真实的Node.js,了解Node.js的核心与红利. 令人惴惴不安的Node.js 我们越来越频繁 ...

  10. 如何让服务器运行js,服务器端JavaScript运行环境Node.js的依赖性管理

    众所周知,Node.js是一个基于Chrome V8引擎的服务器端JavaScript运行环境.它采用了一种事件驱动的.非阻塞式的I/O模式,运行起来既轻量级又高效.诚然,我们可以使用单个js文件,来 ...

最新文章

  1. 理清那么多个OO(面向对象)
  2. docker分离部署lnmp
  3. /etc/shadow 密码加密方法
  4. 码农干货系列【17】--Wind.js与Promise.js
  5. 文本文档TXT每行开头结尾加内容批处理代码
  6. hightmaps 按地图上显示的统计数据
  7. android 系统dialog的应用
  8. 解决VisualStudio2008下asp.net mvc开发向View中添加服务器控件崩溃的问题
  9. Cache-control
  10. kux格式怎么转换成mp3_怎么快速无损地把视频转换成mp3格式?三种方法了解一下吗?...
  11. 【字符编码】Unicode字符集与字符编码方式
  12. 如何在两台电脑之间共享文件
  13. 去除UC浏览器强制嵌入的垃圾广告代码
  14. 小米4c怎么添加语言怎么设置在哪个文件夹,小米4C怎么加密图片?私密文件夹使用方法...
  15. 计算机的四个发展阶段的应用,计算机分为哪四个发展阶段
  16. 数据结构(二)算法绪论
  17. JQuery中$是什么?
  18. 单系统 台电x80pro_转载:台电X80 Pro Plus 刷Windows10单系统
  19. 回忆鸭掌门的麻辣兔丁
  20. android 地铁地图api,百度地铁图JS API使用

热门文章

  1. C++ ORM ODB入门
  2. Android Cursor浅析
  3. 22.1-在散列集上进行集合操作
  4. Expression Blend实例中文教程(5) - 布局控件快速入门StackPanel,ScrollViewer和Border
  5. 二、设置开发、运行环境 (基础教程2)
  6. Performance Engineering of Software Systems (一)——准备工作
  7. linux内核奇遇记之md源代码解读之三
  8. python 多线程 全局锁_python的多线程+GIL全局解释器锁+其他LOCK
  9. vue 中watch函数名_vue中watch的使用
  10. stm32 读取sd卡图片显示_全面测试雷克沙1667x 性能,你懂什么叫超高速SD卡吗