作为前端你得懂点 NodeJS-基本概念

227 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

NodeJS不是一门语言,而是Javascript运行在V8环境下的服务端JS执行环境,2009年问世,专注于实现高性能Web服务器优化的项目。NodeJS和V8底层用了大量的C++代码。

与PHP、Java等相比,NodeJS不需要建设在Apache Nginx、IIS等HTTP服务器上

V8引擎本身是用于Chrome浏览器的JS解析器,它被Ryan Dahl运用到Web服务器,在服务器端它有很多优点:

  1. 没有历史包袱,没有同步I/O 不会出现一个同步I/O导致事件性能急剧降低的情况
  2. V8性能足够好,远远比Python、Ruby等其他脚本语言的引擎快
  3. JS闭包特性非常方便,比C中的回调函数好用

NodeJS有三大特性:单线程、事件驱动、非阻塞I/O

单线程

  1. 传统的服务器语言会为每个客户端连接创建一个新的线程,每个线程耗费大约2MB,8G服务器最多用户数量为4千个
  2. NodeJS仅仅使用一个线程,当有用户连接了会触发内部事件,通过非阻塞I/O、事件驱动机制,让Nodejs程序看上去上也是并行的。使用NodeJS,一个8G内存的服务器可以同时处理超过4万用户的连接
  3. 操作系统不会再有线程创建和销毁的开销
  4. 一个用户操作引起线程崩溃会影响其他用户 单线程和多线程区别如下图所示:

截屏2022-06-08 21.43.30.png

非阻塞I/O

在传统的单线程应用中,访问等数据库I/O操作会阻塞线程,极大降低了程序的执行效率。

而NodeJS则采用了非阻塞型I/O机制,当某个I/O执行完毕时将以事件的形式通知执行I/O操作的线程,线程执行这个事件的回调函数。因此为了异步的处理这些I/O操作,线程必须有事件监听者,不断监听事件队列并依次予以处理。如果回调函数中又嵌套了I/O操作,则该操作会被按顺序排到事件队列中。

截屏2022-06-08 22.23.11.png

事件驱动,事件循环

不管新用户的请求,还是老用户的I/O完成,都将以事件的方式加入事件循环队列,等待调度。打个比方:NodeJs就像一个饭馆的老板,他雇用了一个精明能干的伙计,来一个客户他就先把菜单递上,端茶倒水,然后听着后厨的召唤来上菜。

NodeJS擅长调度但并不擅长计算

擅长

  1. 用户表单收集
  2. 考试系统
  3. 聊天室
  4. 图文直播
  5. 提供JSON的API

举例

百度很多表单就是Node保存到数据库的 知乎用一个Node进程跑起了“站内信”功能

最后提一句,NodeJS是一个开箱即用的工具,暂时并不能像Java或PHP等搭建Web服务器的主体功能。