2023-09-06
NodeJS
00
请注意,本文编写于 415 天前,最后修改于 235 天前,其中某些信息可能已经过时。

目录

nodejs是什么
nodejs三大特征
nodejs优势及用途
学习资料
nodejs REPL环境
nodejs回调函数
nodejs 事件循环
nodejs缓冲区与流
Node.js模块系统
nodejs路由
nodejs全局对象
nodejs文件系统
node 框架
对比koa2、koa1、express中间件
koa中间件原理

简单总结了NodeJS相关基础知识

nodejs是什么

  • nodejs本质是一个javascript的解释器(运行环境)。
    • 移植了chrome V8引擎,解析和执行代码机制和浏览器js相同,
    • 另外扩展了自己需要的功能(如文件操作、网络、流等)
  • nodejs是一个服务器程序
  • nodejs不是web服务器

nodejs三大特征

  1. 单线程
    • 优点:系统就不需要有创建线程和销毁的时间的开销,性能更好
    • 缺点: 单线程的阻塞的问题。(一个崩溃了 ,其他的都崩溃了)
  2. 非阻塞 I/O
    • I/O阻塞了代码的执行,node就是非阻塞的I/O,在执行完访问数据库的代码之后,将立即执行后面的代码,而不是等待,而是将处理数据的过程放在回调函数中,提高了效率。
    • 与阻塞模式的对比 使线程的利用率是100%
    • 为了处理异步的I/O线程就必须要有事件的循环,不断的检查有没有未处理的事件,依次的予以处理
  3. 事件驱动
    • 一个线程处理了多个事件,采用观察者模式对事件进行调度。

nodejs优势及用途

  • 处理大流量数据
  • 适合实时交互的应用
  • 完美支持对象数据库
  • 异步处理大量并发连接
  • 前端工具 vitewebpackgulpbabel
  • SSR

学习资料

包管理器 npm

  • 允许用户从NPM服务器下载别人编写的三方包到本地使用。
  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

nodejs REPL环境

交互式解释器

  • ctrl+ c -退出当前终端(输入 .exit也可以)。
  • ctrl+c按下两次-退出NodeREPL。
  • ctrl+d-退出NodeREPL.
  • 向上/向下键-查看输入的历史命令
  • tab键-列出当前命令
  • .help -列出使用命令
  • .break-退出多行表达式
  • .clear -退出多行表达式
  • .save filename -保存当前的Node REPL会话到指定文件
  • .loadfilename-载入当前NodeREPL会话的文件内容。

nodejs回调函数

  • 函数调用的方式分为三类:同步调用、回调、异步调用
  • 回调是一种双向调用机制
  • 可以通过回调函数来实现回调

nodejs 事件循环

Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现

事件驱动模型 image.png

阻塞与非阻塞概念

  • 阻塞和非阻塞关注的是程序在等待调用结果(消息, 返回值)时的状态.
  • 阻塞就是做不完不准回来
  • 非阻塞就是你先做,我现看看有其他事没有,完了告诉我一声

事件处理代码流程

  1. 引入events对象,创建eventEmitter对象
  2. 绑定事件处理程序
  3. 触发事件
javascript
const events = require('events') const eventEmitter = new events.EventEmitter() function connectHanddler () { console.log('connected被调用') } eventEmitter.on('connect', connectHanddler) eventEmitter.emit('connect')

nodejs缓冲区与流

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。处理文件流和处理TCP流(如文件之间传数据),必须使用到二进制数据(IO操作效率高),因此有了Buffer类,该类用来创建一个专门存放二进制数据的缓存区。

Node.js,Stream 有四种流类型:

  • Readable - 可读操作。
  • Writable - 可写操作。
  • Duplex - 可读可写操作.
  • Transform - 操作被写入数据,然后读出结果。

所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:

  • data - 当有数据可读时触发。
  • end - 没有更多的数据可读时触发。
  • error - 在接收和写入过程中发生错误时触发。
  • finish - 所有数据已被写入到底层系统时触发。

写入流、管道流、链式流

Node.js模块系统

require、module.exports用法
nodejs文件加载逻辑(非常重要)

nodejs路由

根据request.url 正则处理url路径

nodejs全局对象

  • global
  • __dirname
  • __filename
  • process

nodejs文件系统

nodejs内置模块

  • util
  • http
  • fs
  • url
  • os
  • path
  • net
  • domain
  • 连接mysql

node 框架

https://koa.bootcss.com/
https://www.expressjs.com.cn/

对比koa2、koa1、express中间件

image.png

image.png

koa.webp

异同:

  • koa基于es6 express 基于es5
  • express返回不同类型的数据调用不同的方法,koa则直接设置body即可(respond可以看一下)
  • koa更小,不再内置router等
  • 与koa不同,express一旦response后面的中间件就不再执行,所以错误处理要放在前面
javascript
// express res.json({name: 'zs'})

koa中间件原理

javascript
// koa 中间件洋葱模型执行流程模拟 async function fn1 (ctx, next) { console.log('fn1 start') await next(); console.log('fn1 end') } async function fn2(ctx, next) { console.log('fn2 start') await next(); console.log('fn2 end') } function componse (middlewares) { return function (ctx) { return dispatch(0) function dispatch(i) { let fn = middlewares[i] if(!fn) { return Promise.resolve() } return Promise.resolve( fn(ctx, function next () { return dispatch(i + 1) }) ) } } } componse([fn1, fn2])({/* ctx */}) // fn1 start // fn2 start // fn2 end // fn1 end

nodejs启动服务极简案例

javascript
const http = require('http'); let server = http.createServer(); server.on('request',(req,res) => { res.end('xxx'); }); server.listen(8888,()=>{ console.log('服务器启动在8888端口'); });

本文作者:郭敬文

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!