node--module模块
摘要:
主要是从module的几个特性讲解
1. 稳定性
export.a = function() {}; export.b = function() {};
这里两个函数都是被添加到exports根部的对象上,模块内本地变量是私有的。
2. 访问主模块
require.main === module
如果直接用node执行某个文件,那这个文件就是主模块,默认被赋值给require.main。
3. 缓存
模块在第一次加载后就会被缓存,多次调用不会导致模块的代码多次执行,可以但会'部分完成'的对象,从而允许加载依赖的模块,所以不会导致循环依赖。
4. 循环
当循环调用require()时,一个模块可能在未完成执行时被返回。
执行顺序: main.js b.js a.js b.js ->done a.js ->done main.js -> done
5. 目录作为模块
require()寻找路径先通过寻找package.json中的main模块,在根据main模块的路径,寻找当前所在的路径位置
6. 模块包装器(划重点)
在执行代码前,node.js会使用下面这个函数把文件包装起来
(function(exports, require, module, __filename, __dirname) { //.......真正要执行的部分 })
包装的原因
(1)保证定义的变量的模块化
(2)提供一些看似全局,但实际上是模块特定的变量
7. 模块的作用域
(1) __dirname: 当前木块的目录
(2)__filename: 当前木块的文件名(局对路径)
(3)exports: exports虽然是module.exports的简写,但是一旦 exports被赋值,module.exports就无法改变这个值了
(4)module: 在每个模块中,module
的自由变量是一个指向表示当前模块的对象的引用。 为了方便,module.exports
也可以通过全局模块的 exports
对象访问。 module
实际上不是全局的,而是每个模块本地的。