node是一个runtime,可以让js代码跑在服务器上
js包含了三个部分DOM ,BOM和ecmascript
nodejs 基本包含了ecma,同时底层上扩展了一些功能 如libuv 提供了fs、http
应用场景:
中间层 前后端分离
服务端渲染
常见的工具库 工具类 webpack
处理高并发
多线程适合cpu密集型
node适合I/O密集型(文件读写) web的应用场景 借助了异步的特性 基于事件
异步非阻塞 同步阻塞
男生给女生告白打电话的例子!!!
阻塞非阻塞是程序在等待调用结果时的状态,取决于调用者
异步同步则是取决于被调用者的状态
阻塞调用就是调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回
全局对象
Buffer、process
timers(setTimeout、setInterval、clearTimeout、clearInterval、setImmediate、clearImmediate)等
process
process.argv 用户自定义的参数
process.cwd //当前文件在哪里执行的,这个是绝对路径,这个变量不是固定的可以更改的
process.kill(pid) 杀死pid结束进程
process.nextTick node事件环中的一个微任务 比promise要快
process.env 可通过自定义配置进程环境参数 比如 process.env.NODE_ENV
setImmediate作为nodejs的一个宏任务 和setTimeout 随机存在先后(why?)
node事件环
node中有很多队列
setImmediate vs setTimeout 谁先执行??
一道面试题:
let fs = require('fs')
fs.readFile('./template.html', () => {
setTimeout(() => {
console.log('setTimeout')
})
setImmediate(() => {
console.log('setImmediate')
})
})
谁先执行??
很显然 readFile为poll(轮询阶段),按照上述node事件环执行图,紧接着应该执行check阶段,恰好setImmediate存在,所以总是会先执行setImmediate!
补充说明事件环: