2.3.2 C/C++核心模块的编译过程
- node_module_struct
struct node_module_struct {
int version;
void *dso_handle; // 无类型指针
const char *filename;
// v8::Handle是指v8的内存管理,在新的版本中,v8::handle 拆成了更为形象的
// 两个类:v8::Local 和 v8:Persistent
// All objects returned from [v8](https://v8docs.nodesource.com/node-0.8/d2/dc3/namespacev8.html) have to be tracked by the garbage collector so that it knows that the objects are still alive. Also, because the garbage collector may move objects, it is unsafe to point directly to an object. Instead, all objects are stored in handles which are known by the garbage collector and updated whenever an object moves. Handles should always be passed by value (except in cases like out-parameters) and they should never be allocated on the heap
// 指向register_func的指针
void (*register_func) (v8::Handle<v8::Object> target);
const char *modname;
};
- 宏
NODE_MODULE
## 连接 modname和 _module
modname ## _module
// #ifndef 如果没有引进来就定义,如果引进了,就废除用新定义的
#ifndef NODE_HELLO_H_ #define NODE_HELLO_H_ #include <v8.h>
namespace node {
// 定义方法
v8::Handle<v8::Value> SayHello(const v8::Arguments& args);
} #endif
3, 异步I/O
1. 如果脚本的执行时间超过100ms,则用户就会感觉到页面卡顿
2. 事件循环这里的存在关联的回调函数就是对应的事件订阅,类似于在网页上点了一个按钮,就是相当于产生了一个事件,然后查看到有对应的点击处理函数,然后就去处理。
3.3.5 其实就是通知再通知,先是通知我定义了一个异步事件啊,需要哪些数据,你帮我去取啊,然后等待别人取完了,别人帮着我利用我第一次传过去的获取数据成功的回调函数执行。
3.4.1
红黑树是一种平衡的二叉树,
主要一下特征
1.节点是红色或黑色。
2.根节点是黑色。
3.每个叶子节点都是黑色的空节点(NIL节点)。
4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
settimeout 和setIntelval会被插入的到红黑树中,其实就是一个查找序列,当tick执行的时候,从这里查找出一个定时器来执行
3.4.2 采用定时器因为需要查找红黑树,所以时间为O(lg(n)),nextTick()因为放入到一个数组中,从数组中取是0(1)的时间,所以相对来说nextTick更快一些
4.3
异步编程解决方案
1, 发布订阅
2, promise
3,流程控制库
4.3.1
偏函数就是返回函数的函数
4.3.2
恶魔金字塔无非是让写法上优雅些,形成链式的调用,其实里子还是一样的
4.3.3
流程控制库
异步调用的异步处理,
这里// arg1 => file2.txt 应该是file1.txt吧
协程: 本质上协程就是用户空间下的线程
5.4.1