Jacky's blog Jacky's blog
首页
  • 编码专题
  • 深入浅出 Vite
  • 深入浅出 babel
  • 快速上手API
  • 深入浅出 react
  • Node

    • code-notebook
  • 状态管理

    • redux
  • 前端工程化

    • Wepack
  • React源码

    • React源码
  • 组件库封装

    • 组件库
  • 开发工具

    • Vscode 插件
  • 项目展示
  • 案例中心 (opens new window)
  • First Project
  • 基础算法题
  • 链表题
  • 动态规划
  • 双指针
  • 递归
  • 数据结构
  • 前端学习计划 (opens new window)
  • 技术随笔
  • 转载文章
  • 包管理工具
  • 前端学习周报
  • VSCode插件
  • Promise 专题
  • 函数技巧
  • React 专题
  • 配置文件

    • TSCONFIG-配置 (opens new window)
    • NGINX-配置 (opens new window)
    • 正则规则查询手册 (opens new window)
    • Lint 配置 (opens new window)
  • 教程

    • GIT-教程
    • NPM SCRIPTS-工作流 (opens new window)
    • DOCKER-教程 (opens new window)
    • LERNA-教程 (opens new window)
    • GIT-常用操作整理 (opens new window)
  • VSCode

    • LAUNCH.JSON (opens new window)
  • 指令

    • NPM 指令 (opens new window)
    • NVM 指令 (opens new window)
    • Nginx 指令 (opens new window)
    • YARN 指令 (opens new window)
    • PNPM 指令 (opens new window)
  • 库

    • FS-EXTRA 库 (opens new window)
    • NODE 库-PATH (opens new window)
  • 永远的神

    • 魔法师卡颂-自顶向下学 React 源码 (opens new window)
    • 全栈潇晨 (opens new window)
    • 博客-程序员山月-Daily (opens new window)
    • 淘系前端:冴羽 (opens new window)
  • 系列文章

    • 《图解HTTP》 (opens new window)
    • 《ES6标准入门》 (opens new window)
    • 《现代JavaScript教程》 (opens new window)
    • 《深入浅出Webpack》 (opens new window)
    • VSCode 插件系列:小茗同学 (opens new window)
    • JEST 教程 (opens new window)
    • 前端精读周刊:各种精读系列 (opens new window)
    • 一文吃透系列 (opens new window)
    • 图解 REACT 原理 (opens new window)
  • 实用网站

    • MDN (opens new window)
    • CAN I USE (opens new window)
    • TYPESCRIPT-ESLint-RULES (opens new window)
    • ESLint-RULES (opens new window)
    • FRONT-END TREND (opens new window)
    • NPM TREND (opens new window)
    • 在线分析 Node 依赖 (opens new window)
    • FIND NPM (opens new window)
    • CODE PEN (opens new window)
    • 印记中文 (opens new window)
    • TOOL.LU (opens new window)
    • 阮一峰-网道 (opens new window)
    • DIGITAL OCEAN (opens new window)
    • DEVDOCS.IO (opens new window)
    • JOI (opens new window)
  • 算法

    • 小浩算法 (opens new window)
    • LABULADONG 的算法小抄 (opens new window)
    • 力扣 SOLUTION (opens new window)
    • HACKER RANK (opens new window)
    • 代码随想录 (opens new window)
  • 博客系列

    • 美团大佬 (opens new window)
    • 蜡笔小伟 (opens new window)
    • 优秀博客1 (opens new window)
    • 优秀博客2-umi (opens new window)
    • 优质博客 (opens new window)
  • CSS

    • CSS-EASING 库 (opens new window)
    • ROUGH.JS (opens new window)
    • CSS 网站收集
    • UNOCSS (opens new window)
  • 前端

    • PROMISE (opens new window)
    • UNDERSCORE.JS (opens new window)
    • study with BGM (opens new window)
    • nginx【B站视频】 (opens new window)
    • 机器学习
    • Js基础
  • 掘金已购课程

    • 前端自动化测试精讲 (opens new window)
    • 深入浅出 Vite (opens new window)
    • 现代 Web 布局 (opens new window)
    • 前端算法与数据结构 (opens new window)
    • 基于 Vite 的 SSG 框架开发实战 (opens new window)
    • SSR 实战:官网开发指南 (opens new window)
    • WebGL 入门与实践 (opens new window)
    • 玩转 CSS 的艺术之美 (opens new window)
    • 前端调试通关秘籍 (opens new window)
    • React 进阶实践指南 (opens new window)
    • TypeScript 全面进阶指南 (opens new window)
    • 前端缓存技术与方案解析 (opens new window)
    • npm scripts 前端工作流 (opens new window)
    • Webpack5 核心原理与应用实践 (opens new window)
  • 购物车

    • 张鑫旭-技术写作指南 (opens new window)
    • 深入剖析 Node.js 底层原理 (opens new window)
    • 前端开发者的现代 C++ 课 (opens new window)
    • 从前端到全栈 (opens new window)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Jacky Wang

行到水穷处,坐看云起时
首页
  • 编码专题
  • 深入浅出 Vite
  • 深入浅出 babel
  • 快速上手API
  • 深入浅出 react
  • Node

    • code-notebook
  • 状态管理

    • redux
  • 前端工程化

    • Wepack
  • React源码

    • React源码
  • 组件库封装

    • 组件库
  • 开发工具

    • Vscode 插件
  • 项目展示
  • 案例中心 (opens new window)
  • First Project
  • 基础算法题
  • 链表题
  • 动态规划
  • 双指针
  • 递归
  • 数据结构
  • 前端学习计划 (opens new window)
  • 技术随笔
  • 转载文章
  • 包管理工具
  • 前端学习周报
  • VSCode插件
  • Promise 专题
  • 函数技巧
  • React 专题
  • 配置文件

    • TSCONFIG-配置 (opens new window)
    • NGINX-配置 (opens new window)
    • 正则规则查询手册 (opens new window)
    • Lint 配置 (opens new window)
  • 教程

    • GIT-教程
    • NPM SCRIPTS-工作流 (opens new window)
    • DOCKER-教程 (opens new window)
    • LERNA-教程 (opens new window)
    • GIT-常用操作整理 (opens new window)
  • VSCode

    • LAUNCH.JSON (opens new window)
  • 指令

    • NPM 指令 (opens new window)
    • NVM 指令 (opens new window)
    • Nginx 指令 (opens new window)
    • YARN 指令 (opens new window)
    • PNPM 指令 (opens new window)
  • 库

    • FS-EXTRA 库 (opens new window)
    • NODE 库-PATH (opens new window)
  • 永远的神

    • 魔法师卡颂-自顶向下学 React 源码 (opens new window)
    • 全栈潇晨 (opens new window)
    • 博客-程序员山月-Daily (opens new window)
    • 淘系前端:冴羽 (opens new window)
  • 系列文章

    • 《图解HTTP》 (opens new window)
    • 《ES6标准入门》 (opens new window)
    • 《现代JavaScript教程》 (opens new window)
    • 《深入浅出Webpack》 (opens new window)
    • VSCode 插件系列:小茗同学 (opens new window)
    • JEST 教程 (opens new window)
    • 前端精读周刊:各种精读系列 (opens new window)
    • 一文吃透系列 (opens new window)
    • 图解 REACT 原理 (opens new window)
  • 实用网站

    • MDN (opens new window)
    • CAN I USE (opens new window)
    • TYPESCRIPT-ESLint-RULES (opens new window)
    • ESLint-RULES (opens new window)
    • FRONT-END TREND (opens new window)
    • NPM TREND (opens new window)
    • 在线分析 Node 依赖 (opens new window)
    • FIND NPM (opens new window)
    • CODE PEN (opens new window)
    • 印记中文 (opens new window)
    • TOOL.LU (opens new window)
    • 阮一峰-网道 (opens new window)
    • DIGITAL OCEAN (opens new window)
    • DEVDOCS.IO (opens new window)
    • JOI (opens new window)
  • 算法

    • 小浩算法 (opens new window)
    • LABULADONG 的算法小抄 (opens new window)
    • 力扣 SOLUTION (opens new window)
    • HACKER RANK (opens new window)
    • 代码随想录 (opens new window)
  • 博客系列

    • 美团大佬 (opens new window)
    • 蜡笔小伟 (opens new window)
    • 优秀博客1 (opens new window)
    • 优秀博客2-umi (opens new window)
    • 优质博客 (opens new window)
  • CSS

    • CSS-EASING 库 (opens new window)
    • ROUGH.JS (opens new window)
    • CSS 网站收集
    • UNOCSS (opens new window)
  • 前端

    • PROMISE (opens new window)
    • UNDERSCORE.JS (opens new window)
    • study with BGM (opens new window)
    • nginx【B站视频】 (opens new window)
    • 机器学习
    • Js基础
  • 掘金已购课程

    • 前端自动化测试精讲 (opens new window)
    • 深入浅出 Vite (opens new window)
    • 现代 Web 布局 (opens new window)
    • 前端算法与数据结构 (opens new window)
    • 基于 Vite 的 SSG 框架开发实战 (opens new window)
    • SSR 实战:官网开发指南 (opens new window)
    • WebGL 入门与实践 (opens new window)
    • 玩转 CSS 的艺术之美 (opens new window)
    • 前端调试通关秘籍 (opens new window)
    • React 进阶实践指南 (opens new window)
    • TypeScript 全面进阶指南 (opens new window)
    • 前端缓存技术与方案解析 (opens new window)
    • npm scripts 前端工作流 (opens new window)
    • Webpack5 核心原理与应用实践 (opens new window)
  • 购物车

    • 张鑫旭-技术写作指南 (opens new window)
    • 深入剖析 Node.js 底层原理 (opens new window)
    • 前端开发者的现代 C++ 课 (opens new window)
    • 从前端到全栈 (opens new window)
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 技术随笔

    • git教程
    • 前端模块化:CommonJS,AMD,CMD,ES6
    • 如何动态加载本地图片
    • GitHub自动部署脚本
    • React生命周期详解
    • 将父组件的props作为组件的初始state的几种方案
    • webpack基础入门
    • StackOver记录:如何在function中使用redux
    • React中使用onClick时的三种性能优化
    • 思考React状态管理
    • forEach/for..in/of
    • styled-components使用记录
    • 深入理解forEach与forof
    • Node技术架构
      • 0.前言
      • 1.Node技术架构
        • 技术架构图
        • 第一层:Node API
        • 第二层:bindings|C++
        • 第三层:见github Node.js 的deps目录
      • 2. libuv和v8简介
        • libuv库
        • V8库
      • 3.EventLoop
      • 4.面试中常考的一道问题
      • 5. 🚨注意
      • 总结
      • 补充资料:浏览器内核
      • 参考资料
    • Redux、Mobx状态管理杂谈
    • JS中的类型检测
    • 如何判断图片是否在可视区域
    • 如何使用图片的懒加载操作
    • JavaScript模块化:从CommonJS到AMD
    • git查看:修改用户名、密码
    • 保持数据Immutable的几种写法
    • 如何实现一个Promise.all
    • resolve(Promise对象)会多出两个微任务
    • todo_基于Mocha的测试驱动开发
    • 浏览器页面渲染机制
    • todo-响应式编程之数据劫持
    • todo-immer库的介绍
    • React-Hooks 基础原理解析
    • JS基本功
    • 函数闭包与this指针
    • 收集 DUMI 配置过程中遇到的问题
    • typescript 类型工具
    • 统一接口的导入导出
    • 网络安全:如何预防 XSS 攻击
    • 浏览器页面渲染机制【2023】
    • 跨域资源请求
    • 浏览器事件循环机制
    • 如何理解浏览器的 user agent 用户代理的含义?
  • 转载文章

  • Mac相关

  • 前端学习周报

  • 包管理工具

  • 技术随笔
  • 技术随笔
wangjiasheng
2022-01-03
目录

Node技术架构

# 0.前言

在转载文章《setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop》 (opens new window)已经对EventLoop讲解的很通透了。

只是,文章在其中一小节 #JS异步是怎么实现的 仅举例说明了在浏览器中是如何处理异步事件,而没有对Node.js做出详细的说明。

同时,根据蒋鹏飞的文章我们又了解到浏览器和 Node 中的 EventLoop是不同的,这又是怎么回事吗?难道在Node 除了v8引擎外,还封装了一个异步事件处理机制吗?

答案:是的。

实际上Chrome浏览器的异步实现机制是借助V8引擎的能力,而要介绍 v8引擎,又绕不开对 Node.js 技术架构的分析。

# 1.Node技术架构

# 技术架构图

# 第一层:Node API

在Node.js有许多官方实现的函数库,如http模块、fs文件读取模块、stream流模块等。

通过Node.js提供的标准库,我们很清晰的能够感觉到Node主要特性就是提供对数据流异步执行的方式。

# 第二层:bindings|C++

我们先来看下的场景:

  1. 现在市面上已经有一个C/C++实现的库http_parser,很高效。
  2. 我们只会JS,不会也不想学JS,但是又想拥有这个库的能力。

那有没有办法能?有,就是通过这里的bindings实现的。

Node.js bindings是什么?它是连接JS和C/C++通信的一座桥梁。

即,我们既可以通过JS去调用C++代码,也可以在C++中使用JS代码。

参考资料:

  1. JS如何调用C++代码 (opens new window)
  2. C++调用JS回调 (opens new window)

# 第三层:见github Node.js 的deps目录

这一层主要介绍Node的一些依赖库,这里重点关注两个库:libuv 和 v8。

Node.js v0.10/deps

image-20220103162149632

# 2. libuv和v8简介

# libuv库

在不同系统上,对异步的实现是各不相同的,如:

  • FreeBSD系统:kqueue

  • Linue系统:epoll

  • Windows系统:ICOP

而libuv则是一个跨平台的异步I/O库,它会根据系统自动选择合适的方案。

# V8库

也就是Chrome浏览器内置的JS解析器,它除了可以执行JS外,可附带以下功能:

  1. 将JS源代码变为本地代码
  2. 维护调用栈,确保JS函数的执行顺序。
  3. 内存管理
    • 给所有对象分配内存
    • 垃圾回收:将不用的内存资源回收,再分配。
  4. 实现JS的标准库(第一层Node提供的API)

# 3.EventLoop

基于对Node.js技术架构分析。

JS的异步执行首先需要分清楚执行环境是:浏览器(V8) 还是 Node。

  • 在浏览器环境中,实际上调用的是v8中对异步的调用,可分为:

    • 宏任务: macroTask

    • 微任务:microTask

      PS:终于知道微软为啥叫microsoft了,记住micro前缀。

  • 而在Node环境中,虽然也集成了v8,但是异步处理使用的libuv的异步I/O跨平台实现,对不同的异步事件分的执行优先级区分更细,有六个阶段,这里与前端有关的主要有三个:

    timers(执行定时器回调) →\rightarrow→ poll(停留) →\rightarrow→ check(setImmediate)

# 4.面试中常考的一道问题

考题:setTimeout与setImmediate到底谁快谁慢。

答:不确定,在同步函数执行阶段,我感觉setTimeout会快些(误:纯个人理解记忆) 。在回调函数等执行函数中,setImmediate快。

这一部分请详细看:转载文章《setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop》

# 5. 🚨注意

  1. Node不是一门后端编程语言,不是一个web框架

    正确的表述:Node.js是一个平台,让JavaScript能调用系统接口、开发后端应用。

  2. Node中的线程知识补充:

    我们知道浏览器中渲染进行可以分为以下线程

    那V8中与浏览器的线程的不同在于:

    • V8缺少DOM API,DOM是浏览器提供的。

    相同的在于:

    • V8执行JS是单线程,本身多线程,如垃圾回收线程。

# 总结

本篇博文主要是转载文章的补充,核心观点是:

  • 浏览器的异步处理:取决于 v8
  • Node的异步处理:取决于libuv

# 补充资料:浏览器内核

在本文中,默认v8是浏览器的内核其实是不严谨的,这边附上常见浏览器JS引擎和内核的列表(不完全):

公司 浏览器 JS引擎 渲染引擎
Microsoft IE6-8 JScritp Trident
IE9-11 Chakra Trident
Edge Chakra Edge
Mozilla Firefox JagerMonkey Gecko
Google Chrome V8 Blink
Apple Safari Webkit SquirrelFish Extreme
Opera Opera12.16+ Blink Carakan

# 参考资料

  1. 《setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop》 (opens new window)

  2. 饥人谷-方应杭:《EventLoop、计时器、nextTick》 (opens new window)

编辑 (opens new window)
#eventLoop
上次更新: 2022/04/06, 15:04:00
深入理解forEach与forof
Redux、Mobx状态管理杂谈

← 深入理解forEach与forof Redux、Mobx状态管理杂谈→

最近更新
01
如何理解浏览器的 user agent 用户代理的含义?
11-05
02
浏览器事件循环机制
10-31
03
浏览器页面渲染机制【2023】
10-15
更多文章>
Theme by Vdoing | Copyright © 2020-2023
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式