node 12基本介绍(-)

一,node是什么

Node.js是一个开源、基于Chrome的V8 JavaScript引擎构建的JavaScript运行时。它在浏览器外部执行JavaScript代码。

二,依赖库及工具

  1. 依赖库
    1. V8, V8库为node.js提供了一个javascript引擎,node.js可以通过V8 C++ API对其进行控制。V8是有google来维护,并在chrome浏览器中使用。它是用来把javascript语言转换为机器码,极大运行效率。
    2. libuv,这是一个C库,用于将非阻塞I / O操作抽象为所有受支持平台之间的一致接口。它提供了处理文件系统,DNS,网络,子进程,管道,信号处理,轮询和流传输的机制。它还包括一个线程池,用于分担某些无法在操作系统级别异步完成的工作。
    3. llhttp,是一个有轻量的typescript 和C语言库实现的http解析器,它不会进行任何系统调度和分配,因此它的每个请求占用内存很小。
    4. c-ares,对于某些异步dns请求,node.js使用了C语言实现的c-ares库。
    5. openssl,OpenSSL在tls和crypto模块中广泛使用。它提供了经过考验的许多加密功能的实现,现代网络依靠这些功能来确保安全性。
    6. zlib,为了实现快速压缩和解压缩,Node.js依赖于行业标准的zlib库,该库也因在gzip和libpng中的使用而闻名。 Node.js使用zlib创建同步,异步以及流式压缩和解压缩接口。
  2. 工具
    1. npm, node.js库管理工具, Node.js全部与模块化有关,随之而来的是对质量软件包管理器的需求。为此制作了npm。 npm附带了所有编程生态系统中社区创建的软件包的最大选择,这使得构建Node.js应用程序变得快速,容易。
    2. gyp,生成系统由gyp处理,gyp是从V8复制的基于python的项目生成器。主要用来编译代码库。
    3. gtest,可以使用来自Chromium的gtest测试本机代码。

三,基本功能模块

  1. assert,断言模块,提供了一组断言函数,用于验证不变量。

    1
    const assert = require('assert');
  2. async hooks,异步钩子,提供了一些 API 用于跟踪 NodeJs 中的异步资源的生命周期。在异步调用中我们很难正确的追踪异步调用的处理逻辑及关系,因此该模块就可以帮助处理逻辑流程

    1
    const async_hooks = require('async_hooks');
  3. Buffer,缓冲器,缓冲区对象用于表示固定长度的字节序列。许多Node.js API支持缓冲区。

    1
    const buf2 = Buffer.alloc(10, 1);//创建长度为10的1填充缓冲区
  4. C++ addons,C++插件,插件是用C ++编写的动态链接的共享对象。 require()函数可以将加载项作为普通的Node.js模块加载。插件提供JavaScript和C / C ++库之间的接口。

  5. N-API,是用于构建本机插件的API。它独立于底层JavaScript运行时(例如V8),并作为Node.js本身的一部分进行维护。该API将是跨Node.js版本稳定的应用程序二进制接口(ABI)。旨在使Addons与基础JavaScript引擎的更改保持隔离,并使为一个主要版本编译的模块可以在Node.js的更高主要版本上运行,而无需重新编译。

  6. C++ Embedder API,Node.js提供了许多C ++ API,可用于从其他C ++软件在Node.js环境中执行JavaScript。这些API的文档可以在Node.js源代码树的

    src / node.h中找到。

  7. Child Processes,提供了以类似于popen但不相同的方式生成子进程的功能。此功能主要由child_process.spawn()函数提供

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    const { 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}`);
    });
  8. 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
    25
    const 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`);
    }