模块化
1.什么是模块化、模块化开发
事实上模块化开发最终的目的是将程序划分成一个个小的结构;
这个结构中编写属于自己的逻辑代码,有自己的作用域,定义变量名词时不会影响到其他的结构;
这个结构可以将自己希望暴露的变量、函数、对象等导出给其结构使用;
也可以通过某种方式,导入另外结构中的变量、函数、对象等;
2.Node.js中的模块作用域
模块作用域:
和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问权限,叫做模块作用域。
模块作用域的好处:
防止了全局变量污染的问题
3.向外共享模块作用域中的成员
module对象
在每个.js自定义模块中都有一个module对象,它里面存储了和当前模块相关的信息,
console.log(module) 打印如下:
module.exports对象
在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用
注:使用require()方法导入模块时,导入的结果永远以module.exports指向的对象为准
exports对象
为了简化向外共享成员的代码,Node提供了exports对象,==默认情况下,exports和module.exports指向同一个对象==。最终共享结果,还是以module.exports指向的对象为准。
4.require细节
==require是一个函数==,可以帮助我们引入一个文件(模块)中导出的对象。
require的查找规则
导入格式:require(x)
X是一个Node核心模块,比如path、http
直接返回核心模块,并且停止查找
X是以 ./ 或 ../ 或 /(根目录)开头的
第一步:将X当做一个文件在对应的目录下查找;
1.如果有后缀名,按照后缀名的格式查找对应的文件
2.如果没有后缀名,会按照如下顺序:
1> 直接查找文件X
2> 查找X.js文件
3> 查找X.json文件
4> 查找X.node文件
第二步:没有找到对应的文件,将X作为一个目录
查找目录下面的index文件
1> 查找X/index.js文件
2> 查找X/index.json文件
3> 查找X/index.node文件
如果没有找到,那么报错:not foun
5.模块化规范
Node.js遵循了CommonJS模块化规范。CommonJS规定了==模块的特性==和==各模块之间如何相互转换==。
CommonJS规定:
每个模块内部,module变量代表当前模块
module变量是一个对象,它的exports属性是对外的接口。
加载某个模块,其实是加载该模块的module.exports属性,==require()方法用于加载模块==。
所以,Node中对CommonJS进行了支持和实现,让我们在开发node的过程中可以方便的进行模块化开发:
在Node中每一个js文件都是一个单独的模块;
这个模块中包括CommonJS规范的核心变量:exports、module.exports、require;
我们可以使用这些变量来方便的进行模块化开发;
模块化的核心是导出和导入,Node中对其进行了实现:
exports和module.exports可以负责对模块中的内容进行导出;
require函数可以帮助我们导入其他模块(自定义模块、系统模块、第三方库模块)中的内容;