一,node是什么
Node.js是一个开源、基于Chrome的V8 JavaScript引擎构建的JavaScript运行时。它在浏览器外部执行JavaScript代码。
二,依赖库及工具
- 依赖库
- V8, V8库为node.js提供了一个javascript引擎,node.js可以通过V8 C++ API对其进行控制。V8是有google来维护,并在chrome浏览器中使用。它是用来把javascript语言转换为机器码,极大运行效率。
- libuv,这是一个C库,用于将非阻塞I / O操作抽象为所有受支持平台之间的一致接口。它提供了处理文件系统,DNS,网络,子进程,管道,信号处理,轮询和流传输的机制。它还包括一个线程池,用于分担某些无法在操作系统级别异步完成的工作。
- llhttp,是一个有轻量的typescript 和C语言库实现的http解析器,它不会进行任何系统调度和分配,因此它的每个请求占用内存很小。
- c-ares,对于某些异步dns请求,node.js使用了C语言实现的c-ares库。
- openssl,OpenSSL在tls和crypto模块中广泛使用。它提供了经过考验的许多加密功能的实现,现代网络依靠这些功能来确保安全性。
- zlib,为了实现快速压缩和解压缩,Node.js依赖于行业标准的zlib库,该库也因在gzip和libpng中的使用而闻名。 Node.js使用zlib创建同步,异步以及流式压缩和解压缩接口。
- 工具
- npm, node.js库管理工具, Node.js全部与模块化有关,随之而来的是对质量软件包管理器的需求。为此制作了npm。 npm附带了所有编程生态系统中社区创建的软件包的最大选择,这使得构建Node.js应用程序变得快速,容易。
- gyp,生成系统由gyp处理,gyp是从V8复制的基于python的项目生成器。主要用来编译代码库。
- gtest,可以使用来自Chromium的gtest测试本机代码。
三,基本功能模块
assert,断言模块,提供了一组断言函数,用于验证不变量。
1
const assert = require('assert');
async hooks,异步钩子,提供了一些 API 用于跟踪 NodeJs 中的异步资源的生命周期。在异步调用中我们很难正确的追踪异步调用的处理逻辑及关系,因此该模块就可以帮助处理逻辑流程
1
const async_hooks = require('async_hooks');
Buffer,缓冲器,缓冲区对象用于表示固定长度的字节序列。许多Node.js API支持缓冲区。
1
const buf2 = Buffer.alloc(10, 1);//创建长度为10的1填充缓冲区
C++ addons,C++插件,插件是用C ++编写的动态链接的共享对象。 require()函数可以将加载项作为普通的Node.js模块加载。插件提供JavaScript和C / C ++库之间的接口。
N-API,是用于构建本机插件的API。它独立于底层JavaScript运行时(例如V8),并作为Node.js本身的一部分进行维护。该API将是跨Node.js版本稳定的应用程序二进制接口(ABI)。旨在使Addons与基础JavaScript引擎的更改保持隔离,并使为一个主要版本编译的模块可以在Node.js的更高主要版本上运行,而无需重新编译。
C++ Embedder API,Node.js提供了许多C ++ API,可用于从其他C ++软件在Node.js环境中执行JavaScript。这些API的文档可以在Node.js源代码树的
src / node.h中找到。
Child Processes,提供了以类似于popen但不相同的方式生成子进程的功能。此功能主要由child_process.spawn()函数提供
1
2
3
4
5
6
7
8
9
10
11
12
13
14const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});cluster, 集群,Node.js的单个实例在单个线程中运行。为了利用多核系统,用户有时会希望启动Node.js进程集群来处理负载。
群集模块允许轻松创建所有共享服务器端口的子进程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
// Workers can share any TCP connection
// In this case it is an HTTP server
http.createServer((req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
console.log(`Worker ${process.pid} started`);
}