一、node是什么
按照Node官网的描述
Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine.
说的是Node是建立在V8引擎上的JavaScript上的运行环境,关于V8,熟悉前端开发的都知道它是Chorme内置的JavaScript的引擎,而Node则将其衍生到了服务端
NodeJS并不是像Python、PHP那样作为独立的一门编程语言。它只是一个平台,将多种技术组合起来,让JavaScript也能够去调用系统的接口,开发后端应用
二、node的技术架构
下面的图是一张Node.js早期的架构图。
最上面一层是Node提供的标准库,供开发者使用。内部通过Node Bindings桥接了Chrome的V8引擎(负责解释执行JS代码)、Thread Pool 线程池、Event Loop 事件循环
理清了基本的结构,我们再来梳理一下Node运行的过程: 由于Node.js 内置 Chrome V8 引擎,使用单线程的JavaScript语言,单线程意味着所有的任务需要排队,前一个任务执行结束后,才会执行后一个任务。所幸的是Node天生设计是异步的,不用等待任务(一般是I/O操作)结束,而是将等待中的任务放到Event Loop中,由Event Loop将I/O任务放到Thread Pool线程池执行,只需要等待事件循环中的执行结果就可以了。
三、Node的执行过程
将上面的架构图衍生到实际的过程中,我们可以看下面的图
我们将上面的过程总结下,其实核心就是:
1、Chrome V8 解释并执行 JavaScript 代码
2、libuv
由事件循环和线程池组成,负责所有 I/O 任务的分发与执行
之所以说 Node.js 是单线程,就是因为在接受任务的时候是单线程的,它无需进程/线程切换上下文的成本,非常高效,但它在执行具体任务的时候是多线程的,通过事件循环在线程池中执行分发的I/O任务。
在面对并发编程的模型上,我们已经知道Node通过将Event Loop和具体线程池等细节封装在了内部,将异步调用Api写法暴露给开发者,那么我们在Node中需要掌握最核心的就是对异步流程的控制,从回调地狱到Promise规范到最终形态的async/await。
参考书:《Node 深入浅出》