-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnodejs 模块机制
79 lines (52 loc) · 2.27 KB
/
nodejs 模块机制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
二、commonjs模块规范:
1.模块引用
示例:var math = require("math");
2.模块定义
nodejs中一个文件为一个模块,将方法挂载在exports对象作为属性:
a.js内容:
exports.add = function(){
var sum = 0;
return sum;
};
b.js调用:
var math = require("math");
math.add();
3.模块标示
就是传给require的参数,就是路径了
nodejs引入模块内部步骤:
1.路径分析
2.文件定位
3.编译执行
node模块分两种:核心模块和用户编写的模块(文件模块)
自定义模块是最慢的
自定义模块的查找方式:从本目录的node_modules开始往上找 直到根目录的node_modules,
所以一般如果不是全局的 会在本目录加依赖,package.json
文件模块加载: 按.js .node .json 顺序查找,可以给require的文件加扩展名
目录分析和包:
require如果没有找到对应文件而得到一个目录的话,node会将包当做一个包来处理
首先node会目录下的 package.json,通过json.parse解析包描述的对象,然后取出main属性指定的文件名进行定位,
如果文件不存在或者没有package.json,node会将index当作默认文件名,会依次查找index.js 、index.node、index.json
模块编译:
.js文件:通过fs模块同步读取文件后编译执行
.node文件:通过C/C++编写的扩展文件,通过dlopen()方法加载最后编译生成的文件
.json文件:通过fs模块同步读取文件后,用JSON.parse()解析返回结果
其余扩展名文件都被当.js文件载入
每一次编译成的模块都会将其文件路径作为索引缓存在Module._cache对象上。
如果想对自定义的扩展名进行特殊的加载,可以通过类似require.extensions['.ext'] 方式实现,就是可以自己写怎么加载
官方的建议是编译成JS文件加载
exports 和module.exports
bar文件:
exports.change = function(a){
a = 100;
console.log(a);
};//会报错
module.exports = function(a){
a = 100;
console.log(a);
};//不会报错
用C/C++模块编译的比较快
json文件编译:
最简单的,而且你require一个JSON配置文件,可以直接使用
核心模块:
分C/C++编写 和js编写两部分,C/C++编写存在 node项目下的src,js文件存在lib
npm: