文档
内容概要

  • Nodejs 可以做什么
  • Nodejs 的架构和运行过程
  • Nodejs 异步IO和事件驱动
  • Nodejs 单线程
  • Nodejs 实现 API 服务
  • Nodejs 核心模块及 API 使用

    Node.js 可以做什么

  • 轻量级、高性能的Web 服务

  • 前后端 JS 同构开发
  • 便捷高效的前端工程化

Nodejs 的架构和运行过程

image.png

Natives modules

  • 当前层内容由 JS 实现
  • 提供应用程序可直接调用库,例如fs、path、http 等
  • JS 语言无法直接操作底层硬件设置

    Builtin modules “胶水层”

  • 提供操作文件读写等一些功能

  • C / C++、 node

    底层

  • V8: 执行 JS 代码, 提供桥梁接口

  • Libuv: 事件循环、事件队列、异步IO
  • 第三方模块: zlib、http、c-ares 等

运行过程

image.png

Nodejs 异步IO

  • IO 是应用程序的瓶颈所在
  • 异步 IO 提高性能无采原地等待结果返回
  • IO 操作属于操作系统级别, 平台都有对应实现
  • Nodejs 单线程配合事件驱动架构及 libuv 实现了异步 IO

image.png

Nodejs 事件驱动架构

  • 事件驱动架构是软件开发中的通用模式
  • 事件驱动、发布订阅、观察者
  • 主题发布消息,其他实例接收消息

    Nodejs 单线程

  • 异步IO、事件驱动、事件循环

  • Nodejs 主线程是单线程
  • 使用 JS 实现高效可伸缩的高性能 Web 服务
  • 单线程实现高并发
    • 异步非阻塞 IO 配合事件回调通知

image.png

Nodejs 应用场景

  • IO 密集型高并发请求
  • nodejs 作为中间层
  • image.png
  • 操作数据库提供 API 服务
  • 实时聊天应用

全局对象

  • 与浏览器平台的 window 不完全相同
  • Nodejs 全局对象上挂载许多属性
  • 全局对象是 JS 中的特殊对象
  • Nodejs 中全局对象是global
  • Global 的根本作用就是作为宿主
  • 全局对象可以看作是全局变量的宿主
  • Nodejs 常见全局变量

    • __filename: 返回正在执行脚本文件的绝对路径
    • __dirname: 返回正在执行脚本坐在目录
    • timer 类函数: 执行顺序与事件循环间的关系
    • process:提供与当前进程互动的接口
    • require: 实现模块的加载
    • module、exports: 处理模块的导出

      全局变量之 process

  • 无须 require 可直接使用

  • 获取进程信息
  • 执行进程操作
  • 资源: cpu 内存
  • 运行环境: 运行目录、node环境、cpu架构、用户环境、系统平台
  • 运行状态:启动参数、PID、运行时间
  • 事件监听:发布-订阅模式
  • 标准的输出、输入、错误
    • process.stdin 输入
    • process.stdout 输入 ```typescript // 1、资源类 console.log(process.memoryUsage()) / { rss: 160002048, heapTotal: 131510272, heapUsed: 108209720, external: 2165088 } / console.log(process.cpuUsage()) / { user: 3513102, system: 173436 } /

// 2、运行环境 console.log(process.cwd()) // /Users/onion/Downloads/Code/test

console.log(process.version) console.log(process.versions) console.log(process.arch) console.log(process.env.NODE_ENV) console.log(process.env.PATH) console.log(process.env.USERPROFILE) // HOME console.log(process.platform)


// 3、运行状态

console.log(process.argv) // 返回数组 console.log(process.argv0) // 返回数组第一个值 console.log(process.pid)

console.log(process.uptime()) // 运行耗时

// 4、事件

process.on(‘exit’, (code) => { // 这里要求是同步代码, 不能是异步的 console.log(‘exit ‘ + code) })

process.on(‘beforeExit’, (code) => { console.log(‘beforeExit ‘ + code) })

// 5、标准的输入 错误

console.log = function(data) { process.stdout.write(‘—-‘ + data + ‘\n’) } console.log(11) console.log(22)

// —-11 // —-22

process.stdin.pipe(process.stdout) // 将面板输入的内容输出

```