## 汇总
- [手写 eventEmitter](../handwritten/eventEmitter/eventEmitter.md)
- [Nodejs 适用于哪些场景?](#Nodejs 适用于哪些场景?)
##
## Nodejs 适用于哪些场景?
后端开发,Nodejs 的异步 I/O 天生适合做 Web 高并发。
SSR 开发
BFF 开发,配合 GraphQL 做中间层。
前端基建,Webpack、Gulp、Babel、Jest 等等前端工程化的工具或插件。
2. Nodejs 的事件循环和浏览器有什么区别?
Node.js 的事件循环和浏览器中的事件循环的区别在于,浏览器的异步任务分为宏任务队列和微任务队列,而 Nodejs 的异步任务分成了 6 个任务队列,按执行顺序分别为:
timers 阶段:处理 setTimeout()和 setInterval()等定时器事件。
I/O callbacks 阶段:处理几乎所有的异步 I/O 回调,例如网络 I/O、文件 I/O 等。
idle, prepare 阶段:这是 Node.js 内部使用的,开发者很少会用到。
poll 阶段:等待新的 I/O 事件,处理已经完成的事件回调。
check 阶段:处理 setImmediate()的回调函数。
close callbacks 阶段:处理一些关闭事件,例如 socket 关闭等。
举个例子:
javascript 复制代码 console.log('start');
setTimeout(() => {
console.log('timeout');
}, 1000);
setImmediate(() => {
console.log('immediate');
});
console.log('end');
输出结果:
bash 复制代码 start
end
immediate
timeout
再来一个复杂的例子:
javascript 复制代码 console.log('start');
setTimeout(() => {
console.log('timeout');
process.nextTick(() => {
console.log('nextTick');
});
}, 1000);
setImmediate(() => {
console.log('immediate');
});
const fs = require('fs');
fs.readFile(\_\_filename, () => {
console.log('readFile');
setImmediate(() => {
console.log('immediate in readFile callback');
});
setTimeout(() => {
console.log('timeout in readFile callback');
}, 0);
});
process.nextTick(() => {
console.log('nextTick');
});
console.log('end');
输出如下:
bash 复制代码 start
end
nextTick
readFile
nextTick
immediate
immediate in readFile callback
timeout in readFile callback
timeout
nextTick
分析一下整个代码在事件循环的六个阶段中的执行顺序:
timers 阶段:在该阶段中,执行了由 setTimeout 方法产生的回调函数,输出 timeout,并在回调函数中注册了一个 process.nextTick 方法产生的回调函数。
I/O callbacks 阶段:执行 fs.readFile 方法的回调函数,输出 readFile,并在回调函数中注册了一个 setImmediate 和一个 setTimeout 方法产生的回调函数。
idle, prepare 阶段:没有任务执行。
poll 阶段:处理 setImmediate 方法产生的回调函数,输出 immediate 和 immediate in readFile callback。然后处理由 fs.readFile 方法产生的 setTimeout 方法回调函数,输出 timeout in readFile callback。
check 阶段:在该阶段中,执行由 process.nextTick 方法产生的回调函数,输出 nextTick 和 nextTick。
close callbacks 阶段:没有任务执行。
3. 讲一下 EventEmitter?
EventEmitter 经常在面试的时候会要求手写,因为这玩意用途实在是太广了。比如在 Vue 里面的 EventBus 实现组件通信,其核心就是 EventEmitter。
Node.js 的大多数核心模块都是基于 EventEmitter 实现的,如 http、net、fs,很多第三方库也是基于 EventEmitter 实现的,如 socket.io、nodemailer、cheerio 等。
使用 EventEmitter 的好处是可以用事件的形式来处理异步任务,可以大大简化代码,并且容易处理异常。
举个例子来看看为什么 Nodejs 里大多数模块都要继承 EventEmitter。
这是不使用 EventEmitter 实现的文件读取,所有逻辑都放在一个回调函数里:
javascript 复制代码 const fs = require('fs');
fs.readFile('file.txt', (err, data) => {
if (err) {
console.error(`Failed to read file: ${err}`);
} else {
console.log(`File content: ${data}`);
}
});
这是使用 EventEmitter 的文件读取:
javascript 复制代码 const fs = require('fs');
const stream = fs.createReadStream('file.txt');
stream.on('data', (chunk) => {
console.log(`Received ${chunk.length} bytes of data.`);
});
stream.on('end', () => {
console.log('Finished reading file.');
});
很显然,使用 EventEmitter 之后,处理文件和处理异常的逻辑就被分开了,代码可读性和可维护性都提升了。 4. Buffer 怎么理解,有什么应用?
Buffer 对象是一个类似于数组的对象,它的每个元素都是一个表示 8 位字节的整数。
可以将其看作是一个字节数组,用来存储和操作二进制数据。
应用场景:
网络通信:可以使用 Buffer.from()方法将字符串转换为二进制数据,然后使用 net 模块进行网络通信:
javascript 复制代码 const net = require('net');
const client = net.createConnection({ port: 8080 }, () => {
// 将字符串转换为二进制数据
const data = Buffer.from('Hello, world!', 'utf8');
// 发送数据
client.write(data);
});
文件操作,用 Buffer 来存储文件数据:
javascript 复制代码 const fs = require('fs');
// 读取文件,并将数据存储到 Buffer 对象中
const data = fs.readFileSync('/path/to/file');
// 处理数据
// ...
加密解密,例如,可以使用 crypto 模块创建加密解密算法需要的二进制数据:
javascript 复制代码 const crypto = require('crypto');
// 创建加密解密算法需要的二进制数据
const key = Buffer.from('mysecretkey', 'utf8');
const iv = Buffer.alloc(16);
// 创建加密解密算法对象
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
// 加密数据
const encrypted = Buffer.concat([cipher.update(data), cipher.final()]);
图像处理:
javascript 复制代码 const fs = require('fs');
const sharp = require('sharp');
// 读取图片文件,并将数据存储到 Buffer 对象中
const data = fs.readFileSync('/path/to/image');
// 处理图片
sharp(data)
.resize(200, 200)
.toFile('/path/to/resized-image', (err, info) => {
// ...
});
5. 什么是 I/O?
概念:计算机里所谓的 I/O 指的是输入和输出,但对于前端同学而言,这个定义可能不太好理解。简单点说,需要等待的任务都可以称为 I/O 任务,比如前端的事件处理、网络请求、定时器,后端的文件处理、网络请求、数据库操作,这些都属于 I/O 任务。
异步 I/O:以网络请求任务为例,传统的同步 I/O 指的是一个一个排队执行,一个执行完了再执行下一个,即使线程空闲,也不能执行其他任务。
而异步 I/O 会返回一个标记,告诉调用者 I/O 操作已经开始,但不会阻塞线程。当 I/O 操作完成时,会调用注册的回调函数,将结果返回给调用者。
异步 I/O 使得程序在执行 I/O 操作时不必等待,提高了程序的并发性能。
听起来异步 I/O 很好,那为什么同步 I/O 依然会存在
传统的同步 I/O 操作比异步 I/O 操作更容易理解和编写。异步编程需要开发人员具备较高的技能水平,以及对事件循环、回调函数等概念的深入理解。
对于某些小规模的应用程序或者一些低频次的 I/O 操作,使用异步 I/O 可能不会带来很大的性能提升,而且可能会增加代码的复杂性。
对于一些 CPU 密集型任务,传统 I/O 操作可能比异步 I/O 更快,因为异步 I/O 会在 I/O 操作执行期间增加额外的上下文切换和事件处理负担,从而降低了程序的性能。
CPU 密集和 I/O 密集:
CPU 密集任务指的是纯计算任务。
I/O 密集的任务指的是需要等待的任务。所谓的高并发,显然属于 I/O 密集型任务。
6. 讲一下常见的 Nodejs 框架?
Koa:一个轻量的 Nodejs 框架,代码非常简洁。采用洋葱圈模型中间件,非常方便扩展功能,但是开发后端 API 需要进行再封装。
Express:Express �
没有合适的资源?快使用搜索试试~ 我知道了~
前端面试宝典、前端面试题库、高频前端面试题、大厂面试题、算法面试题、前端面试题大全
共330个文件
md:152个
js:104个
html:23个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 3 下载量 22 浏览量
2023-11-21
09:37:23
上传
评论
收藏 1.48MB ZIP 举报
温馨提示
前端面试宝典、前端面试题库、高频前端面试题、大厂面试题、算法面试题、前端面试题大全。这是一个有答案的、高频前端面试汇总 按照高频排序,且附上最完整、通俗易懂的答案,拿必包做举例。 面试官问你必包,你回答概念,这时候面试官并不会因此而结束,而会继续深挖,比如说必包设计的初衷,能解决哪些问题,还有应用场景,我这里全部给你回答,而且没有废话,关键的是还通俗易懂。还有必包练习题,看题说结果,看完我的答案,所有必包的问题你都解决了,而其他面试题库,要嘛没有答案,要嘛答案看不懂,还得一直去搜,我这里直接给你一套龙服务,关键的是我还有我自己调试的代码。 再举个例子,手写 promise,我不仅有代码,还有文字解释,你文字看不懂,我直接给你找个 promise 的视频,附上链接,直接看视频,而不是像某些面试宝典,就给你光秃秃的代码,顶多加个注释,都不知道是啥意思。 看我的面试宝典,你无需自己去搜,因为所有的一切,我都给你准备好了。 总结:面经汇总+答案+代码+参考链接+视频链接 目录大纲,详见README.md文档,总有你需要的。
资源推荐
资源详情
资源评论
收起资源包目录
前端面试宝典、前端面试题库、高频前端面试题、大厂面试题、算法面试题、前端面试题大全 (330个子文件)
.babelrc 49B
browserslist 429B
.editorconfig 246B
.eslintignore 9B
.eslintrc 37B
.gitignore 631B
.gitignore 143B
.gitignore 13B
.gitkeep 0B
app.component.html 25KB
test.html 2KB
4.html 2KB
3.html 1KB
2.html 1KB
test.html 1KB
2.html 1KB
1.html 1KB
1.html 1KB
伪类.html 766B
bfc.html 761B
外边距折叠.html 744B
多栏布局.html 706B
position.html 686B
流式(float).html 656B
1.html 648B
dom增删改查.html 633B
absolute+auto.html 586B
eventloop3.html 586B
高度坍塌.html 549B
index.html 505B
数组转伪数组.html 363B
localStoragte.html 259B
favicon.ico 948B
3.js 5KB
1.js 4KB
promise9.js 3KB
random.js 3KB
promise8.js 3KB
bind2.js 3KB
localStorage.js 2KB
promise7.js 2KB
2.js 2KB
1.js 2KB
cloneDeep.js 2KB
1.js 2KB
promise6.js 2KB
promise5.js 2KB
1.5.js 2KB
proxy.js 2KB
避免循环引用的被观察者类.js 2KB
观察者模式.js 2KB
call2.js 2KB
deepClone.js 2KB
1.4.js 2KB
xx.js 1KB
xx.js 1KB
promise3.js 1KB
1.3.js 1KB
link.js 1KB
test.js 1KB
eventEmitter2.js 1KB
promise4.js 1KB
2 copy.js 1KB
promise2.js 1KB
eventEmitterTest.js 1KB
new.js 1KB
实现并发.js 1KB
并发请求.js 1KB
4.js 1KB
call.js 1KB
eventEmitter1.js 1KB
karma.conf.js 1014B
promise1.js 1013B
1.2.js 997B
2.js 917B
fanyi.js 844B
hhh.js 820B
protractor.conf.js 808B
index.js 750B
1.js 733B
bind.js 723B
1.js 715B
必包.js 689B
4.js 680B
es5.js 645B
test2.js 640B
quickSort.js 638B
apply.js 616B
index.js 600B
enqueue.js 583B
stack.js 577B
binarySearch.js 572B
双指针.js 561B
2.js 558B
config.default.js 557B
原型链继承.js 531B
1.js 518B
2.js 514B
广度.js 505B
1.1.js 501B
共 330 条
- 1
- 2
- 3
- 4
资源评论
- 猿耳盗铃2024-03-05终于找到了超赞的宝藏资源,果断冲冲冲,支持!
- 默明神烦2024-04-10资源使用价值高,内容详实,给了我很多新想法,感谢大佬分享~
- 一只刺球2023-12-10实在是宝藏资源、宝藏分享者!感谢大佬~
十小大
- 粉丝: 9113
- 资源: 2552
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功