什么是node.js?
node.js不是框架,也不是js的语言,而是一个平台,有多个技术组合起来。
每个版本更新可能就是针对某个工具的更新或是新增或是删除某一工具。
包含的工具有:
- V8引擎
- libuv
- 由C/C++实现的
- c-ares
- http-parser
- OpenSSL
- zlib
架构如图所示:
什么是bindings?
可以借助这个平台,让JS执行C/C++的函数,并且C/C++也能执行JS的函数,大大扩展了JS的可能性。
例如:
- 有个由C/C++实现的http_parser库,这个库特别好,JS想要去调用这个库,于是Node.js会去封装这个库(文件名:http_parser_bindings.cpp)
- 然后node.js会编译,后缀为
.node
文件。 - JS就可以require这个.node文件。
- 在这两者之间的桥梁是binding,而且node.js提供了很多这样的binding。
以上例子不是唯一的方式,node还有其他方式可以让JS调用C/C++。
这样的binding,node.js提供了很多,所以这个工具就加了个s,名为Nodejs bindings。
当然,有些功能Node.js没有提供,但我们可以自己去学习C/C++自己写一个node.js插件使用。也就是自定义其他能力。
V8引擎是什么?
是JS的引擎,可将JS源代码变成本地代码(1和0的形式)并执行,执行速度飞快。
并把ECMAScript的标准实现,因此JS才可以执行。
因为V8是多线程的,但在执行JS是单线程的,所以只有一个调用栈,也因此确保了JS的执行顺序。注意,Node.js本身是多线程的,而V8在执行JS的时候是单线程的。
:::success
想法:
JS是单线程的,那setTimeout和AJAX是怎么回事?因为,在setTimeout或AJAX与Promise配合后,就会产生一些很烧脑的情况。而且,setTimeout与AJAX不是由JS提供的,是浏览器(DOM也是)提供的。于是根据上面的JS是单线程这样的说法,由此猜测:
setTimeout与AJAX是否额外的开启别的线程执行?
参照答案:https://www.jianshu.com/p/8821c6432fe1
:::
V8可以为所有的对象分配内存,并实现垃圾回收。这个垃圾回收,也是V8的一个单线程,涉及了diff算法等一系列算法遍历所有无用的内存来实现回收重复利用。
V8还自带event loop,但Node.js基于libuv实现了一个。