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
最后更新于
这有帮助吗?