node学习记录(1)-node初识

Node 简介

node.js 不是什么

  • 不是web后端框架
  • 不是编程语言

node.js是什么

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

用到了哪些技术

  • V8引擎
  • libuv
  • C/C++实现的 c-ares(实现DNS 域名的解析),http-parser(解析http),OpenSSL(https),zlib(加密)等库

Node特点

单线程

  • 进程就是一个一个的工作计划(工厂中的车间)
  • 线程是计算机最小的运算单位(工厂中的工人),线程是干活的
  • 传统的服务器是多线程的,每进来一个请求,就创建一个线程去处理请求
  • Node.js的服务器是单线程的,在后台拥有一个I/O线程池

非阻塞 I/O

  • I/O:对磁盘的读写操作( Input/ Output)

  • 非阻塞:不会等I/O语句结束,而会执行后面的语句(异步)

    异步:调用者发起一个异步调用,然后立即返回去做别的事。“被调用者”通过状态、通知、回调函数等手段来通知“调用者”。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    let fs = require('fs');
    fs.readFile('/app.js',function(err,file){
    console.log('我读完文件了!);
    })
    console.log('我不会被阻塞!')

    //我不会被阻塞是在我读完文件了之前输出 =>异步调用

    //机制:进行I/O操作,给readFile绑定一个回调函数function(err,file){},并在读取textfile完成后执行回调函数。期间,后面的代码继续执行,不受I/O阻塞

事件驱动

Node.js技术架构

Node.js技术架构

stream模块

  • 第一层 可以用js直接调用的api

bingdings 让JS和C/C++通信

举例:

  • C/C++实现了一个http_parser库,但不能用JS直接调用这个库,于是需要一个中间的销量
  • Node.js用C++对该库进行封装,并用其提供的编译工具将该库编译为.node文件
  • js代码可以直接require这个.node文件
  • 实现js调用C++库,中间的桥梁–binding
  • Node.js提供了很多binding – bindings

V8 JS引擎

  • 功能
    • 将JS源代码变成本地代码并执行
    • 维护调用栈,确保JS函数的执行顺序
    • 内存管理,为所有对象分配内存
    • 垃圾回收,重复利用无用的内存
    • 实现JS的标准库
  • 注意
    • V8不提供 DOM API
    • 本身是多线程,如垃圾回收是单独线程,但执行JS是单线程的
    • 可以开启两个线程分别执行JS
    • 自带event loop,但Node.js基于liuv自己做了一个

libuv

  • 一个跨平台的异步I/O库,会根据系统自动选择合适的方案
  • I/O:对磁盘的读写操作( Input/ Output)
  • 功能:可以用于 TCP/UDP/DNS/文件 等的异步操作
    • TCP:http是基于TCPIP,能操作TCP就能做服务器
    • UDP:一般用于网页聊天
    • DNS:域名

Event Loop

什么是loop

  • loop就是循环
  • 由于事件是分优先级的,所以处理起来也是分先后的
  • node.js需要按顺序轮询每种事件
  • 这种轮询往往是循环的

Event Loop

  • 对事件处理顺序的管理

顺序示意图

Event Loop图示

  • 重点阶段
    • timers 检查计时器
    • poll 轮询,检查系统时间
    • check检查setImmediate回调
  • 注意
    • 大部分时间,Node.js都停在poll 轮询阶段
    • 大部分事件都在poll阶段被处理,如文件、网络请求

总结

  • 用libuv进行异步I/O操作
  • 用event loop管理事件处理顺序
  • 用C/C++库高效处理DNS/HTTP
  • 用bindings让JS能和C/C++沟通
  • 用V8运行JS
  • 用Node.js标准库简化JS

Node.js工作流程

Node.js工作流程图示

Node.js API

API文档

API有哪些功能

  • assersion 断言
  • testing
  • async hooks
  • *Buffer 一小段缓存
  • *Child Processes 子进程
  • *Cluster
  • *Events 发布订阅模式
  • *Debugger 调试
  • *File System 文件系统 对文件的增删改查
  • *Globals 全局变量
  • *HTTP
  • *Path 路径
  • *Process 当前进程的相关信息
  • *Query String
  • *Stream 流格式
  • *Timers
  • *URL
  • *Worker Threads node10之后才有的