NodeJS

NodeJS架构

V8: 执行JS代码,提供桥梁接口
Libuv: 时间循环、事件队列、异步IO
第三方模块: zlib、http、c-ares等

libuv

事件循环机制图(已移除本地图片引用)

node事件循环

事件循环流程图(已移除本地图片引用)

NodeJS特点

NodeJS主线程单线程

NodeJS更适合IO密集型的高并发请求

NodeJS作为中间层

![[Pasted image 20230418140506.png]]

常见全局变量

__filename: 返回正在执行脚本文件的绝对路径
__dirname: 返回正在执行脚本的所在目录
timer类函数: 执行顺序与事件循环间的关系
process:提供与当前进程互动的接口
require: 实现模块的加载
module、exports: 处理模块的导出

process

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
1.资源: CPU 内存
// const fs = require('fs');
// Buffer.alloc(1001)
console.log(process.memoryUsage());
{
  rss: 31047680, // 常驻内存
  heapTotal: 6434816, // 申请的总内存大小
  heapUsed: 5687912, // 使用内存
  external: 422438,  // 底层核心模块占据内存大小
  arrayBuffers: 17606 // 独立空间大小(缓冲区)
}


console.log(process.cpuUsage());
//用户 系统
{ user: 15000, system: 46000 }


2.运行环境: 运行目录 node环境 cpu架构 用户环境 系统平台

// 运行目录

console.log(process.cwd());

// node环境

console.log(process.version);

console.log(process.versions);

// cpu架构

console.log(process.arch);

// 用户环境

console.log(process.env.NODE_ENV);

console.log(process.env.PATH);

// 用户管理员目录

console.log(process.env.USERPROFILE); //HOME

// 系统平台

console.log(process.env.NODE_ENV);

console.log(process.platform);




3.运行状态: 启动参数、PID、运行时间

console.log(process.argv);

console.log(process.argv0);

console.log(process.exeArgv);

console.log(process.pid);  // | ppid



console.log(process.uptime());



setTimeout(() => { console.log(process.uptime()) }, 3000)


4.事件监听

process.on('exit', (code) => {

  // 只支持同步代码

  console.log('exit ' + code);

})



process.on('beforeExit', (code) => {

  // 支持异步代码

  console.log('beforeExit ' + code);

  // 需要注意的是,在 beforeExit 中执行的异步操作可能会导致 Node.js 进程无法正常退出,因此应该尽量避免在 beforeExit 中执行长时间运行的异步操作。

  // setTimeout(() => {

  //   console.log('before exit !!!');

  // }, 1000)

})

console.log('executed');



process.exit();


5.标准输入 输出 错误

/* console.log = function (data) {

  // process.stdout 返回流

  process.stdout.write('---' + data + '\n');

};



console.log(11);

console.log(22); */



const fs = require('fs');

fs.createReadStream('test.txt')

  .pipe(process.stdout)



process.stdin.pipe(process.stdout)



process.stdin.setEncoding('utf-8')

process.stdin.on('readable', () => {

  let chunk = process.stdin.read();

  if (chunk !== null) {

    process.stdout.write('data ' + chunk);

  }

})

path

basename() 获取路径中基础名称
dirname() 获取路径中的目录名称
extname() 获取路径中的扩展名称
isAbsolute() 获取路径是否为绝对路径
join() 拼接多个路径片段
resolve() 返回绝对路径
pasre() 解析路径
format() 序列化路径
normalize() 规范化路径