• [ ]

    CommonJS和ES6 Module的区别

  • [ ]

  • 语法不同;
  • 引入时机不同;
    • commonjs是动态引入,执行时引入,所以引入可以在任何位置
    • es6 module是静态引入,编译时引入,(只能在头部引入)。所以支持tree-shaking
  • 拷贝方式不同

    • CommonJS是对模块的浅拷⻉,可以对commonJS对重新赋值(改变指针指向)
    • ES6 Module是对模块的引⽤,即ES6 Module只存只读,不能改变其值,也就是指针指向不能变,类似const;

      node 中 module.exports 与 exports 有什么区别

      node模块对外输出的值是** module.exports**
      **exports **指向** module.exports**的引用。只要** module.exports**没有变化,**exports**就没有变化。
      如果没有** module.exports**值,就会读**exports **的值。
      类似如下所示
      1. const exports = module.exports
      module.exports存在的情况下,对外输出module.exports的值。
      1. module.exports = 100
      2. exports = 3
      3. // 对外输出100
      1. exports.fun1 = {
      2. a:'12'
      3. }
      对外输出了{ fun1: { a: '12' } }

      事件循环event loop在nodejs和浏览器的区别

      1、浏览器的js异步
  • 介绍哪些是宏任务,哪些是微任务

    • 宏任务:setTimeout
    • 微任务:MutationObserverPromise.then
  • 过程:

1、同步代码执行完毕,调用栈空闲。
2、先把微任务**micoTask**队列执行完,所以微任务执行过程会阻塞渲染。

  1. 进入渲染阶段:根据屏幕刷新频率、页面性能决定是否渲染。如果一帧内修改多次DOM,浏览器可能将多次修改积攒起来。

如果需要每一帧都绘制,可以用requstAnimationFrame

  1. 触发tash队列里面拿出一个宏任务执行。
  2. 判断taskmicoTask是否为空,空的话执行requstIdleCallback

nodejs中的异步

  • 介绍哪些是宏任务,哪些是微任务
    • 宏任务:setImmediate、I/O文件、网络、Socket链接(如链接mysqp)
    • 微任务:promise.then()process.nextTick
  • 执行过程
    • 执行同步代码
    • 执行微任务
    • 执行宏任务、回到第二步
  • 特点:

nodejs的宏任务类型比较多,不可能和浏览器一样把所有宏任务放在一个异步队列中,所以,宏任务的任务是按照阶段阶段来的,每个宏任务阶段的之前,执行微任务。
在微任务中,**process.nextTick**优先级最高,最先被执行。
**process.nextTick**已经不推荐使用,因为会阻塞I/O
6个阶段处理宏任务:

  • timer阶段:执行setTimeoutsetInterval的回调
  • I/O callback: 处理网络、流、TCP的错误回调
  • idle、prepare:闲置阶段,node内部使用
  • poll:执行poll中的I/O队列,检查定时器是否到期。
  • check:存放setImmediate回调
  • close callbacks:关闭回调,例如Socket.on(‘close’)

Node - 图1
细节:

  • setTimeoutsetImmediate执行更早
  • process.nextTickPromise.then执行更早
  • 新版的node.js已和浏览器趋同,即兼容代码在两者运行的结果是一样的;

    session如何实现登录

  • cookie如何实现登录校验:登录后,服务端种cookie。在同域条件下,以后每次请求都会带上cookie。

  • session和cookie的关系:但是存储用户名不安全,所以cookie存储一个id,id存储在服务端session。
  • session为何要存储在redis中:进程有内存限制,进程之前内存隔离,所以存储在redis

    请描述koa2和express的中间件机制

  • 从代码上看,中间件就是一个函数

  • 从业务来看,中间件是一个独立的模块
  • 模块拆分,模块流转,就可以实现复杂的功能,符合单一职责原则。
  • 实现koa2和express的源码。compose函数。

    请描述koa2的洋葱模型

    Koa 的洋葱模型指的是以 next() 函数为分割点,先由外到内执行 Request 的逻辑,再由内到外执行 Response 的逻辑。
    通过洋葱模型,将多个中间件之间通信等变得更加可行和简单。其实现的原理并不是很复杂,
    主要是 compose 方法。
    Node - 图2
    在洋葱模型中,每一层相当于一个中间件,用来处理特定的功能,比如错误处理、Session 处理等等。其处理顺序先是 next() 前请求(Request,从外层到内层)然后执行 next() 函数,最后是 next() 后响应(Response,从内层到外层),也就是说每一个中间件都有两次处理时机

nodejs如何读取大文件

  1. fs.createReadStream(path)

rewrite与redirect区别

  • redirect:是浏览器和服务器发生两次请求,也就是服务器命令客户端“去访问某个页面”;

像用户去买手机,缺货时的两种处理:让用户自己去其他地方买(redirect);

  • rewrite:是把一个地址重写成另一个地址。地址栏不跳转。相当于给另一个地址加了一个别名一样。

是公司从其他的地方调货(rewrite)。