关于NodeJS

65 阅读4分钟

简述

  1. Nodejs是 JavaScript的运行时。
  2. Nodejs是构建在V8引擎之上的,V8引擎是由C/C++编写的,因此我们的JavaSCript代码需要由C/C++转化后再执行。
  3. NodeJs 使用异步 I/O 和事件驱动的设计理念,可以高效地处理大量并发请求,提供了非阻塞式 I/O 接口和事件循环机制,使得开发人员可以编写高性能、可扩展的应用程序,异步I/O最终都是由libuv 事件循环库去实现的。
  4. NodeJs 使用npm 作为包管理工具类似于python的pip,或者是java的Maven,目前npm拥有上百万个模块。
  5. nodejs适合干一些IO密集型应用,不适合CPU密集型应用,nodejsIO依靠libuv有很强的处理能力,而CPU因为nodejs单线程原因,容易造成CPU占用率高,如果非要做CPU密集型应用,可以使用C++插件编写 或者nodejs提供的cluster。(CPU密集型指的是图像的处理 或者音频处理需要大量数据结构 + 算法)

nodeJS大致框架

全局变量

在nodejs中使用global定义全局变量,可以在引入的文件中也可以访问到该变量,例如a.js global.xxx = 'xxx' require('xxx.js') xxx.js 也可以访问到该变量,在浏览器中我们定义的全局变量都在window,nodejs在global,不同的环境还需要判断,于是在ECMAScript 2020 出现了一个globalThis全局变量,在nodejs环境会自动切换成global ,浏览器环境自动切换window非常方便

其他全局API

由于nodejs中没有DOM和BOM,除了这些API,其他的ECMAscriptAPI基本都能用

nodejs内置全局API

__dirname // 它表示当前模块的所在目录的绝对路径

__filename // 它表示当前模块文件的绝对路径,包括文件名和文件扩展名

require module / module.export // 引入模块和模块导出

process

  1. process.argv: 这是一个包含命令行参数的数组。第一个元素是Node.js的执行路径,第二个元素是当前执行的JavaScript文件的路径,之后的元素是传递给脚本的命令行参数。
  2. process.env: 这是一个包含当前环境变量的对象。您可以通过process.env访问并操作环境变量。
  3. process.cwd(): 这个方法返回当前工作目录的路径。
  4. process.on(event, listener): 用于注册事件监听器。您可以使用process.on监听诸如exit、uncaughtException等事件,并在事件发生时执行相应的回调函数。
  5. process.exit([code]): 用于退出当前的Node.js进程。您可以提供一个可选的退出码作为参数。
  6. process.pid: 这个属性返回当前进程的PID(进程ID)。
  7. .........

Buffer // Buffer类在处理文件、网络通信、加密和解密等操作中非常有用,尤其是在需要处理二进制数据时

node能够实现高并发原理

nodejs应用程序在单个线程中运行,无需为每个请求创建新的线程,node最大的并发量就是1,利用V8引擎和非阻塞的事件循环机制,node可以高效应对高并发。

Node.js中的库是使用非阻塞范式编写的

Node。js使用单个服务器处理数千个并发连接

nodejs应用运行在一个长期运行的单个进程中

如何理解node是“单线程”的

当我们说node是单线程的,其实是在说node中只有一个线程在处理JavaScript

node应用运行在单个进程中,里边包含多个线程,只有一个线程处理JS

借助事件循环机制,把所有耗时的操作全部由异步模块去处理,这种异步非阻塞的机制极大的释放了node的潜能,node无需等待IO的结果,而是可以去处理更多的请求

事件循环

三类异步操作

三类异步操作的回调由以下三个队列进行处理

微任务队列

微任务队列在nextTick之后,在timer队列之前

在node中,一段脚本总是自上而下的执行,同步代码阻塞执行,异步代码进入异步模块以非阻塞的方式执行,对应的异步回调函数会在异步代码执行完毕之后,被派发到不同的队列当中,同步代码执行完毕之后,先执行nextTick的任务,再执行微任务队列,最后是事件循环里的队列。

Node 异常处理

由于node运行在一个单线程/单进程环境当中,也就意味着只要出现一个错误,整个服务器都会奔溃。 所以“捕获并处理每一个错误”在node中尤为重要。

同步代码

使用 try...catch

异步代码

1.用promise的.catch

2.async/await 可以用try...catch捕获

process.on("uncaughtException",(err)=>console.log(err)) // 兜底方案,一般不使用

异步编程与流程控制

  1. 回调函数
  2. promise
  3. async/await