node做后台的优势和特点
- 单线程
- 基于v8引擎渲染:快
- 异步无阻塞的I/O操作:I/O 对文件的读写
event-driven事件驱动:类似于发布订阅或者回调函数
异步
主线程是单线程(异步)callback,将后续的逻辑写成函数,传入到当前执行的函数中,当执行的函数得到了姐u结果后,执行传入的函数(回调函数)
setTimeout
- callback
- onclick
-
异步与同步
同步是指发起调用之后主线程只能挂起,调用者主动等待这个调用的结果
- 异步是指发起调用之后主线程可以做别的事情,被调用者通过通知来告知调用者结果
- 同步就是发出调用后,没有得到结果之前,该调用不返回,一旦调用返回,就得到返回值,就是主动调用的结果
异步是调用者再发出调用就直接返回了,所以没有返回结果,即当一个异步过程调用发出后,调用者不会立刻得到结果,而是调用发出后,被调用者通过状态处理这个调用
阻塞与非阻塞
- 针对内核来说,向内核发起请求的时候不会阻塞主线程的执行
- 阻塞是实现同步的前置条件阻塞不会异步,
- 针对内核来说,向内核发起请求的时候步阻塞主线程的执行
- 非阻塞是实现异步的前置条件
//在文件中打印this不是global属性,node自带模块化功能,一个js文件就是一个模块,模块this不是global(闭包)
console.log(this);//{}
var a=1;//每一个文件都有局部作用域,不会将属性挂载在global上
console.log(blobal.a);
//全局变量 :不用声明就可以使用
process.nextTick();//异步函数,在当前队列的底部,执行同步代码之后的代码,优先执行
同步和异步 && 阻塞非阻塞
- 阻塞非阻塞指的是调用者的状态
-
浏览器模型
用户界面-包括地址栏,前进后退按钮,书签菜单等等
- 浏览器引擎-在用户界面和呈现引擎之间传递指令
- 呈现引擎-渲染引擎,也被称为浏览器内核,在线程方面又成为ui线程
- 网络-用于网络调用,例如http请求
- 用户界面后端-用于绘制基本的窗口小部件,ui线程和js共用一个线程
- javascript解释器-用于解析和执行javascript代码
数据存储-这是持久层,浏览器需要在硬盘上保存各种数据,例如cookie
线程
js线程 ui线程 两个线程互斥,是为了保证不产生冲突
ui线程会把更改放到队列中,当js线程空闲下来,ui线程再继续渲染
webworker多线程
与js主线程不是平级的,主线程可以控制webworker,webworker不能操作dom,不能获取document,window
其他线程
-
- 一旦执行栈中的所有同步任务执行完成,系统就会读取任务队列,看里面有哪些事件,那些对应的异步任务,在结束等待状态,进入执行栈,开始执行
-
事件循环
eventEmitter
addListener(event,listener) :对指定事件绑定处理函数
- on(event,listener):对指定事件绑定处理函数
- once(event,listener):对指定事件指定只执行一次的事件处理函数
- removeListener(event,listener):对指定事件解除所有的事件处理函数
- setMaxListener(n):指定事件处理函数的最大数量n为整数值,代表最大的可指定事件处理函数的数量
- listener(event):获取指定事件的所有事件处理函数
- emit(event,[arg1],[arg2],[…]):手工触发指
express
- 创建express应用程序
let express =require('express');
let app=express();
express.json([options])
返回仅解析json并且仅查看Content-Type标头与type选项匹配的请求的中间件。
中间件
中间件是处理http请求的函数,用来完成各种特定的任务,如检查用户是否登录,是否有权限访问等,特点:
- 一个中间件处理完请求和响应可以把相应数据在传递给下一个中间件
- 回调函数的next参数,表示接受其他中间件的调用,函数体中的next()表示将请求数据继续传递
- 可以根据路径来区分返回执行不同的中间件