深入出不来nodejs源码-events模块】的更多相关文章

这一节内容超级简单,纯JS,就当给自己放个假了,V8引擎和node的C++代码看得有点脑阔疼. 学过DOM的应该都知道一个API,叫addeventlistener,即事件绑定.这个东西贯穿了整个JS的学习过程,无论是刚开始的自己获取DOM手动绑,还是后期vue的直接@click,所有的交互都离不开这个东西. 同样,在node中,事件绑定也贯穿了整个框架.基本上大多数的内置模块以events为原型,下面的代码随处可见: EventEmitter.call(this); 不同的是,页面上DOM的事…
鸽了好久,最近沉迷游戏,继续写点什么吧,也不知道有没有人看. 其实这个node的源码也不知道该怎么写了,很多模块涉及的东西比较深,JS和C++两头看,中间被工作耽搁回来就一脸懵逼了,所以还是挑一些简单的吧! 这一篇选的是定时器模块,简单讲就是初学者都非常熟悉的setTimeout与setInterval啦,源码的JS内容在目录lib/timers.js中. node的定时器模块是自己单独实现的,与Chrome的window.setTimeout可能不太一样,但是思想应该都是相通的,学一学总没错.…
终于可以填上坑了. 简单回顾一下之前JS篇内容,每一次setTimeout的调用,会在一个对象中添加一个键值对,键为延迟时间,值为一个链表,将所有该时间对应的事件串起来,图如下: 而每一个延迟键值对的触发,则是在链表头生成的时候就已经开始了,如下: function TimersList(msecs, unrefed) { //... // 来源于C++内置模块 const timer = this._timer = new TimerWrap(); /// ... // 触发 timer.st…
原本打算是把node源码看得差不多了再去深入V8的,但是这两者基本上没办法分开讲. 与express是基于node的封装不同,node是基于V8的一个应用,源码内容已经渗透到V8层面,因此这章简述一下我目前理解的V8引擎吧. 首先需要理解的是V8是一个JS代码运行平台,可以将JS代码编译执行. 本节就非常浅显的讲一下V8内部一些常见类,以及一个运行JS代码的简单demo. (由于研究V8引擎原理的人非常多,本人学识浅薄,可以去参考别人的博客) 参考资料: 1.很多大佬的博客 2.V8引擎API文…
整整弄了两天,踩了无数的坑,各种奇怪的error,最后终于编译成功了. 网上的教程基本上都过时了,或者是版本不对,都会报一些奇怪的错误,这里总结一下目前可行的流程. node版本:v10.1.0. 首先需要一些准备工作: 1.Visual Studio 2017 传送门:https://www.visualstudio.com/zh-hans/downloads/ 2.python2.7 传送门:https://www.python.org/downloads/release/python-27…
node的源码分析还挺多的,不过像我这样愣头完全平铺源码做解析的貌似还没有,所以开个先例,从一个API来了解node的调用链. 首先上一张整体的图,网上翻到的,自己懒得画: 这里的层次结构十分的清晰,从上到下如果翻译成语言层面,依次是JS.C++.windows(UNIX)的系统API. 最高层也就是我们自己写的JS代码,node会首先通过V8引擎进行编译解析成C++,随后将其分发给libuv,libuv根据操作系统的类型来分别调用底层的系统API. 下面通过fs.stat这个API来一步步探索…
我发现每次细看源码都能发现我之前写的一些东西是错误的,去改掉吧,又很不协调,不改吧,看着又脑阔疼…… 所以,这一节再探,是对之前一些说法的纠正,另外再缝缝补补一些新的内容. 错误在哪呢?在之前的初探中,有这么一块代码: // The bootstrapper scripts are lib/internal/bootstrap/loaders.js and // lib/internal/bootstrap/node.js, each included as a static C string…
重新审视了一下上一篇的内容,配合源码发现有些地方说的不太对,或者不太严谨. 主要是关于内置模块引入的问题,当时我是这样描述的: 需要关注的只要那个RegisterBuiltinModules方法,从名字也可以看出来,就是加载内置模块. 然而并不是啊……从名字可以看出来,这只是一个注册方法. Register:登记.注册. 因此,这里并不会真正加载内置模块,而只是做一个登记,表示有哪些模块一会要加载,统计一下. 上一节简单看了下该方法的宏,是一个_register_XX方法的批量调用,而该方法的定…
花了差不多两周时间过了下primer C++5th,完成了<C++从入门到精通>.(手动滑稽) 这两天看了下node源码的一些入口方法,其实还是比较懵逼的,语法倒不是难点,主要是大量的宏造成直接阅读上的不方便. 有些宏感觉真是一点鸟用都没有,比如说: #define LIKELY(expr) expr #define UNLIKELY(expr) expr #define PRETTY_FUNCTION_NAME "" 这玩意翻译成JS大概就是: const LIKELY…
在Orchard CMS的官网已经提供了文档说明如何打包,但是如果使用它的打包方式,打好的nuget包是带源代码的.如果是为开源系统写模块,不需要关注源代码是否可见.但是如果是用Orchard CMS作为商业用途,那么可能你需要阅读这边文章啦. 1.获取打包文件的原理: 简单说一下Orchard打包模块获取需要打包的文件的原理:控制台传入模块名称,通过找到对应模块的.csproj来分析需要打包的文件,每个.csproj中的ItemGroup节点下的文件就是需要打包的文件 所有的文件名和地址都封装…