Node.js 基本架构解析

2022-07-28,,,

1、Node.js 简介

首先强调一下,Node.js 不是一个前端的 web 框架,不能将其与 Java 的 Spring 做类比,同时它也不是一门编程语言,它并不是面向后端的一门 js,它仅仅是以 js 为后缀的,所以也不能将其与 Python 或 PHP 做对比。那 Node.js 是什么?

我们一般称 Node.js 是一个平台,它将多种技术组合起来,让 JavaScript 也能调用系统接口、或进行后端开发的应用。Node.js 依赖的架构主要有 V8 引擎 libuv,以及一些 C/C++ 实现的 c-ares、http-parser、OpenSSL、zlib。

说白话就是,Node.js 给 JavaScript 提供了一个平台,让 JavaScript 可以调用一些 C/C++ 的接口,进而 JavaScript 就有了后端开发的能力。

ps:Node.js 的版本 已经到 15 了,双数是稳定版,单数是非稳定版,Node 8 可能不太支持 Vue3,建议使用 Node 10 或 12。至于 Node.js 的安装,这里就不作介绍了,到 Node 官网 直接下载安装包,傻瓜式安装就行了,安装完毕之后在命令行输入 node -v 后,如果能显示当前版本即表示安装成功。

除了安装 node 之外,还推荐安装切换源工具,用于管理你的镜像:nrm,它可以用于切换下载源,如果你是用 yarn,则可以安装 yrm 来管理你的下载镜像。

2、Node.js 基本架构

Node.js主要分为四大部分,Node Standard Library,Node Bindings,V8,Libuv,架构图如下:

  • Node Standard Library 是 Node 专门提供给开发人员使用的标准库,如 Http, Buffer, fs 等模块。
  • Node Bindings 是沟通 JS 和 C++ 的桥梁,封装 V8 引擎 和 Libuv 的细节,向上层提供基础 API 服务。
  • 这一层是支撑 Node.js 运行的关键,由 C/C++ 实现。
    • V8 是 Google 开发的 JavaScript 引擎,提供 JavaScript 运行环境,可以说它就是 Node.js 的发动机。
    • Libuv 是专门为 Node.js 开发的一个封装库,提供跨平台的异步 I/O 能力.
    • C-ares:提供了异步处理 DNS 相关的能力。
    • http_parser、OpenSSL、zlib 等:提供包括 http 解析、SSL、数据压缩等其他的能力。

3、Bindings 是个啥?

Node Bindings 是沟通 JS 和 C++ 的桥梁,封装 V8 引擎 和 Libuv 的细节,向上层提供基础 API 服务。

举个例子:C/C++ 实现了一个 http_parser 的库,非常高效,但是前端开发人员只会写 JavaScript,直接调用这个库肯定是不能成功的,所以就需要一个中间的桥梁。

Node.js 用 C++ 对 http_parser 库进行封装,使它符合某些要求(比如统一数据类型等),封装的文件叫做 http_parser_bindings.cpp。同时 Node.js提供的编译工具可以将其编译为.node文件。这样 JavaScript 代码可以直接 require 这个 .node 文件,这样 JavaScript 就能调用 C++ 库。

中间的桥梁就是 binding 由于 Node.js 提供了很多 binding,所以加个 s 这就是 bindings。

有了这个 Node Bindings 后,JavaScript 和 C++ 就可以进行一些相互调用的操作,进而实现功能上的一些通信。

这里有官网提供的示例,便于大家理解 JS 和 C++ 是如何进行通信的:JS 调用 C++ 代码、C++ 调用 JS 回调。

除了 Node.js 提供的这些 Bindings 之外,还支持开发人员自定义封装 C/C++ 来扩展你想要实现的功能。

4、为什么是 libuv?

Node.js 最初开始于 2009 年,是一个可以让 Javascript 代码离开浏览器的执行环境也可以执行的项目。 Node.js 当时是使用了 Google 的 V8 解析引擎 和 Marc Lehmann 的 libev。Node.js 将事件驱动的 I/O 模型与适合该模型的编程语言(Javascript)融合在了一起。随着 Node.js 的日益流行,Node.js 需要同时支持 Windows, 但是 libev 只能在 Unix 环境下运行。Windows 平台上与kqueue(FreeBSD) 或者 (e)poll(Linux) 等内核事件通知相应的机制是 IOCP。

基于上述背景,Node.js 之父 Ryan 就着手开发了一个跨平台的异步 I/O 库 libuv。它的功能一般是用于 TCP/UDP/DNS/文件等的异步操作。

 

本文地址:https://blog.csdn.net/Marker__/article/details/109254948

《Node.js 基本架构解析.doc》

下载本文的Word格式文档,以方便收藏与打印。