zoukankan      html  css  js  c++  java
  • 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、最终:压榨服务器,不浪费资源
  • 相关阅读:
    flask路由+视图
    flask基本使用1
    返回对象时字典化
    python3连接redis
    selected_related和prefetch_related
    django删除migrations导致初始化数据库失效
    vue添加拦截器(身份认证)以及cookie认证
    vue添加使用全局变量
    列表:动手试一试
    转来的字符串编辑方式
  • 原文地址:https://www.cnblogs.com/vicky24k/p/14781025.html
Copyright © 2011-2022 走看看