NodeJS 第一章(介绍)

316 阅读10分钟

image.png Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它允许开发者使用 JavaScript 语言在服务器端进行编程,说白话就是,Node.js 给 JavaScript 提供了一个平台,让 JavaScript 可以调用一些 C/C++ 的接口,这大大扩展了 JavaScript 的能力

特点

  • 事件驱动:Node.js 采用事件驱动架构,通过事件循环来处理各种操作。这意味着它可以高效地处理大量并发请求,而无需为每个请求创建新的线程,从而提高了系统的性能和可扩展性。
  • 非阻塞 I/O:Node.js 的 I/O 操作是异步的,即非阻塞的。这意味着当进行 I/O 操作(如读取文件、网络请求等)时,Node.js 不会等待操作完成,而是继续执行其他代码,当操作完成后,通过回调函数来处理结果。这种方式大大提高了应用程序的性能和响应速度,能够同时处理大量的并发请求。
  • 单线程:Node.js 在单线程中运行,这与传统的多线程服务器模型不同。它通过事件循环和异步 I/O 来实现高并发处理,避免了多线程编程中常见的线程同步和资源竞争问题,使代码更加简洁和易于维护。
  • 跨平台:Node.js 可以在不同的操作系统上运行,如 Windows、Mac OS、Linux 等,这使得开发者可以轻松地构建跨平台的应用程序。

应用场景

  • Web 应用开发:可以用于构建各种类型的 Web 应用,包括服务器端逻辑、路由处理、中间件等。配合 Express、Koa 等框架,能够快速搭建功能强大的 Web 服务器,处理 HTTP 请求和响应。
  • 后端 API 服务:常用于开发 RESTful API 或其他类型的后端接口,为前端应用或移动应用提供数据支持。它可以与数据库(如 MongoDB、MySQL 等)进行交互,实现数据的存储、查询和更新等操作。
  • 实时应用:由于其事件驱动和非阻塞 I/O 的特性,非常适合开发实时应用,如聊天应用、在线游戏、实时监控系统等。通过 WebSocket 等技术,Node.js 可以实现服务器与客户端之间的实时双向通信。
  • 命令行工具:可以用于开发命令行工具,帮助开发者提高工作效率。例如,创建项目脚手架、自动化任务(如打包、压缩、测试等)、代码检查工具等。

模块系统

  • 核心模块:Node.js 提供了一系列核心模块,如httpfspath等,这些模块可以直接在代码中使用,无需额外安装。核心模块提供了底层的功能支持,如创建 HTTP 服务器、操作文件系统、处理路径等。
  • 第三方模块:通过 npm(Node Package Manager),可以方便地安装和使用大量的第三方模块。npm 是世界上最大的开源库生态系统之一,涵盖了各种功能和领域的模块,如数据库操作、网络请求、加密解密、图形处理等。
  • 自定义模块:开发者还可以根据自己的需求创建自定义模块,将相关的代码封装在一个模块中,提高代码的复用性和可维护性。模块之间可以通过require函数进行相互引用。

与前端 JavaScript 的关系

  • 语法基础相同:Node.js 使用的 JavaScript 语法与前端 JavaScript 基本相同,都遵循 ECMAScript 标准。这使得前端开发者可以很容易地过渡到后端开发,使用熟悉的语言进行服务器端编程。
  • 运行环境不同:前端 JavaScript 运行在浏览器环境中,主要用于操作 DOM、处理用户交互、发送网络请求等。而 Node.js 运行在服务器端,没有浏览器中的 DOM 和 BOM 对象,它主要用于处理服务器端的逻辑、文件操作、网络通信等。
  • 部分 API 不同:由于运行环境的差异,Node.js 和前端 JavaScript 提供了不同的 API。例如,前端 JavaScript 有windowdocument等对象,而 Node.js 有processfs等模块。但在一些方面也有相似的 API,如fetch函数在前端和 Node.js 中都可以用于发送网络请求。

与浏览器的区别

浏览器和 Node.js 都使用 JavaScript 作为编程语言。构建在浏览器中运行的应用与构建 Node.js 应用完全不同。尽管它始终是 JavaScript,但仍存在一些关键差异,这些差异使体验截然不同。

*浏览器NodeJs
BOMYESNo
DOMYESNo(但是可以使用jsdom)
文件操作apiNoYes
版本不可控可控
模块化仅支持ESM 但可以使用babel都支持

相关框架

  • Express:是最流行的 Node.js Web 应用框架之一,它提供了简洁的路由系统和中间件机制,使得构建 Web 应用变得非常容易。可以方便地定义路由、处理请求和响应,并且支持各种 HTTP 方法(GET、POST、PUT、DELETE 等)。

  • Koa:是另一个轻量级的 Node.js 框架,它基于 ES6 的 Generator 函数和 async/await 语法,提供了更优雅的异步处理方式。Koa 的中间件机制非常灵活,能够有效地处理请求和响应的流程,常用于构建高性能的 Web 应用和 API 服务。

  • NestJS:是一个用于构建高效、可扩展的 Node.js 服务器端应用的框架,它采用了类似 Angular 的依赖注入和模块化架构,使得代码更加结构化和易于维护。NestJS 支持多种类型的应用场景,包括 Web 应用、微服务等。

架构

image.png

应用/模块(Application/Modules) :这部分就是所有的 JavaScript 代码:你的应用程序、Node.js 核心模块、任何 npm install 的模块,以及你写的所有模块代码。你花费的主要精力都在这部分。

绑定(Bindings) :Binding 是一些胶水代码,能够把不同语言绑定在一起使其能够互相沟通。在 Node.js 中,binding 所做的就是把 Node.js 那些用 C/C++ 写的库接口暴露给 JS 环境。 注意:C/C++ 这样的系统编程语言通常都比其他高阶语言(Python、JavaScript、Ruby 等等)性能更高,所以把主要消耗 CPU 的操作以 C/C++ 代码来执行更加明智。

C/C++ Addons:如果你想在应用程序中包含其他第三方或者你自己的 C/C++ 库的话,需要自己完成这部分胶水代码。你写的这部分胶水代码就称为 Addon。

V8:Google 开源的高性能 JavaScript 引擎,以 C++ 实现。这也是集成在 Chrome 中的 JS 引擎。V8 将你写的 JavaScript 代码编译为机器码然后执行。V8 有多快?

libuv:提供异步功能的 C 库。它在运行时负责一个事件循环(Event Loop)、一个线程池、文件系统 I/O、DNS 相关和网络 I/O,以及一些其他重要功能。

其他 C/C++ 组件和库:如 c-arescrypto (OpenSSL)http-parser 以及 zlib。这些依赖提供了对系统底层功能的访问,包括网络、压缩、加密等。

应用

前端

  • 构建工具:如 Webpack、Parcel 等,利用 Node.js 实现模块打包、代码压缩、热更新等功能,优化前端开发流程。
  • 任务运行器:像 Gulp、Grunt 等,通过 Node.js 可以自动化执行任务,比如代码检查、测试、文件合并与压缩等,提高开发效率。

后端

  • Web 服务器:使用 Express、Koa 等框架,能够快速搭建 Web 服务器,处理 HTTP 请求和响应,实现路由系统、中间件机制等,用于构建各种规模的后端应用。
  • 数据库操作:借助 Node.js 可以使用各种数据库驱动,如 MySQL 的 mysql 模块、MongoDB 的 mongoose 模块等,实现与数据库的连接、数据的增删改查等操作。

桌面端

  • Electron:基于 Node.js 和 Chromium,可以使用 HTML、CSS 和 JavaScript 构建跨平台的桌面应用程序,将前端技术与后端的系统操作能力相结合,如文件系统操作、进程管理等。
  • NW.js:与 Electron 类似,允许开发人员使用 HTML、CSS 和 JavaScript 开发桌面应用,同时提供了与 Node.js 的集成,方便进行本地资源访问和系统级操作。

移动端

  • 框架集成:在使用框架如 ReactNative 开发移动应用时,Node.js 用于构建和打包应用,处理依赖管理等任务。它还可以与后端服务进行通信,为移动应用提供数据支持。
  • 命令行工具:如 Cordova 的命令行工具基于 Node.js,用于创建、构建和部署跨平台移动应用,通过命令行操作实现不同平台的打包和发布。

基建

  • 容器编排:在容器化部署中,Kubernetes 的一些插件和工具可以用 Node.js 编写,用于容器的管理和调度。
  • 监控与日志:利用 Node.js 可以编写监控脚本和日志收集工具,如使用 Prometheus 进行指标采集,通过 Node.js 的相关库将应用的性能指标暴露出来,便于监控和分析。

嵌入式

  • 物联网应用:在物联网领域,Node.js 可用于开发嵌入式设备的应用程序,如连接传感器、执行数据处理和通信任务。例如,使用 Johnny-Five 库可以方便地与 Arduino 等硬件设备进行交互,读取传感器数据、控制电机等。
  • 边缘计算:在边缘计算场景中,Node.js 可以在边缘设备上运行,对本地数据进行实时处理和分析,减少对云端的依赖,提高响应速度。

单元测试

  • 测试框架:使用 Mocha、Jasmine、 Jest 等测试框架,结合 Chai、Sinon 等断言库和模拟库,对 Node.js 模块和函数进行单元测试,确保代码的正确性和稳定性。
  • 代码覆盖工具:如 Istanbul,可以检测测试用例对代码的覆盖程度,帮助开发者发现未测试的代码路径,提高测试的完整性。

CI/CD

  • 自动化脚本:在 CI/CD 流程中,通过编写 Node.js 脚本可以实现自动化的代码构建、测试和部署任务。例如,在 GitLab CI 或 Jenkins 中,可以使用 Node.js 脚本定义构建步骤、运行测试套件,并将应用部署到生产环境。
  • 代码质量检查:结合 ESLint、Stylelint 等工具,通过 Node.js 在 CI/CD 流程中对代码进行质量检查,确保代码符合规范,减少代码中的错误和潜在问题。

反向代理

  • Nginx 替代方案:可以使用 http-proxy-middleware 等库在 Node.js 中实现反向代理功能,将客户端请求转发到后端的不同服务,实现负载均衡、请求过滤等功能。
  • 自定义代理逻辑:基于 Node.js 的 http 模块,可以编写自定义的反向代理服务器,根据业务需求实现更灵活的代理策略,如根据请求头信息进行动态路由转发等。

结束语

Nodejs为JavaScript开发者提供了更广阔的发展空间,推动了全栈开发的发展。作为前端生态中不可缺少的一份子,为 JavaScript 开发者提供了更广阔的发展空间,推动了全栈开发的发展也完善了前端的开发生态。