这是我参与【第四届青训营】笔记创作活动的第五天。
什么是Node.js
Node.js简称Node,是一个可以使JavaScript运行在服务器端的开发平台。
JavaScript本是一种Web前端语言,Node.js让JavaScript成为服务器端脚本语言。
Node.js选择JavaScript作为实现语言的原因:
- JavaScript满足CommonJS标准,符合事件驱动,用户较多且门槛较低。
- Chrome的V8引擎具有出色的性能。
Node.js将V8引擎封装起来,作为服务器运行平台,以执行JavasScript编写的后端脚本程序。
NodeJS是基于Chrome V8引擎的JavaScript运行环境。NodeJS使用事件驱动,非阻塞型O。NodeJS的包管理生态是NPM,是现在世界上最大的开源程序包库。
Node.js有什么特殊性?
JavaScript是一门脚本语言,它需要一个运行环境。就好像PHP需要Apache,JSP需要Tomcat等等。而NodeJS之前,JavaScript运行环境是浏览器,也就是——JavaScript在网页中才能跑起来。NodeJS之后JavaScript又多了一个运行环境,就是NodeJS。
作用:
由于NodeJS的最底层是Chrome的V8引擎,然后libuv封装了一些I/O的线程池管理和网络的I/O操作,这部分是C/C++写的。
简单来说,NodeJS可以控制系统文件的读写,网络的输入输出。所以NodeJS又可以被单纯的认为是一个可以运行JavaScript的服务器。
Node.js的特点
- 异步式I/O
- 事件驱动
- 单线程
异步式I/O(非阻塞I/O)
· 非阻塞I/O又称异步式I/O,是Node.js的重要特点。
· 阻塞I/O是指线程在执行过程中遇到I/O操作时,操作系统会撤销该线程的CPU控制权,使其暂停执行,处于等待状态,同时将资源转让给其他线程。
· 非阻塞I/O是指当线程遇到I/O操作时,不会以阻塞方式等待I/O操作完成或数据返回,而只是将I/O请求转发给操作系统,继续执行下一条指令。
事件驱动
· 非阻塞I/O是一种异步方式的I/O,与事件驱动密不可分。
· 事件驱动以事件为中心,Node.js将每一个任务都当成事件来处理。Node.js在执行过程中会维护一个事件队列,需执行的每个任务都会加入事件队列并提供一个包含处理结果的回调函数。
· 在事件驱动模型中,会生成一个事件循环线程来监听事件,不断地检查是否有未处理的事件。
· Node.js的异步机制是基于事件的,所有磁盘I/O、网络通信、数据库查询事件都以非阻塞的方式请求,返回的结果由事件循环线程来处理。
单线程
· Node.js的应用程序是单进程、单线程的,但是通过事件和回调支持并发,性能变得非常高。
· 在阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须使用多线程。
· 在非阻塞模式下,线程不会被I/O操作阻塞,该线程所使用的CPU核心利用率永远是100%,I/O操作以事件的方式通知操作系统。
· Node.js在主线程中维护一个事件队列,当接收到请求后,就将该请求作为一个事件放入该队列中,然后继续接收其他请求。
· Node.js内部通过线程池来完成非阻塞I/O操作,Node.js的单线程是指对JavaScript层面的任务处理是单线程的,而Node.js本身是一个多线程平台。
Node.js的应用场景
主要有以下三个领域:
- 前端工程化
- Web服务器应用
- Electron跨端桌面应用
前端工程化
Bundle:webpack,vite,esbuild,parcelUglify:uglifyjsTranspile:bablejs,typescript- 其他语言加入竞争:
esbuild,parcel,prisma - 现状:难以替代
Web服务器应用
- 学习曲线平缓,开发效率较高
- 运行效率接近常见的编译语言
- 社区生态丰富及工具链成熟(
npm,V8 inspector) - 与前端结合的场景会有优势(
SSR) - 现状:竞争激烈,Node.js有自己独特的优势
Electron跨端桌面应用
- 商业应用:
vscode,slack,discord,zoom - 大型公司内的效率工具
- 现状:大部分场景再选型时,都值得考虑
适合用Node.js的场合
- REST API: REST API是一种前后端分离的应用程序架构。
- 单页Web应用:加载单个HTML页面,并在用户与应用程序交互时动态更新该页面的Web应用程序。
- 统一Web应用的UI层: Node.js是面向服务的架构,其能够更好地实现前后端的依赖分离,可以将所有的关键业务逻辑都封装成REST APl,UI层只需要考虑如何用这些API构建具体的应用。
- 准实时系统:如聊天系统、微博系统、博客系统的准实时社交系统,特点是轻量级、高流量,没有复杂的计算逻辑。
- 游戏服务器:程序员不必使用C语言就能开发游戏的服务器程序。
- 微服务架构:Node.js也可用于实现基于微服务架构的应用。