项目展示
之前有使用过node.js做过一些项目
- YuyuanW/transition-yuyuan: 一个基于node.js和TS的简洁的中译英,英译中的快捷翻译工具 (github.com)
- YuyuanW/to-do-yuyuan: 一个基于node命令行的日常任务管理器,用来写todolist,然后一项一项打勾,成就感max~ (github.com)
- node.js文件模块的学习:制作一个基于文件的todo工具 - 掘金 (juejin.cn)
0.node.js
学习的时候,有对node进行过总结:node.js背景了解 - 掘金 (juejin.cn) 之前对node.js是crm,以做出东西为标准,但随着面试的到来,必须要对这些知识做一个梳理,构建一个比较完整的知识体系。
对于这个问题的解决,我梳理了一个问题列表,方便知识体系的完善。
一、 node.js的基础了解
- 什么是node.js
- node.js和js的区别是什么
- node.js有什么优势
1. 什么是node.js?
- node.js不是web框架,所以,node.js和Flask和Spring不能对比
- node.js不是编程语言,所以,不能和Python和PHP对比
- 它是一个平台,将多种技术组合起来,让JS也能调用系统接口,开发后端应用
Node.js 是在Chrome 的 V8 JavaScript 引擎上开发的极其强大的框架 ,可将 JavaScript 直接编译为原生机器码。它是一个轻量级框架,用于创建服务器端 Web 应用程序并扩展 JavaScript API 以提供常用的服务器端功能。它通常用于大型应用程序开发,特别是视频流站点、单页应用程序和其他 Web 应用程序。
2. node.js和js的区别是什么?
| 特征 | JavaScript | NodeJS |
|---|---|---|
| 类型 | 编程语言 | JavaScript 的解释器和环境 |
| 公用事业 | 用于 Web 应用程序的任何客户端活动 | 用于访问或执行任何操作系统的任何非阻塞操作 |
| 运行引擎 | 蜘蛛猴 (FireFox)、JavaScript Core (Safari)、V8 (Google Chrome) 等 | V8 (Google Chrome) |
3. node.js有什么优势?
| 特征 | 描述 |
|---|---|
| 快速 | Node.js 建立在 Google Chrome 的 V8 JavaScript 引擎之上,这使得它的库在代码执行方面非常快 |
| 异步 | 基于 Node.js 的服务器从不等待 API 返回数据,从而使其异步 |
| 可扩展 | 它是高度可扩展的,因为它的事件机制可以帮助服务器以非阻塞方式响应 |
| 开源 | Node.js 拥有一个广泛的开源社区,该社区贡献了一些优秀的模块来为 Node.js 应用程序添加附加功能 |
| 无缓冲 | Node.js 应用程序只是以块的形式输出数据,从不缓冲任何数据 |
二、 对node.js技术框架的考察
在写知识体系之前,先了解一下node.js有哪些技术框架
1.Node.js 的 EventLoop 是什么?
Node.js 将各种函数(也叫任务或回调)分成至少 6 类,按先后顺序调用,因此将时 间分为六个阶段:
- timers 阶段(setTimeout)
- I/O callbacks 该阶段不用管
- idle, prepare 该阶段不用管
- poll 轮询阶段,停留时间最长,可以随时离开。
- a. 主要用来处理 I/O 事件,该阶段中 Node 会不停询问操作系统有没有文件数 据、网络数据等
- b. 如果 Node 发现有 timer 快到时间了或者有 setImmediate 任务,就会主动离 开 poll 阶段
- check 阶段,主要处理 setImmediate 任务
- close callback 该阶段不用管 Node.js 会不停的从 1 到 6 循环处理各种事件,这个过程叫做事件循环(Event Loop)。
nextTick process.nextTick(fn) 的 fn 会在什么时候执行呢?
- 在 Node.js 11 之前,会在每个阶段的末尾集中执行(俗称队尾执行)。
- 在 Node.js 11 之后,会在每个阶段的任务间隙执行(俗称插队执行)。
- 浏览器跟 Node.js 11 之后的情况类似。可以用 window.queueMicrotask 模拟 nextTick。
Promise Promise.resolve(1).then(fn) 的 fn 会在什么时候执行?
-
这要看 Promise 源码是如何实现的,一般都是用 process.nextTick(fn) 实现的,所以直 接参考 nextTick。
-
async / await 这是 Promise 的语法糖,所以直接转为 Promise 写法即可。
2. express.js 和 koa.js 的区别是什么?
- 中间件模型不同:express 的中间件模型为线型,而 koa 的为U型(洋葱模型)。
- 对异步的处理不同:express 通过回调函数处理异步,而 koa 通过generator 和async/await 使用同步的写法来处理异步,后者更易维护,但彼时 Node.js 对async 的兼容性和优化并不够好,所以没有流行起来。
- 功能不同:express 包含路由、渲染等特性,而 koa 只有 http 模块。
- 总得来说,express 功能多一点,写法烂一点,兼容性好一点,所以当时更流行。虽然现在 Node.js 已经对 await 支持得很好了,但是 koa 已经错过了风口。
- 不过 express 和 koa 的作者都是 TJ 大神