小菜
小菜
> 由于uv__io_t和uv__io_poll的强相关性,所以在这里就一起介绍了。本篇文章会通过发起一个http request,通过断点调试,详细介绍uv__io_t句柄结构体和event-loop的poll阶段 ## uv__io_t声明 从[unix.h](https://github.com/nodejs/node/blob/master/deps/uv/include/uv/unix.h#L83)切入: ```c struct uv__io_s { uv__io_cb cb; void* pending_queue[2]; void* watcher_queue[2]; unsigned int pevents; /* Pending event mask i.e. mask at next tick. */ unsigned...
> 本篇主要是对`uv_prepare_t`句柄的介绍 ## uv_prepare_t声明 还是从[uv.h](https://github.com/nodejs/node/blob/master/deps/uv/include/uv.h#L754)切入,便能找到关于`uv_prepare_t`的声明: ```c struct uv_prepare_s { UV_HANDLE_FIELDS UV_PREPARE_PRIVATE_FIELDS }; ``` 其中的私有宏`UV_PREPARE_PRIVATE_FIELDS`展开如下: ```c #define UV_PREPARE_PRIVATE_FIELDS \ uv_prepare_cb prepare_cb; \ void* queue[2]; \ ``` `uv_prepare_t`可谓是中规中矩了,只有一个回调,以及一个句柄队列指针。而这个句柄为何起名叫prepare,则是因为`uv__run_prepare`会在`uv__io_poll`阻塞进程之前运行。 ## prepare 相关api 视线转移到[loop-watche.c](https://github.com/nodejs/node/blob/master/deps/uv/src/unix/loop-watcher.c#L66)中:...
> 最近在做一个[demo](https://github.com/xtx1130/vue-ssr-demo/blob/master/package.json),由于公司项目整体是vue,所以这个demo就准备用vue ssr 来做,这篇文章主要针对vue ssr 小白,大神们可以直接忽视之。当然个人还是不建议直接上手就撸ssr,git上有很多开源的框架可以使用,也会让你事半功倍 ### 个人开发中遇到的问题 心血来潮,蹚了一下vue ssr。按照官网的步骤一步一步来的,那么问题来了: - 官网的步骤并没有完整的webpack配置文件,于是需要化身webpack配置工程师,配置好的config链接如下: [webpack.client.js](https://github.com/xtx1130/vue-ssr-demo/blob/master/build/webpack.client.js) [webpack.server.js](https://github.com/xtx1130/vue-ssr-demo/blob/master/build/webpack.server.js) 如果有需要的同学,可以直接复制粘贴拿去用了,需要注意一点:这是webpack4的配置,一定看好你的webpack版本。 - 配置搞定,在编译的时候你可能会遇到一个问题:  `url-loader`的问题,这种情况,需要你手动`npm install file-loader -D` - 一般没有语法错误的话,编译应该是可以成功的,接下来问题又来了,你的页面很有可能渲染不出来。构建产出为json文件的时候,一定记得要通过`renderer.createBundleRenderer`来构建页面,而不是`renderer. createRenderer ` - 记得在使用`renderToString `方法时候,在传context时,一定要记得把`context.url`传进去,不然的话页面路由和vue-router的路由无法匹配到一起,页面自然也不会渲染。 最后奉上项目链接:[vue-ssr-demo](https://github.com/xtx1130/vue-ssr-demo/)。按照里面readme文档的方法就可以直接在本地跑起来。
> 这篇文章主要从`net.createConnection`入手,详细讲解socket常用的connet、data、error、close等事件是如何实现的。 ## socket的创建 相信用过`net.createConnection`都比较了解了。这个API会创建一个客户端的socket链接: ```js net.createConnection(options[, connectListener]) ``` 其中`connectListener`将被添加为返回 socket 上的 'connect' 事件上的监听器。 简单了解了API,我们直奔[./lib/net.js](https://github.com/nodejs/node/blob/master/lib/net.js)来看一下是如何实现的: ```js // ./lib/net.js connect构造函数 function connect(...args) { var normalized = normalizeArgs(args); var options = normalized[0];...
> 本篇文章主要对`uv_timer_t`结构体进行展开介绍 ## uv_timer_t声明 直接从[uv.h](https://github.com/nodejs/node/blob/master/deps/uv/include/uv.h#L800)切入,很容易就能找到`uv_timer_s`结构体声明: ```c struct uv_timer_s { UV_HANDLE_FIELDS UV_TIMER_PRIVATE_FIELDS }; ``` 其中`UV_HANDLE_FIELDS`为所有句柄的抽象基础宏,在上一篇文章介绍过,在这里不做过多介绍。我们主要看一下timer的私有宏`UV_TIMER_PRIVATE_FIELDS`,由于平台的差异,我们在这里只对[unix.h](https://github.com/nodejs/node/blob/master/deps/uv/include/uv/unix.h#L304)中的timer私有宏进行介绍: ```c #define UV_TIMER_PRIVATE_FIELDS \ uv_timer_cb timer_cb; \ void* heap_node[3]; \ uint64_t timeout; \ uint64_t repeat; \...
> 本篇文章主要对`uv_handle_t`结构体进行展开介绍 ## uv_handle_t声明 直接从[uv.h](https://github.com/nodejs/node/blob/master/deps/uv/include/uv.h)切入,很容易便能找到`uv_handle_t`结构体的声明: ```c typedef struct uv_handle_s uv_handle_t; ``` ## uv_handle_s的定义 在`uv_handle_s`的定义中有如下注释: ```c /* The abstract base class of all handles. */ /* 所有句柄的抽象基类 */ struct uv_handle_s {...
> 这篇文章主要介绍nextTick和RunMicrotasks的主要流程和涉及到的相关源码,*对于timers相关api在event-loop中的表现不做解读* ### nextTick实现 目光直接转移到[next_tick.js](https://github.com/nodejs/node/blob/master/lib/internal/process/next_tick.js),整体nextTick的代码其实很容易理解: ```js const [ tickInfo, runMicrotasks ] = process._setupNextTick(_tickCallback); function nextTick(callback) { // ... nextTickQueue.push(new TickObject(callback, args, getDefaultTriggerAsyncId())); } function _tickCallback() { let tock; do {...
最近一直在跟进一个百度的开源项目,其中单测没有用我比较熟悉的`jest`,项目方用的是`ava`。在本地跑单测的时候发现一系列有意思的问题: - 使用`[email protected]`,测试命令为`ava -v`的时候,ava的错误栈是没有异常的 - 使用`[email protected]`,测试命令为`ava -v`的时候,ava的错误栈是异常的 - 使用`[email protected]`搭配`nyc`,测试命令为`nyc ava -v`的时候,ava的错误栈是异常的 - 使用`[email protected]`搭配`nyc`,测试命令为`nyc ava -v`的时候,ava的错误栈是异常的 也就是除了单独使用`[email protected]`,其余的搭配组合都是有问题的。在ava提交isssue之后,官方提供了一套issue的观光路线。我观光了一圈,了解到的大致意思就是:ava重写了`babel-register`的`source-map`,导致错误栈异常的问题。具体的解决办法就是在写代码的时候用“pure javascript”。。。不要用`babel-register`做转义。 顺带提一句,ava在`[email protected]`中内置的`babel`是用来转义测试用例,而不是源代码的,如果源代码需要转义,还是需要`babel-register`,后来我把`babel-register`换成了`esm`,还是同样的问题。。。
> os环境:macOS 10.12.5 ,ide:cLion,node版本:v8.0.0 ### 一、配置ide和node编译 对ide的配置和node编译的过程这里不赘述了,如果有时间,可能写一篇blog简单介绍一下。 ### 二、node运行入口粗读 > node入口集中在文件 [node/src/node_main.cc](https://github.com/nodejs/node/blob/master/src/node_main.cc)中,让我们在node::Start这里搭一个断点,看看接下来都会发生什么。  #### 1. argc和argv 这两个在之后的代码里会经常见到,argc表示的是命令行参数个数,而argv表示的是命令行的参数,如果没有参数那么就是node的运行的绝对地址 #### 2.platformInit运行 node运行的时候首先要走的便是[platformInit](https://github.com/nodejs/node/blob/master/src/node.cc#L4467)方法,这个方法主要是对运行平台的一些参数进行初始化:  可以看到:首先有对信号的处理(sig*),还有对系统的stdin、stdout的检测(STDIN_FILENO,STDERR_FILENO),这里截图没截全,就不一一介绍了。 #### 3.调用node::performance::performance_node_start 这里从字面就很好理解,开始对node性能进行记录,这里面有个要注意的地方是:它底层其实调用的是uv__hrtime。node有很多可以计算时间的方法,大家如果读读源码,就会发现,所有计算耗时的方法都绕不开这个api。 #### 4.调用uv_setup_args 对[uv_setup_args](https://github.com/nodejs/node/blob/master/src/node.cc#L4925)调用主要要解决的问题就是调用uv_malloc对argv的副本new_argv分配内存,并返回。说白了就是复制一份argv给process.title这个api用。 #### 5.调用Init方法...
最近被一个地方搞得很头疼,就是nextTick中为什么需要async_hooks: ```js // ./lib/internal/process/next_tick.js function _tickCallback() { let tock; do { while (tock = shift()) { const asyncId = tock[async_id_symbol]; emitBefore(asyncId, tock[trigger_async_id_symbol]); if (destroyHooksExist()) emitDestroy(asyncId); const callback = tock.callback; if...