最开始谈NodeJS的时候写过一篇文章谈了它与Java各自的优缺点。NodeJS最早的定位是什么样的呢?...正是由于NodeJS的出现,使得类似React/Vue/Angular这类前端框架大放异彩,NodeJS是这些框架开发环境的基础。...那么了解了NodeJS内部执行逻辑以后,我们可以阅读下NodeJS源码,看看require语句究竟是如何进行操作的。...首先我们下载一份NodeJS源码,require语句源码位置: node\lib\internal\modules\cjs\loader.js 首先NodeJS有定义一个构造函数Module。...还记得文章开头我讲到的NodeJS文件查找有三种处理方式,内部定义的源码就在这里。
回首对nodejs的源码研究,时间已经过去了一年多。...这是我逐渐转向nodejs方向的原因之一。也是我开始研究nodejs源码的原因之一。因为nodejs满足了我喜好和技术上的需求。...阅读nodejs源码的方式是,选择一个模块,垂直地从js层分析到c++层,然后到libuv层。...所以我也一直在寻找志同道合的人一起分析,加快对nodejs源码的研究,不过真正能啃源码的人不多。源码的阅读可能并不一定能帮助你的工作变得更好,很多时候也往往不需要深入到这种程度。...阅读nodejs源码的初衷是让自己深入理解nodejs的原理,然后也会输出一些内容,希望让大家也能从中受益。这是不容易走的路,但是,正确的、喜欢的路,慢点、难点又有什么所谓呢。
function ImmediateList() { this.head = null; this.tail = null; } 从上面的代码中我们知道,调用setImmediate函数后,nodejs...] -= refCount; immediateInfo[kHasOutstanding] = 0; } setImmediateCallback函数来自timer_wrapper.cc,我们看到nodejs...\ } 然后就会执行刚才注册的CheckImmediate,一直执行到nodejs
从上面的代码可知,active一个定时器实际上是把新建的timeout对象挂载到一个哈希队列里。我们看一下这时候的内存视图。
下面我们开始分析源码。分析完,会对上面的代码有更多的理解。 首先我们从worker_threads模块开始分析。这是一个c++模块。我们看一下他导出的功能。...; env->SetMethod(target, "getEnvMessagePort", GetEnvMessagePort); /* 线程id,这个不是操作系统分配的那个,而是nodejs...)) .Check(); /* 是否是主线程,const { isMainThread } = require("worker_threads"); 这边变量在nodejs..._parent_port和child_port是给nodejs使用的,新申请的管道是给用户使用的。 3 创建子线程。 我们看创建线程的时候,做了什么。...总结,以上就是nodejs中关于线程的基本原理,线程的实现也非常复杂,大致了解他的原理,才能更好地使用他。
我们看一下nodejs里做了什么事情。我们首先看一下connect函数的入口定义。..._onTimeout.bind(this), msecs); // 监听timeout事件,定时器超时时,底层会调用nodejs的回调,nodejs会调用用户的回调callback if...self.isPaused()) self.read(0); } } // 错误处理 } 连接成功后js层调用了self.read(0)注册等待可读事件(可参考之前的文章 记一次nodejs...更多阅读 1 记一次nodejs问题排查 2 nodejs源码分析之c++层的通用逻辑 3 libuv源码分析之stream第二篇 4 深入理解TCP/IP协议的实现之connect(基于linux1.2.13
可读流是对数据消费的抽象,nodejs中可读流有两种工作模式:流式和暂停式,流式就是有数据的时候就会触发回调,并且把数据传给回调,暂停式就是需要用户自己手动执行读取的操作。...我们通过源码去了解一下可读流实现的一些逻辑。因为实现的代码比较多,逻辑也比较绕,本文只分析一些主要的逻辑,有兴趣的可以参考文档或者自行深入看源码了解细节。...nodejs只是抽象了流的逻辑,具体的操作(比如可读流就是读取数据)是由用户自己实现的,因为读取操作是业务相关的。下面我们分析一下可读流的操作。...总结:本文就分析到这里,流的实现代码不算很难,但是非常绕,有兴趣的可以详细看源码,最后分享很久之前画的一个图(链接https://www.processon.com/view/link/5cc7e9e5e4b09eb4ac2e0688
nodejs在初始化的时候,会在check阶段插入一个节点,并注册一个回调。
定时器在nodejs里的生产者是setTimeout和setInterval。...在nodejs中setImmediate的实现使用了idle这个阶段。...可能会引起nodejs的短暂阻塞。...nodejs中setImmediate是利用这个阶段实现的,具体可以看这篇文章nodejs之setImmediate源码分析。...这就是nodejs用libuv实现的事件循环。我们首先要了解各个阶段都是处理什么的,然后把我们的任务直接或者间接地加到对应阶段的任务队列里就可以了。
上篇文章讲到nodejs创建一个服务并且建立tcp连接的过程。接下来分析一下,在建立tcp连接后,nodejs是如何解析http协议的。...我们首先看一下nodejs在建立tcp连接时执行net.js层的回调时做了什么操作。下面是核心代码。...建立tcp连接后nodejs新建了一个Socket实体。我们看一下new Socket的核心逻辑。 stream.Duplex.call(this, options); this....我们再次回到nodejs的c++代码。看一下这两个函数做了什么。...nodejs收到数据后执行 parser.execute(d);execute函数对应的是node_http_parser里的Execute。该函数进行了重载。入口是下面这个函数。
这一篇我们来看看nodejs是如何实现定时器的。14.0.0的nodejs对定时器模块进行了重构,之前版本的实现是用一个map,以超时时间为键,每个键对应一个队列。即有同样超时时间的节点在同一个队列。...3 超时时间和链表的映射 1中已经提到,超时时间一样的节点,会排在同一个链表中个,nodejs中用一个map保存了超时时间到链表的映射关系。...了解完定时器整体的组织和基础数据结构,我们可以开始进入真正的源码分析了。 我们直接从setTimeout函数开始。...nodejs在初始化的时候通过一下代码对定时器进行了初始化工作。...现在我们知道了nodejs是如何设置超时的处理函数,也知道了什么时候会执行该回调。那我们就来看一下回调时具体处理逻辑。
Null(env->isolate()), 1, &arg); if (ret.IsEmpty()) env->async_hooks()->clear_async_id_stack(); } nodejs
前几天有个同学和我说,他在看nodejs源码,但是不知道为什么需要看,也不知道从中可以学到什么。所以今天想聊一下关于阅读nodejs源码的意义。阅读其他源码也类似。...那接下来聊一下从阅读nodejs源码中,可以得到什么。 首先我们要深刻理解到nodejs是什么?大家都知道nodejs是一个js的运行时。那么到底nodejs里面有什么呢?...那么看nodejs源码的意义就很明显了。...总的来说,阅读nodejs源码最直接的是理解nodejs的工作原理和nodejs的本质。如果你是一个nodejs的开发者,这无疑是一个很好的收获。...从理论上聊了一下阅读nodejs源码的一些看法,下面顺便聊一下我自己的看法和体会。我阅读nodejs源码的原因是非常直接的,因为我希望我成为一个优秀的nodejs工程师。
FixedQueue是用来实现nextTick的。代码不多。 'use strict'; const { Array, } = primordials; ...
1.安装 gcc、gcc-c++ yum -y install gcc gcc-c++ kernel-devel 2.下载源码 https://nodejs.org/dist/v8.11.3/node-v8.11.3....tar.gz 3.解压源码 tar -xzf node-v8.11.3.tar.gz 4.编译源码 cd node-v8.11.3 .
nodejs的dns解析模块是dns.js,下面是一个使用的例子。...dns.lookup('www.a.com', function(err, address, family) { console.log(address); }); 我们根据沿着这个例子的代码看一下nodejs...onlookupall : onlookup; var err = cares.getaddrinfo(req, hostname, family, hints, verbatim); nodejs...uv_getaddrinfo(env->event_loop(),req_wrap->req(), AfterGetAddrInfo,*hostname,nullptr,&hints); 到这里我们可以看到nodejs...nodejs的通过ip和端口查找host的lookupserverce函数也是类似的原理
流的基类只提供了一个函数就是pipe。用于实现管道化。这个方法代码比较多,分开说。
_http_client.js是对http客户端的封装,当我们使用nodejs发送一个请求的时候,就会使用_http_client.js的ClientRequest。
链表的实现比较简单,有几个模块使用了这个功能,定时器就是其中一个。 'use strict'; function init(list) { list._...
nodejs支持了进程之后,又支持了线程。类似浏览器端的web worker。因为nodejs是单线程的,但是底层又实现了一个线程池,接着实现了进程,又实现了线程。...虽然底层只是对线程库的封装,但是把它和nodejs原本的架构结合起来似乎就变得麻烦起来。下面开始分析创建线程的过程。分析线程实现之前,我们先看一下线程通信的实现,因为线程实现中会用到。...nodejs中node_worker.cc实现了线程模块的功能。我们看一下这个模块的定义。...以上就是nodejs中线程的大致原理。
领取专属 10元无门槛券
手把手带您无忧上云