为了成为一枚优质的前端开发妹子,让技术更上一个台阶,基础知识必须扎实,先从最基础的概念开始吧~~
1.Node是什么?
Node.js是一个基于 Chrome V8 引擎的JavaScript运行环境(runtime),是让js运行在后端的运行时。Node不是一门语言,并且不包括javascript全集,因为在服务端中不包含DOM和BOM。Node也提供了一些新的模块例如http,fs模块等。Node.js 使用了事件驱动、非阻塞式 I/O 的模型,使其轻量又高效并且Node.js 的包管理器 npm,是全球最大的开源库生态系统。
2.浏览器 (线程 进程)
浏览器是多进程的,并且从我们的角度来看我们更加关心浏览器渲染引擎

一般情况下 ui线程 渲染后 空闲下来 会执行js js线程和ui线程 是共享线程的(webworker 进程 开一个工作者,归主线程来管理的,不能操作dom) 如果js是多线程的,不能同时两个线程 操作同一个DOM
2.1 渲染引擎
渲染引擎内部是多线程的,内部包含两个最为重要的线程ui线程和js线程。这里要特别注意ui线程和js线程是互斥的,是共享线程的,因为JS运行结果会影响到ui线程的结果。ui更新会被保存在队列中等到js线程空闲时立即被执行。
2.2 JS单线程
javascript在最初设计时设计成了单线程,因为如果多个线程同时操作DOM那岂不会很混乱?(指的是主线程是单线程的)
2.3 其他线程
- 浏览器事件触发线程(用来控制事件循环,存放setTimeout、浏览器事件、ajax的回调函数)
- 定时触发器线程(setTimeout定时器所在线程)
- 异步HTTP请求线程(ajax请求线程)
单线程特点是节约了内存,并且不需要在切换执行上下文。而且单线程不需要管锁的问题.
3.浏览器中的Event Loop
步骤:
- 1.先执行同步代码
- 2.执行微任务,把微任务队列清空
- 3.执行宏任务:只取出一个执行(再去执行宏任务)
- 4.不停的循环
异步方法:宏任务和微任务,任务可分为宏任务和微任务
- macro-task(宏任务): setTimeout, setInterval, setImmediate, I/O
- micro-task(微任务): process.nextTick, 原生Promise的then方法(有些实现的promise将then方法放到了宏任务中),Object.observe(已废弃), MutationObserver
4.Node中的Event Loop

- 1.我们写的js代码会交给v8引擎进行处理
- 2.代码中可能会调用nodeApi,node会交给libuv库处理
- 3.libuv通过阻塞i/o和多线程实现了异步io
- 4.通过事件驱动的方式,将结果放到事件队列中,最终交给我们的应用。
5.异步/同步 阻塞/非阻塞
同步异步指的是被调用者的状态 阻塞非阻塞指的是调用者的状态
6.什么场合下应该考虑使用Node框架
IO密集型:当应用程序需要处理大量并发的输入输出,而在向客户端响应之前,应用程序并不需要进行非常复杂的处理。
- 聊天服务器
- 电子商务网站