Node.js | 青训营笔记

122 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第3天

Node.js

Node.js 简介

异步 I/O

Node.js 的 I/O 操作,例如文件读取和网络请求都会采取异步的方式进行

单线程

优点:不必考虑状态同步,死锁和线程切换的性能开销

缺点:无法利用多核 CPU,错误会引起应用退出,健壮性不足,CPU 占用高

跨平台

Windows 和*nix(包括 mac)通用

npm 包查找策略

require('lodash') 查找包: 当前目录 node_modules -> 父级目录 node_modules -> 向上递归一直找到根目录

require('lodash') 加载包:加载 package.json main 指向的文件,如果没有则一次查找 index.js index.json index.node

模块化语言规范 ES Modules (对比 CommonJS)

统一浏览器和服务器的一种语言规范。写好后可以直接使用 Babel 编译成 node 的 CommonJS。(或者写出 mjs 后缀文件,可以直接使用 node 编译)

npm 常用命令(拓展)

npm info

查看包命令

npm update

更新包

npm public

发布包

package.json

Node 的调试

VS code 版:在根目录下配置 launch.json:(注意启动程序在 program 下配置,workspaceFolder 为当前目录)

{
  "configurations": [
    {
      "type": "nodemon",
      "request": "launch",
      "name": "Launch Promgram",
      "program": "${workspaceFolder}/server/app.js",
      "sourceMaps": true
    }
  ]
}

如何将 node 应用于高并发场景(克服单线程模型的障碍)

  1. 采用事件驱动,一些方法可以试着尝试异步非阻塞模式
  2. 利用多核 CPU,使用 cluster,child_process,worker_threads 模块
  3. 使用 PM2 进行进程管理监控(进程守护)
  4. 克服复杂计算:在特殊的需要复杂计算的时候,创建一个子进程,进行计算,防止主进程阻塞

Node.js 服务开发:稳定性保障(避免宕机)

异常捕获

通过 process 对象,对进程所爆出的异常进行捕获,并进行操作

process.on('uncaughtException', (error) => {
    ...////打印log,处理错误等等
})//未捕获的JavaScript异常回到事件循环的时候
​
process.on('unhandledRejection',(reason) => {
    ...//打印log,处理错误等等
})//Promise被reject且没有reject处理器的时候

自动重启

可以利用多进程的方式,子进程异常结束后,立刻重新 fork 新进程代替

//利用cluster模块实现“自动重启”
cluster.on('exit', (worker, code, signal) => {
  if (worker.suicide) {
    cluster.fork()
  }
})

健康检查

对代码进行特定环境的测试,检查安全性