📔
饥人谷前端体系课程笔记
黑马程序员笔记前端面试押题前端精进
  • 课程大纲
  • Git入门
    • 3. 软件安装详解
    • 4. Mac环境搭建
    • 5. 命令行入门
    • 6. 本地仓库
    • 7. Git远程仓库-GitHub
  • HTML全解
    • 8. HTML概览
    • 9. HTML标签
    • 10. HTML重难点
    • 11. HTML实践 & 手机调试
  • CSS全解
    • 12. CSS基础
    • 13. CSS布局(上)
    • 14. CSS布局(下)
    • 15. CSS定位
    • 16. CSS动画
  • HTTP全解
    • 17. URL 是什么
    • 18. 请求和响应 & Node.js Server
  • JS全解
    • 19. JavaScript概览
    • 20. 内存图与JS世界(精品课)
    • 21. Canvas 实践—画图板
    • 22. JS语法
    • 23. JS数据类型
    • 24. JS 对象
    • 25. JS 对象分类
    • 26. JS 数组
    • 27. JS 函数
    • 28. JS 实战,会动的代码
    • 29. JS运算符
    • 30. JS总结
  • JS编程接口
    • 31. DOM编程
    • 32. 手写DOM库
    • 33. JQuery中的设计模式(上)
    • 34. JQuery中的设计模式(下)
    • 35. DOM事件与事件委托
  • 项目 前端导航站点
    • 前端导航项目笔记
  • 前后分离
    • 40. AJAX的原理
    • 41. 异步与Promise
    • 42. 跨域、CORS、JSONP
    • 43. 静态服务器
    • 44. AJAX实战:Cookie、Session
  • JS进阶MVC
    • 48. MVC(上)
    • 49. MVC(中)
    • 50. MVC(下)
  • 项目构建
    • 51. Webpack(上)
    • 52. Webpack(下)
  • 算法与数据结构
    • 62. 伪代码与流程图
  • React全解
    • 75. React起手式
    • 76. React类组件和函数组件
    • 77. Class组件详解
    • 78. 函数组件
    • 79. Hooks原理解析
    • 80. Hooks各个击破
    • 81. 精通Redux
  • Node.js
    • 84. Node.js技术架构
    • 85. 文件模块
    • 86. 单元测试之文件模块
    • 87. 调试 Node.js 程序
    • 88. 静态服务器
    • 89. 命令行翻译工具
    • 90. 操作数据库
    • 91. 数据库基础知识
    • 92. Stream 流
    • 93. child_process
    • 94. 总结
  • TypeScript
    • 112. 基础
    • 113. 泛型
  • Next.js全解
    • Next.js 上
    • Next.js 下
  • ES6精讲
    • Promise,async/await
  • 大屏可视化笔记
    • 大屏可视化项目
  • SCSS全解
    • SCSS全解
  • 拓展
    • 一次性弄懂性能优化
    • Web性能优化
由 GitBook 提供支持
在本页
  • Node.js安装
  • 周边工具
  • Node.js 不是什么
  • Node.js是什么
  • Node.is技术架构
  • 什么是bindings
  • JS与C++交互
  • Node.js工作流程
  • Node.js v0.10的deps目录
  • libuv是什么
  • V8是什么
  • Event Loop 是什么
  • 举例
  • Event Loop
  • 总结
  • 回顾Node.js 技术架构
  • Node.js API
  • API到底有哪些功能
  • 学习路线

这有帮助吗?

  1. Node.js

84. Node.js技术架构

Node.js 基础 前端精进-后端方向

Node.js 版本 双数是稳定版,单数非稳定版,我们使用8以上版本

Node.js安装

Windows

去官网下载安装包 (不要绿色版) 一路下一步,默认配置即可 安装为了注销账户(可选) 确认命令行里node-v不出错即可 不方便安装多版本,可以考虑子系统

Mac

安装homebrew brewinstall node@8 或者10 确认node-v不出错即可 如果你需要多版本,可以使用n或nvm两种工具

周边工具

推荐安装如下工具

nrm用于切换下载源 yarn和yrm WebStorm或者VSCode tS-node可以运行TypeScript的node

Windows

Notepad++临时打开文件,比VSCode快 cmder可以作为Git Bash的代替品

macOS

iTerm2.app oh my zsh

Node.js 不是什么

不是web 框架

Node.js 并不是web后端框架

所以你不能把 Node.js与Flask或Spring对比

不是编程语言语言

Node.js 并不是后端的 JS

所以你不能把 Node.js与Python 或 PHP 对比

Node.js是什么

是一个平台

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

Node.js 用到了哪些技术

V8引擎 libuv(原本是nodejs的作者写给自己用的) C/C++实现的c-ares(域名解析)、 http-parser(解析http)、 OpenSSL(解析https), zlib(加密) 等库

Node.is技术架构

什么是bindings

背景

C/C++实现了一个http_ .parser 库,很高效 你只会写JS,但是你想调用这个库 直接调用肯定是不能成功的,你需要一个中间的桥梁

bindings

  • Node.js用C++对http_ parser进行封装,使它符合某些要求,封装的文件叫做http_ parser_ bindings.cpp

  • 用Node.js提供的编译工具将其编译为.node文件*

  • JS代码可以直接require这个.node文件

  • 这样JS就能调用C++库,中间的桥梁就是binding

  • 由于Node.js提供了很多binding,所以加个S

  • 这就是bindings

编译成.node文件不是必须的,可以是其他的任何可行方式

JS与C++交互

Node.js还提供了其他交互方式,我这里只举一例

Node.js工作流程

Node.js v0.10的deps目录

deps目录下就是依赖的库

libuv是什么

背景

FreeBSD系统上有 kqueue

Linux系统上有 epoll

Windows系统上有 IOCP

Ryan为了一个跨平台的异步I/O库,开始写 libuv

libuv会根据系统自动选择合适的方案

功能

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

V8是什么

功能

将JS源代码变成本地代码并执行

维护调用栈,确保JS函数的执行顺序

内存管理,为所有对象分配内存

垃圾回收,重复利用无用的内存

实现JS的标准库

注意

V8不提供DOM API

V8执行JS是单线程的

可以开启两个线程分别执行JS

V8本身是包含多个线程的,如垃圾回收为单独线程

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 就是对事件处理顺序的管理

举例

三种不同的事件

setTimeout(f1, 100) fs.readFile('/1.txt', f2) server.on('close', f3)

如果同时触发,Node会怎么办

肯定会有某种顺序(优先级) 这种顺序应该是认为规定的

Event Loop

顺序示意图 我翻译过官方文档 读官方文档是最好的方式

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

注意

大部分时间,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文档

官方地址

英文文档 nodeis.org/api/ 中文文档 nodejs.cn/api/

民间版本

API到底有哪些功能

Assertion(断言,用来测试代码) HTTP Stream(流格式,重点讲) Testing HTTP/2 String Decoder Async Hooks HTTPS Timers(重点讲) Buffer(一小段缓存) Inspector TLS/SSL

Child Processes(子进程) i18n Trace Events

Cluster(集群) Net TTY

Console OS UDP/Datagram

Crypto(加密) Path(获取路径) Debugger(调试) Performance Hooks URL DNS Process(当前进程的相关信息,比如进程号) Utilities Errors Query Strings(做http的时候,对URL的处理) V8 Events Readline VM File System REPL Worker Threads*(Node 10之后才有的,Node 8是没有的) Globals(全局变量) Report Zlib

上面加粗的是常用的模块

学习路线

基础-Web-框架

先学基础(就是上面提到的API),以任务为导向学习 逐个学习文件、HTTP、Stream 等模块 再学Web,学习数据库、AJAX相关知识 最后学框架,以项目为导向学习 以Express为切入点,制作完整的网站

还有一个叫koa

三个约定 希望大家记笔记,写博客 CRM(copy run modify)学习法贯穿整个学习过程 学习我的调试工具和思路

下节课开始 Node.js 编程 再见

参考文档 C++ binding with Node.js

Understanding Worker Threads in Node.js

上一页Node.js下一页85. 文件模块

最后更新于2年前

这有帮助吗?

截屏2023-04-16 上午2.08.27

随着Node.js的版本已经从0.8升级到12. 11.1,其架构也在一直变化中 如果你要看源代码,推荐看0.10版本 因为这一版使用 了很久一段时间, 而且源代码比 最新版少很多 如果你想了解更多,可以看

JS调用C++代码 C++调用JS回调

截屏2023-04-16 上午2.10.24
截屏2023-04-16 上午2.10.38
截屏2023-04-16 上午2.20.48

我们大部分时候,只需要学习Node.js标准库即可 对于其他模块,有一个大概的了解就行 等你对 Node.js内部实现感兴趣的时候,再去了解标准库之外的东西 不过你可能要写学好 C/C++

进入之后开启Node.js10LTS 搜索功能非常方便 可开启暗黑主题 可离线观看

yihjstz/deep-into-node
官方示例
官方示例
devdocs.io
截屏2023-04-16 上午2.14.31