Nodejs 知识梳理

node 是一个js 的运行时 js BOM DOM ECMASCRIPT => node中只有ECMASCRIPT + 模块

  • import export babel-> commonjs mjs
  • node 干什么? 写些脚本(比如说webpack,都是用node写的) 中间层 服务端渲染(vue react)可以实现前后端分离 可以解决前端跨域问题、数据处理
  • 实现高性能的web服务

浏览器事件环和node事件环

v10+执行的效果是一样的。给每个宏任务对应的都配置了一个队列 timer poll check (每个执行完后清空一次微任务)

进程和线程的区别 (node中的进程)

  • node执行一旦报错整个都会断掉,现在电脑都是多核 node可以开启多个子进程,监听同一个服务,其中一个挂了还能继续 pm2
  • 一个进程中可以有多个线程,比如渲染线程、JS 引擎线程、HTTP 请求线程等等
  • 进程表示一个程序,线程是进程中的单位 主线程只有一个
  • 1个进程可以占用1核cpu
  • 多线程在单核cpu中其实也是顺序执行的,不过系统可以帮你切换哪个执行而已,没有提高速度
  • 多个cpu的话就可以在多个cpu中同时执行

单线程优点:解决切换上下文时间,没有锁的问题(因为只有一个线程,不会两个线程操作同一个文件),节省内存(切换上下文,多线程感觉是同一时间干了好多事,其实不是,你做一点,他再做一点,其实是多个线程不停的切换)

node是单线程的 主进程,再开多个子进程,里面包含着一个线程

单线程

多线程

node中的全局对象 (可以直接调用的)

  • process,buffer
  • process.cwd() 可以改变 process.nextTick process.pid process.argv commander process.env 环境变量
  • require,exports,module,__filename,__dirname (可以直接在模块内部被访问)

node中的模块

  • 模块分类 ES6module,commonjs规范 amd,cmd,umd
  • commonjs规范
    • 一个文件就是一个模块
    • 如果模块想给别人使用 module.exports / exports 同一个对象但是最终导出的是module.exports
    • 如果想使用这个模块 require (同步读取文件,包一个自执行函数,vm.runInthisContext,传入export对象,最终返回的是exports 对象,所以就可以拿到其他模块的内容)
  • 模块的查找规范
    • 第三方模块 module.paths
    • 如果文件和文件夹重名 先取文件,文件不能取到,找文件夹 package.json => main => index.js

node中模块的分类

  • 核心模块 require(‘moduleName’)
    • fs fs.readFileSync ReadFile fs.existsSync fs.access
    • vm vm.runInThisContext
    • path path.resolve() join extname basename dirname (process.cwd())
    • util util.inherits util.promisify (转化成promise) async + await
    • events on(addListener) once(绑定一次) off(关闭绑定) newListener emit
    • 发布订阅优势 解耦合
  • 文件模块/自定义模块 (同步读取文件,包一个自执行函数,vm.runInthisContext,传入export对象,最终返回的是exports 对象,所以就可以拿到其他模块的内容)
  • 第三方模块 module.paths
    • commander , chalk , mime 1.jpg

如果文件和文件夹重名 先取文件,文件不能取到,找文件夹 package.json => main => index.js