Node.js菜鸟日记1

200 阅读3分钟
  • 记录日常学习之路

Node.js不是什么

要搞清楚node.js是什么,首先要搞清楚node.js不是什么

不是web框架

  • node.js并不是web后端的框架
  • 所以不能把node.js和FlaskSpring对比

不是编程语言

  • node.js并不是后端的js
  • 所以不能把node.js 与 pythonPHP 对比

Node.js是什么

是一个平台

  • 它将多种技术组合起来
  • 让JavaScript也能调用系统接口、开发后端应用

Node.js用到了哪些技术

  • V8引擎
  • libuv
  • C/C++实现的 c-areshttp-parserOpenSSLzlib等库

Node.js技术架构

image.png

什么是bindings

背景

  • 现在C/C++实现了一个http_parser库,很高效
  • 但我只会写JS,但是我想调用这个库,但直接调肯定是不行的,需要一个中间的桥梁

bindings

  • Node.js用C++对 httpparser进行封装,使其符合某些要求,封装的文件叫httpparser_bindings.cpp
  • 用Node.js提供的编译工具将其编译为.node文件*
  • JS代码可以直接requier这个.node文件
  • 这样JS就能调用C++的库,中间的桥梁这是binding
  • 由于Node.js提供了很多binding,所以加个s变成了bindings

image.png

libuv是什么?

背景

  • 每个系统都有自己的异步处理模块,但node.js之父不能为每个系统重新写一个node.js的异步处理模块,所以Rayn为了跨平台实现异步I/O库(输入输出操作:系统和其他外界交互的所有操作都是I/O),写了libuv

功能

  • 可以用于 TCP / UDP / DNS /文件等的异步操作

V8是什么?

功能

  • 将JS源代码变成机器码并执行,计算机能读懂的语言
  • 维护调用栈,确保JS函数的执行顺序
  • 内存管理,为所有对象分配内存
  • 垃圾回收,重复利用无用的内存
  • 实现JS的标准库,比如数组的方法等

注意

  • V8不提供DOM的API
  • V8本身是多线程的,但执行JS是单线程的
  • 可以开启两个线程分别执行JS
  • V8本身是包含多个线程的,如垃圾回收为单独线程
  • 自带event loop 但 Node.js 基于 libuv 自己做了一个

Event Loop是什么?

介绍Event

  • 计时器到期了
  • 文件可以读取、读取出错了
  • socket 有内容了、关闭了

什么是Loop

  • loop是循环的意思,比如while(true)循环
  • 由于事件时分优先级的,所以处理起来是分先后的
  • 所以Node.js 需要按顺序轮询每种事件
  • 这种轮询往往都是循环的,1→2→3→1→2→3

Event Loop

  • 操作系统可以触发事件,JS可以处理事件
  • Event Loop 就是对事件处理顺序的管理

事件执行循序示意图

image.png

重点阶段

  • timers检查计时器
  • poll轮询,检查系统事件
  • check检查 setlmmediate回调
  • 其他阶段用的比较少

注意

  • 大部分时间,Node.js都停在poll轮询阶段
  • 大部分事件都在poll阶段被处理,如文件、网络请求等

Node.js的API学习

官方提供给我们用的函数即为API

文档

民间版本

  • devdocs.io,进入后开启Node.js10LTS,搜索功能很方便
  • 还能开启暗黑主题,可离线

API功能

image.png

  • 白色的为不重要,黄色为重要
单词(API)含义(用途)单词(API)含义(用途)
Assertion断言用的Testing测试
Async Hooks异步用的钩子Buffer一小段缓存
Child Peocesses子进程Cluster与子进程很像
Console控制台Crypto用于加密的
Debugger调试相关DNS用nodejs访问DNS
Errors错误相关Events发布订阅模式
File System文件系统Globals全局变量
HTTP网络协议HTTP2网络协议
HTTPS网络协议Inspector检查
i18n国际化Net计算机网络
OSPath路径,对路径的操作
Performance HooksProcess进程的相关信息
Query Strings对URL的处理Readline
REPLReport
Stream流格式数据的处理Worker Threads
TimerssetTimeout等URL处理URL