-
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 **
的值。
类似如下所示
module.exports存在的情况下,对外输出module.exports的值。const exports = module.exports
module.exports = 100
exports = 3
// 对外输出100
对外输出了exports.fun1 = {
a:'12'
}
{ fun1: { a: '12' } }
事件循环event loop在nodejs和浏览器的区别
1、浏览器的js异步
介绍哪些是宏任务,哪些是微任务
- 宏任务:
setTimeout
- 微任务:
MutationObserver
、Promise.then
- 宏任务:
- 过程:
1、同步代码执行完毕,调用栈空闲。
2、先把微任务**micoTask**
队列执行完,所以微任务执行过程会阻塞渲染。
- 进入渲染阶段:根据屏幕刷新频率、页面性能决定是否渲染。如果一帧内修改多次DOM,浏览器可能将多次修改积攒起来。
如果需要每一帧都绘制,可以用requstAnimationFrame
。
- 触发tash队列里面拿出一个宏任务执行。
- 判断
task
和micoTask
是否为空,空的话执行requstIdleCallback
。
nodejs中的异步
- 介绍哪些是宏任务,哪些是微任务
- 宏任务:
setImmediate
、I/O文件、网络、Socket链接(如链接mysqp) - 微任务:
promise.then()
、process.nextTick
- 宏任务:
- 执行过程
- 执行同步代码
- 执行微任务
- 执行宏任务、回到第二步
- 特点:
nodejs的宏任务类型比较多,不可能和浏览器一样把所有宏任务放在一个异步队列中,所以,宏任务的任务是按照阶段阶段来的,每个宏任务阶段的之前,执行微任务。
在微任务中,**process.nextTick**
优先级最高,最先被执行。
但**process.nextTick**
已经不推荐使用,因为会阻塞I/O
6个阶段处理宏任务:
- timer阶段:执行
setTimeout
和setInterval
的回调 - I/O callback: 处理网络、流、TCP的错误回调
- idle、prepare:闲置阶段,node内部使用
- poll:执行poll中的I/O队列,检查定时器是否到期。
- check:存放
setImmediate
回调 - close callbacks:关闭回调,例如
Socket.on
(‘close’)
细节:
setTimeout
比setImmediate
执行更早process.nextTick
比Promise.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 方法。
在洋葱模型中,每一层相当于一个中间件,用来处理特定的功能,比如错误处理、Session 处理等等。其处理顺序先是 next() 前请求(Request,从外层到内层)然后执行 next() 函数,最后是 next() 后响应(Response,从内层到外层),也就是说每一个中间件都有两次处理时机。
nodejs如何读取大文件
fs.createReadStream(path)
rewrite与redirect区别
- redirect:是浏览器和服务器发生两次请求,也就是服务器命令客户端“去访问某个页面”;
像用户去买手机,缺货时的两种处理:让用户自己去其他地方买(redirect);
- rewrite:是把一个地址重写成另一个地址。地址栏不跳转。相当于给另一个地址加了一个别名一样。
是公司从其他的地方调货(rewrite)。