commonjs规范
为什么要学习commonjs规范
因为commonjs规范被nodejs所使用,所以我们在学习nodejs之前,必须要对commonjs有一个清楚的了解
弥补JavaScript没有标准的缺陷,已达到像Python和Java那样具备开发大型应用的基础能力,而不是停留在开发浏览器端小脚本程序的阶段
什么是commonjs
commonJS就是为JS的模块来制定规范,因为js没有模块的功能所以CommonJS应运而生,它希望js可以在任何地方运行,不只是浏览器中。
commonjs用来规范服务器端的js脚本
模块发展史
萌芽时代,使用的编程技巧 自执行函数
09年Node.js在出现,实现了commonjs规范
三大派系之保守派,遵循了commonjs规范,提出了browserify工具
三大派系之革新派,提出了AMD规范,推出了require.js
三大派系之中立派,提出了CMD规范,推出了sea.js
AMD规范和CMD规范只能用在浏览器中,commonjs规范用于服务端
nodejs常见模块
核心模块(系统模块)
系统模块在源代码中已经编译了,以二进制文件存在,模块引入时可以直接加到内存。
对比一下,好比是浏览器执行环境,自动提供了BOM和DOM对象。
Node.js作为js的服务端执行环境,自动提供了一些对象,这些对象以模块的形式来存在的。
只要安装好node,就自然有这些核心模块。
常见的核心模块有:
- fs模块
- http模块/https模块
- path模块
- querystring模块
- url模块
- net模块
用户模块
所有非核心的模块,都是用户模块。 针对用户模块,又分成两种:
- 自定义模块,自己开发项目时定义的模块,自己定义自己用
- 第三方模块,第三方人士开源的自定义模块,需要使用npm来安装,然后引入使用
任何一个模块,必须要加载之后才能使用。 加载的方法很简单,使用require函数
require方法是nodejs提供的用于引用模块的方法。
require函数会返回一个对象,该对象公开的API可能是函数,对象。取决于模块是如何定义的,大部分情况下都是对象。
根据不同类型的模块,加载的方式略有不同:
核心模块的加载
最为简单,直接使用require载入即可,参数就是模块名称
var 名称 = require(模块名称);
require函数的参数就是模块名称,不要加任何路径、也不要加任何后缀
第三方模块的加载
针对第三方模块,必须要安装,然后才能使用require加载
使用 npm i 模块名 安装
引入
var 名称 = require(模块名称);
注意:在用法上,和核心模块是一致的,但是加载的原理是有区别的:
第三方模块
必须要安装的,然后在require的时候,也有一个查找机制,首先会在当前目录的node_modules来找,如果找到,就直接使用,否则就在祖先目录中来查找,直至根目录,根目录如果没有,再去全局路径进行查找,如果找到,使用之,如果没有找到,就会报错。
并且,node_modules文件夹的名称是固定的,不能更改。
自定义模块的加载
- 定义一个模块并导出
module.exports是一个node.js自带的对象,作为require函数的返回值,它的默认值是{}。所以,我们在导出模块接口的时候,需要作为这个对象的属性来导出
作为模块,一般都是导出一些对象,供其他模块来使用
module.exports有一个别名—exports,所以还有一种方法导出模块的接口
所谓的别名,其实是exports引用了module.exports对象
require函数获取的结果一定是module.exports,一旦给exports赋值之后就和module.exports一刀两断了,没有任何关系了。所以,在使用exports别名的时候,只能挨个的往exports对象上添加属性,而不能直接赋值
2. 使用require加载
require('./index.js')
必须要使用相对路径或绝对路径,建议使用相对路径,使用./或…/开头
require('./index')
当文件不带后缀,node会依照 目录 ->.js-> .json-> .node 的顺序进行查找.如果所有模块路径都找不到该文件,则抛出异常。
如果是目录的话,通常是会自动载入这个目录下的index.js文件
require('./src') 等同于require('./src/index.js')