目录
nodejs 模块化的暴露和引入
-
暴露:使用 module.exports.XXX=XXX: 给暴露的对象扩展一个XXX方法。
使用:
- module.exports = XXX:暴露的直接就是XXX方法。
- exports.XXX = XXX: 给暴露的对象扩展一个XXX方法。
- exports = XXX: 错误方法不能写。
-
引入:使用require方法引入即可,如果引入的是自定义模块,则方法的参数是模块路径。
谈一谈 cookie
- “HTTP 是一个无状态的协议”: 即使同一个客户端连续两次发送请求给服务器,服务器也识别不出这是同一个客户端发送的请求。为了解决 HTTP 无状态导致的问题,后来出现了 Cookie。
- Cookie 指某些网站为了辨别用户身份而储存在用户本地终端上的数据。
- Cookie 作为一段一般不超过 4KB 的小型文本数据,它由一个名称(Name)、一个值(Value)和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成。
- Cookie 的设置:
- 客户端发送 HTTP 请求到服务器。
- 当服务器收到 HTTP 请求时,在响应头里面添加一个 Set-Cookie 字段。
- 浏览器收到响应后保存下 Cookie。
- 之后对该服务器每一次请求中都通过 Cookie 字段将 Cookie 信息发送给服务器。
- 一些设置:
- Expires 用于设置 Cookie 的过期时间。
- Max-Age 用于设置在 Cookie 失效之前需要经过的秒数。
- HTTPOnly:设置 HTTPOnly 属性可以防止客户端脚本通过 document.cookie 等方式访问 Cookie,有助于避免 XSS 攻击。
谈一谈 缓存
- 缓存是性能优化中简单高效的一种优化方式。一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷。
- 缓存分为强缓存和协商缓存:
- 强缓存:不会向服务器发送请求,直接从缓存中读取资源,并且显示from disk cache 或 from memory cache 字样,强缓存可以通过设置两种 HTTP Header 实现:Expires 和 Cache-Control。
- 协商缓存:协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。
谈一谈 session
- 因为 Cookie 可以通过客户端修改,而 Session 只能在服务端设置,所以安全性比 Cookie 高,一般会用于验证用户登录状态。
- Session 是基于 Cookie 实现的另一种记录服务端和客户端会话状态的机制。
- Session 是存储在服务端,而 SessionId 会被存储在客户端的 Cookie 中。
分析 module.exports 和 exports 的区别
- 模块真正暴露出来的是 module.exports 指向的对象,module.exports 指向的对象可以随意修改。
- exports 指向的是最 module.exports 对象,可以直接给 exports 扩展属性和方法,但是如果修改了 exports 对象的指向(exports = XXX),则 exports 指向的就不是暴露的对象了,就不能暴露了。
nodejs 轮询机制
- nodeJS 使用了第三方库 libuv,nodeJS 会把一些异步操作(I/O、文件的读写)交给 libuv 处理。nodejs 的主线程没有必要等待,可以继续处理其他事情。
- libuv 会开启多个线程去执行这些异步操作,当异步代码操作完毕以后,会把回调函数放到回调队列中,主线程在适当的时候回去轮询回调队列。
- nodeJs 把异步代码分为了两大类,分别是微任务和宏任务。微任务优先宏任务执行。
- 宏任务也是根据异步代码不同,而产生多种回调队列,nodejs 会依次轮询这几个回调队列:timers、pendding callback、idle、poll、check、close:
- timers 阶段:处理setTimeout和setInterval的回调函数。
- pedding 阶段:处理系统级别操作的回调函数。
- idle 阶段:处理 nodejs 内部的回调函数。
- poll 阶段:处理 I/O 或者网络请求等异步操作的回调函数:
- 当 poll 阶段不为空的时候,那么执行完回调函数,就继续执行下个阶段 check 了。
- 当 poll 阶段为空,会一直等待 poll 中有其他的回调函数。
- 或者当 poll 阶段为空的时候,如果 timer 阶段的计时器到期了,或者 check 阶段有 setImmediate 等待执行的时候,会直接跳入 check 阶段。
- check 阶段:setImmediate 的回调函数。
- close 阶段:执行一些关闭的函数。
微任务和宏任务
- nodejs 把所有的异步操作代码分为了微任务代码和宏任务代码。
- nodejs 会优先执行微任务代码,然后才执行宏任务代码。
- 微任务:process.nextTick,Promise 的 then\catch\finally、queueMicrotask。
- process.nextTick 一定是最先执行,其他微任务根据书写代码依次执行。
- 在宏任务每次执行下一个阶段之前,都会去检查微任务队列中是否有微任务需要执行,然后才会执行下一个阶段。
高频面试题
此链接为 CSDN 内部链接,我收集整理的一些经常会问到的前端面试题,希望能对您所有帮助!