nodejs相关问题

nodejs是什么?
1、nodejs是基于Chome V8引擎的javascript运行时(nodejs 是 JS 的运行环境,运行环境需要一个 JS 的解析器,就是 Chrome V8 引擎)
2、nodejs出现之前,js只能在浏览器运行
3、nodejs出现之后,js可以在任何安装nodejs的环境运行

nodejs和前端js的区别
应用:
1、前端js用于网页,在浏览器运行
2、nodejs可用于服务端,如开发web server
3、nodejs也可用于本机,如webapck等本机等工具

语法:
1、都是用ES语法 (变量,函数,class...)
2、前端js使用JS Web API (BOM,DOM,ajax...)
3、nodejs 使用 node API (http,querystring...)

当前文件和当前目录的路径,如何获取
1、__filename
2、__dirname
3、两个都是全局变量

nodejs如何调试?
启动命令中加 --inspect=9229端口可以改变
多个nodejs项目,保证不同inspect协议端口的唯一性
1、启动nodejs服务时,使用inspet
2、代码中使用debugger断点
3、使用chrome调试 - chrome://inspect

commonjs和ES6 Module的区别
1、语法不通
2、commonjs是动态引入,执行时引入(可以放在代码段中)
3、ES6 Module是静态引入,编译时引入(必须放在最外层,若放在代码段中,编译会报错;)
4、引申话题:tree shaking,仅仅支持ESModule,原因:静态编译的时候去判断代码有没有引用;动态的时候,在执行之前,无法确定是不是有用

path.resolve和path.join的区别
1、两者都是用于拼接文件路径
2、path.resolve获取绝对路径
3、path.join获取相对路径

事件循环 event loop 在nodejs和浏览器的区别
1、了解js异步、单线程
2、了解浏览器中的event loop过程
3、nodejs中的event loop有何不同

浏览器js的异步
1、宏任务:setTimeout setInterval ajax等
2、微任务:Promise async/await
3、微任务比宏任务更早执行

浏览器event loop
1、Call Stack空闲时,将触发Event Loop机制,执行宏任务
2、而触发Event Loop之前,会把现有的微任务都执行完
3、所以微任务比宏任务执行时机更早

nodejs中的异步
1、setTimeout setInterval-宏任务
2、Promise async/await-微任务
3、Process.nextTick-微任务
4、setImmediate-宏任务
5、I/O文件网络-宏任务
6、Socket 连接,如连接mysql-宏任务

基本执行步骤
1、执行同步代码
2、执行微任务
3、执行宏任务,回到第二步

nodejs中异步的特点
1、微任务不多
2、宏任务类型较多
3、如果宏任务都放在一个Callback Queue中,不好管理

nodejs事件循环的6个阶段
- timers:执行setTimeout以及setInterval的回调
- I/O callbacks:callbacks-处理网络、流、TCP的错误回调
- idls,prepare:闲置阶段,node内部使用
- poll:执行poll中的I/O队列,检查定时器是否到时间
- check:存放setImmediate回调
- close callbacks:关闭回调,例如`Socket.on(close)`
执行宏任务之前,都要先执行完微任务

每个阶段和微任务
1、每个阶段结束后,都要执行微任务
2、微任务中,process.nextTick优先级最高,最早被执行
3、(但process.nextTick现在已不推荐使用,因为会阻塞IO)

几个细节
1、setTimeout比setImmediate执行更早
2、process.nextTick比Promise.then执行更早
3、另外,建议用setImmediate代替process.nextTick

event loop在浏览器和nodejs但区别
1、nodejs异步API更多,宏任务类型也更多
2、nodejs但Event Loop分为6个阶段,要按照顺序执行
3、微任务中process.nextTick优先级更高

关于nodejs版本
1、新版nodejs已和浏览器趋同
2、即,兼容代码在两者执行但结果是一样的
3、网上很多资料都是旧版nodejs的,注意鉴别

async/await执行顺序问题

```js start```

setImmediate(() => {
console.log('immediate')
})

async function async1(){
console.log('async1 start')
await async2()
console.log('async1 end')
}

async function async2(){
console.log('async2')
}

console.log('script start')

setTimeout(function(){
console.log('setTimeout')
},0)

async1()

new Promise(function(resolve){
console.log('promise1')
resolve()
}).then(function(){
console.log('promise2')
})

process.nextTick(() => {
console.log('nextTick')
})

console.log('script end')

```js end```
执行结果:
script start
async1 start
async2
promise1
script end
nextTick
async1 end
promise2
setTimeout
immediate


session如何实现登录
1、cookie如何实现登录校验
2、session和cookie的关系
3、session为何需要存储在redis中

cookie用于校验登录
前端登录后,服务段会设置一个cookie,把用户信息给前端
前端只要在同域下,在请求其它接口的时候,都会自动带上这个cookie,这样就实现了登录校验
应用中的细节:还会设置cookie过期时间,设置cookie的安全性

session和cookie
1、cookie如何实现登录校验:就是每次用户登录过后服务端为用户设置一个cookie:并且是一个随机数,不是真实的用户信息。这个cookie要设置过期时间以及设置http:only字段
2、用户的cookie值所对应的真实信息,都是存储在服务器的session里
3、进程之间的内存无法共享,所以需要

session 存储到redis
1、进程有内存限制,无法存太多东西
2、进程的内存是相互隔离的,进程之间无法共享数据
3、存储到redis,可解决这些问题

描述koa2和express的中间件机制
1、从代码来看,中间件就是一个函数
2、从业务来看,中间件则是一个独立的模块
3、模块拆分,模块流转,即可完成复杂的功能

回顾自己实现koa2和express源码
lib -> express -> like-express
lib -> koa2 -> like-koa2

nodejs如何读取大文件

读取大文件 - 流 stream
1、1G大小的access.log
2、分析其中Chrome浏览器占比
3、考虑CPU和内存的限制
--blog-1 -> src -> utils -> readline.js

nodejs线上为何开启多进程(PM2)
1、高效使用多核CPU
2、充分利用服务器内存
3、最终:压榨服务器,不浪费资源
原文地址:https://www.cnblogs.com/vicky24k/p/14781025.html