这是我参与「第五届青训营 」伴学笔记创作活动的第 17 天
Node.js是什么?
Node.js是一个开源与跨平台的JavaScript运行时环境在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核),利用事件驱动、非阻塞和异步输入输出模型等技术提高性能
可以理解为
Node.js就是一个服务器端的、非阻塞式I/O的、事件驱动的JavaScript运行环境
Node.js 的应用场景 为什么?
- 前端工程化
- Web 服务端应用
- 操作数据库、为前端和移动端提供基于
json的API
- 操作数据库、为前端和移动端提供基于
- Electron 跨端桌面应用
- 商业应用:vscode, slack, discord, zoom
- 大型公司内的效率工具
- 现状:大部分场景在选型时,都值得考虑
NodeJS 处理并发的能力强,但处理计算和逻辑的能力反而很弱。
因此,我们把复杂的逻辑运算搬到前端(客户端)完成,而 NodeJS 只需要提供异步 I/O,这样就可以实现对高并发的高性能处理。
Node.js 的优缺点
优点:
- 处理高并发场景性能更佳
- 适合I/O密集型应用,指的是应用在运行极限时,CPU占用率仍然比较低,大部分时间是在做 I/O硬盘内存读写操作
- 跨平台(大部分功能、api)
- Node.js 跨平台 + JS 无需编译环境( + Web 跨平台 + 诊断工具跨平台)
- 开发成本低(大部分场景无需担心跨平台问题),整体学习成本低。
Nodejs是单线程,有利有弊。
JS 单线程
实际:JS 线程 + uv 线程池 + V8 任务线程池 + V8 Inspector 线程
V8 Inspector 这里调试工具一般会单独放在一个线程。
优点:
不用考虑多线程状态同步问题,也就是不需要锁;同时还能比较高效的利用系统资源
缺点:
- 不适合CPU密集型应用
- 只支持单核CPU,不能充分利用CPU
- 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃
Node.js 的运行时结构 做什么?
- V8:JavaScript Runtime,诊断调试工具(inspector)
- libuv:eventloop(事件循环),syscall(系统调用)
- 举例:用 node-fetch 发起请求时。先通过 npm 引入node-fetch包,然后到底用户代码模块调用node-fetch,因为这些都是 JS 代码,所以会到 V8 执行...