前言:
以下内容来自2024 版:Node.js+Express+Koa2+Nest.js 开发服务端第16章
1. nodejs是什么?
nodejs是基于Chorme v8的运行环境,node出现之前,js只能在浏览器中运行,node出现之后,js可以在任何安装nodejs的环境运行
2. nodejs和前端js的区别是什么?
前端JavaScript主要包括ECMAScript(ES6是其一个版本)以及Web API(包括DOM、BOM等)。ECMAScript负责定义JavaScript的语法规则,而Web API则是浏览器提供的各种对象和方法,用于实现网页上的各种交互效果。
Node.js是一个JavaScript运行环境,它的核心也是基于ECMAScript规范,同时也提供了很多附加的API,用于实现文件操作、网络编程、数据流等功能。这些API都是Node.js特有的,和浏览器环境下的Web API是不同的。
- 前端js用于网页,在浏览器运行
- nodejs可用于服务端,如开发web server
- nodejs也可用于本机,如webpack等本机的工具
3. nodejs调试
参考前文
4. 当前文件和目录的路径如何获取
* `__filename` (全局变量)
* `__dirname`(全局变量)
5. path.resolve和path.join的区别
path.join只是简单的将路径片段进行拼接,并规范化生成一个路径,而path.resolve则一定会生成一个绝对路径,相当于执行cd操作。
6. commonjs和es6的区别
- 语法不同
- commonjs是动态引入,执行时引入
- es6是静态引入,编译时引入
所以webpack tree shaking 只支持es6模块,不支持commonjs
7. eventloop在nodejs和浏览器中的区别
-
浏览器
- 同步代码执行完后,将触发Event loop机制,执行宏任务
- 触发Event Loop之前,会把现有的微任务都执行完
- 所以微任务比红任务执行时机更早
-
nodejs
- settimeout、setinterval (宏任务)
- promise、async/await (微任务)
- process.nextTick(微任务)(Node.js提供的一个API,用于在当前执行栈中的所有同步任务执行完毕后,但在事件循环开始之前,执行一个回调函数)
- setimmediate(宏任务)(允许你将一个函数推迟到当前事件循环的末尾执行)
- I/O 文件 网络(宏任务)
- socket连接,如连接mysql(宏任务)
-
nodejs执行顺序(和浏览器相同)
- 先执行同步代码
- 执行微任务
- 执行宏任务,回到第二步 nodejs宏任务比较多,需要分开
建议用setImmediate代替process.nextTick
注意:新版的nodejs已经和浏览器趋同
8. async、await执行顺序场景题
// 输出顺序
setImmediate(() => {
console.log('immediate')
})
async function async1 () {
console.log('async1 start')
await async2() // 同步
console.log('async1 end') // await 后面的内容,异步(微任务),相当于callback函数
}
async function async2 () {
console.log('async2')
}
console.log('script start')
setTimeout(() => {
console.log('setTimeout')
}, 0)
async1()
new Promise((resolve) => {
console.log('promise1') //同步
resolve() // 触发.then, .then是微任务
}).then(() => {
console.log('promise2')
})
process.nextTick(() => {
console.log('nextTick')
})
console.log('script end')
script start
async1 start
async2
promise1
script end
nextTick
async1 end
promise2
setTimeout
immediate
9. session如何实现登录
- cookie 如何实现登录校验
- session 和cookie的关系
- session 为何需要存储在redis中
直接传cookie不安全,所以有了session,session记录标识和用户信息的关系
10. koa2和express的中间件机制
- 从代码看,中间件就是一个函数
- 从业务看,中间件则是一个独立的模块
- 模块拆分,模块流转,即可完成复杂的功能
Q:如何实现一个中间件
11. 描述koa2洋葱圈模型
12. 如何逐行读取一个1g大小的日志文件
13. nodejs线上环境为何开启多进程
- 高效使用多核CPU
- 充分利用服务器内存