最开始谈NodeJS的时候写过一篇文章谈了它与Java各自的优缺点。NodeJS最早的定位是什么样的呢?...那么了解了NodeJS内部执行逻辑以后,我们可以阅读下NodeJS源码,看看require语句究竟是如何进行操作的。...首先我们下载一份NodeJS源码,require语句源码位置: node\lib\internal\modules\cjs\loader.js 首先NodeJS有定义一个构造函数Module。...还记得文章开头我讲到的NodeJS文件查找有三种处理方式,内部定义的源码就在这里。...很多人觉得有事没事扯源码目的就是提高逼格,其实读读源码我们可以学到很多东西,我们可以学习别人优美的代码书写,学习别人对设计模式的熟练使用,或者对整个系统架构的布局。对我们技术提升是有非常大的帮助的。
起初准备好好研究下Spring这个框架,下载了源码,结合书籍准备一探究竟,看到了Spring如何加载bean,又如何转换成自己的数据格式等等,虽尚未涉及实战,倒算是对之前工作中遇到的一些困惑有所帮助。...可是后来,和一些小伙伴讨论,可以考虑最近杀出来的黑马nodejs,甚是抢眼。基本的出发点是nodejs语法与javascript一致,正好借着这个机会学习下js,也算是对于js从另一个角度好好认识下。...就是一个小白,当然对于nodejs连小白都算不上。...虽然之前有拜读过《javascript权威指南》以及学习过Angularjs,但是终究因为缺乏应用场景,始终与js的关系是若即若离。 ...关于nodejs的语法,无非就是js。当然在我看来还是需要时间来熟悉node这种相较java有很大的“随意性”和不可思议的特性。
看到这里你肯定要说,又是一个要把Nodejs吹上天的文章!NoNo,本文会一步一步的说明我是怎么学会和用上nodejs的,然后结合其我所了解的语言告诉各位我所了解的Nodejs坑和优势。...学习基础 先说说本人开始学习使用的基础。早期在某外企开发室内3D设计软件,那段时间用已经成为古董的MFC做各种windows事件驱动开发。 ...在随后的许多时光中,深入且大量的学习了前端开发的所有东西,从一穷二白只会用div画画静态页面,到后面自己封装列表、消息通知等组件,通杀jquery、angularjs,了解各种脚手架。...所以学习Nodejs开发,我基本上是没有语言障碍的,只是需要跟上它的思路。 安装Nodejs 要用一样东西之前,当然是要先安装环境。...测试nodejs:输入node打开REPL,然后使用log打印数据: $ node > console.log("hello nodejs!"); hello nodejs!
回首对nodejs的源码研究,时间已经过去了一年多。...这是我逐渐转向nodejs方向的原因之一。也是我开始研究nodejs源码的原因之一。因为nodejs满足了我喜好和技术上的需求。...我首先从libuv开始研究,因为libuv是nodejs的核心之一。因为曾经研究过一些linux的源码,也一直在学习操作系统的一些原理和实现,所以在阅读libuv的时候,算是没有遇到太大的困难。...通过早期版本,先学习v8的大概原理和一些早期实现上的细节。...第三是提高了你的学习能力,当你对底层原理有了更多的了解和理解,你在学习其他技术的时候,就会更快地学会,比如你了解了epoll的实现,那你看nginx、redis、libuv等源码的时候,关于事件驱动的逻辑
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
1、module.exports+require很好用,可以用来做全局变量,比如在a.js中require了一个js,并且修改了这个js的一个属性,然后b.js...
可读流是对数据消费的抽象,nodejs中可读流有两种工作模式:流式和暂停式,流式就是有数据的时候就会触发回调,并且把数据传给回调,暂停式就是需要用户自己手动执行读取的操作。...我们通过源码去了解一下可读流实现的一些逻辑。因为实现的代码比较多,逻辑也比较绕,本文只分析一些主要的逻辑,有兴趣的可以参考文档或者自行深入看源码了解细节。...nodejs只是抽象了流的逻辑,具体的操作(比如可读流就是读取数据)是由用户自己实现的,因为读取操作是业务相关的。下面我们分析一下可读流的操作。...总结:本文就分析到这里,流的实现代码不算很难,但是非常绕,有兴趣的可以详细看源码,最后分享很久之前画的一个图(链接https://www.processon.com/view/link/5cc7e9e5e4b09eb4ac2e0688
为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。
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源码的意义就很明显了。...所以我们可以从libuv中学习到实现一个服务器用到的技术。...额外地,你也可以学习到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函数也是类似的原理
领取专属 10元无门槛券
手把手带您无忧上云