一:node.js不是什么
1.node.js不是web框架或后端框架
所以你不能把Node.js与Flask或Spring对比
2.node.js不是编程语言
node.js并不是后端的JS,它只是以.js做后缀的
所以你不能把Node.js与Python或PHP对比
二:node.js是什么
1.node.js是一个平台
它将多种技术组合起来
让Javascript也能调用系统接口、开发后端应用
2.node.js用到了哪些技术
V8引擎
libuv
由C/C++编写实现的c-ares(DNS解析)、http-parser(解析http)、OpenSSL、zlib(加密)等库
三:node.js技术架构
--------------------------------------------------------------------------------------------------------
| Node.js API |
| http模块、fs模块、steram模块等 |
|------------------------------------------------------------------------------------------------------|
| Node.js bindings | C/C++插件 |
| 让JS和C/C++通信 | 自定义其他能力 |
|-----------------------------------------------|------------------------------------------------------|
| JS引擎 | 跨平台的异步I/O能力 | DNS解析 | 加密解密 | 其他 |
| v8 | libuv | c-ares | OpenSSl | http_parser、zlib等 |
|-------------------------------------------------------------------------------------------------------
四:什么是bindings
1.背景
C/C++实现了一个http_parser库,很高效
你只会写JS,但是你想调用这个库
直接调用肯定是不能成功的,你需要一个中间的桥梁
2.bindings
Node.js用C++对http_parser进行封装,使它符合某写要求,封装的文件叫做http_parser_bindings.cpp
用node.js提供的编译工具将其编译为.node后缀的二进制文件
JS代码可以直接require这个.node文件,比如const xxx = require("xxx"),不需要写后缀
这样JS就能调用C++库,中间的桥梁就是bindings
由于Node.js提供了很多的binding,所以加个s
这就是bindings
注意:编译成.node文件不是必须的,可以是其他的任何可行方式
五:关于C/C++插件的自定义其他能力
比如某一天我想通过node.js使用一个C/C++的库,但这个库并没有被binding到node中
如果我们能写C/C++,我们可以手动的方式将其进行绑定然后通过node.js使用
六:libuv是什么
1.背景
FreeBSD系统上有kqueue
Linux系统上有epoll
Windows系统上有IOCP
Ryan(node.js作者)如果想用不同系统上异步I/O库就得需要为不同的系统写不同的版本
于是Ryan为了实现一个跨平台的异步I/O库,开始写libuv
libuv会根据系统自动选择合适的方案
2.功能
可以用于TCP/UDP/DNS/文件等的异步操作
七:V8引擎是什么
1.功能
将JS源代码变成本地代码(机器语言,也就是0101)并执行
维护调用栈,确保JS函数的执行顺序
内存管理,为所有对象分配内存
垃圾回收,重复利用无用的内存
实现JS的标准库,如数组的splice、sort等等
2.注意
V8不提供DOM API,于是document.createElment这些API无法在node.js上使用
V8本身是包含多个线程的,如垃圾回收就是一个线程
V8执行JS是单线程的,理论上node.js可以开启两个线程分别执行JS,但这两个线程并不是真正意义上的多线程,这两个线程之间毫无瓜葛
V8本身是自带eventloop的(浏览器用的就是v8的eventloop),但node.js并没有使用这个,而是使用的是基于libuv自己的eventloop