读nodejs源码的正确打开方式是什么?
发布于 6 年前 作者 gyj1278 10832 次浏览 来自 问答

之前看到社区有人说,想了解nodejs的事件循环机制,把源码down下来,在不明白的地方打上console.log(),编译源码就都清楚了。首先这样真的可以吗?其次,我试着编译了一下源码,时间很长,要等很久。求教各位,读nodejs源码,甚至于调试编译的合理方法。还有一个事情很好奇,nodejs的开发者每开发一个新功能或者改bug都需要全部编译来测试吗?这不得等的急死了哟!

26 回复

为什么要编译?直接启动不就可以了

在不明白的地方打上console.log()

真吊。。。这人确定读过?

node的源码分为C++和JavaScript两部分,如果你想调试C++的源码,必须重新编译整个node使其能debug,然后进入调试模式一步步来;如果只想调试JavaScript源码,大部分时候你只需要用ide进入调试模式即可,只有少数JavaScript代码(例如bootstrap_node.js)就算打上断点也是无法调试,想看中间的信息必须修改源码加上console.log()然后重新编译整个node才行。说到源码调试,2楼的@xtx1130就是大牛啊,你看下他的精华帖保证你有收获。

C++那部分的源码涉及v8 ,libuv和一系列系统编程知识,要读懂真不容易,有这个空还不如复习一下高数转AI,呵呵。

建议把 @youth7 @xtx1130 两位的源码分析文章仔细阅读下,读源代码要有耐心,一遍两遍可能都是云里雾里,借助大牛的研究成果,加上自己的坚持,一定会有所收获的。

我的观点跟 @youth7 类似,不建议深入阅读,把几个关键点搞清楚就行了,这些直接用 @youth7 的研究成果对照源代码理解就行了。

同意楼上,然后 可以先看libuv,这方面前人有笔记和教程啥的,然后V8。。。。这个。。看看别人的笔记就行了。。。。(逃 js的话先把犀牛书翻两编。。。之后再说。。。 然后,提示,建议从nodej的0.0.1开始阅读,大致了解一下流程 (…我就是这么干的。。 然后我又想到是不是应该effictive C艹也至少读一遍) 不了解楼主情况,不过,C艹不怎么会或者根本不会的话不建议先从node源码开始,想深入了解nodejs的话C/C++是必不可少的。。 胡说一气,交给楼下。。。

嗯,楼主只要了解事件循环机制的话涉及到的代码也不多,不懂 c++ 也能看个大概 顺便打个预(广)告:朴老师的新书《深入浅出2》里面会有这一块的详细解释 然后已经没有要说的了,剩下的交给楼下吧。。。

@hyj1991 大大,到底啥时候出啊,去年就预告要出《深入浅出2》。。。。=_=

@hyj1991 居然要出2了?

@coordcn 谁爱读谁读,反正我是不会再去读node源码了,准确来说我要弃坑node,或许会转golang,整个广州地区就没几个公司用node做后台,全是前端那帮人在做一些小工具。大公司用node也不多了,据说阿里的node派被严重打压,很多node项目用java重写。今天看了看网易那个pomelo,已经一年多没更新过了。node真是让我伤透了心

@youth7

如果做纯后端,node真的是一丁点优势都没有,两年前我就在这个论坛里提醒大家了。

前端工具,中小项目是node最好的归宿。

当初还有很多人在这个论坛上讲Javascript秒天秒地呢,一个显而易见的逻辑,如果被Javascript秒的语言是垃圾,Javascript又不断加入了很多类似语言的特性,同时保留了原有设计的糟粕,最后不是成了垃圾中的垃圾?我无意开语言炮,只是想说明一个问题,每个语言和框架都有其适用的范围和条件。Javascript这种迭代模式不是语言本身的错,而是为了兼容性必须付出的代价,工程上是绝对正确的。

node源代码还是有可取之处的,尤其是libuv,httpparser等,质量都很高,Julia就用了libuv。没有一定的时间和强大的动力和意志力,真的不建议自己从头摸索,直接吸收前人(@youth7 @xtx1130 )的成果就行了,编码的花样有很多种,但是核心思想都是万变不离其宗的。

你选择golang是正确的,真正适合后端的语言必须天生自带并发原语,这是一个硬指标,没有这个应用就会很受限制,开发效率就会很受影响。最近无意中看到一个实验性质的语言 pony,设计思想很喜欢,结合erlang,golang,rust等语言的特性,这种语言能崛起的可能性很低,不适合做项目,但很适合自己闲暇时间来研究。

@coordcn 只怪我当初没看到你的提醒,哎。。。

@coordcn 同意这个观点,node的出路感觉应该是cli和后端微服务的中间层。如果是纯后端,感觉没必要选择node了

@youth7 据说阿里的node派被严重打压,很多node项目用java重写。

这个是从那里得出来的结论啊。

@xtx1130 不是一定就写console.log(),应该是打印函数,

@coordcn 嗯,你说得很有道理,我只想是知道事件循环那块的东西。

@vanishcode 非常感谢,你说的很有道理。

@coordcn 不太懂真正的后端包括哪些?我们的业务用node的确是完全够了。

@gyj1278

综合 @xtx1130 的回复,把应用面扩大下,把应用领域约束下,你对照下你们的业务是不是在这个范围内。

前端工具,大前端,中小型web项目是node最好的归宿。

我讲的是真正适合后端的语言,我是不敢定义真正的后端包括哪些东西的。适合后端的语言要有并发原语(能够直接用同步代码表达异步逻辑,不需要程序员额外理解。这个世界是异步的,但你的业务逻辑大多是同步的顺序的,这个两者天然矛盾。所以为了解放程序员,提高开发效率,一般都会引入类似golang拥有独立栈的协程,javascript本质上也是这么进化的,从callback,promise,generator/yield,async/await,一路走来也是不断在协程化,都是为了解决这个问题。但javascript走的是stackless路线,暂时还离不开callback这个拐杖),能够天生利用多核(大部分程序crash都是出在这个问题上,很多语言在语言层面避免的数据竞争问题,但现在的情况是要么模型复杂,难以理解,要么效率低下,工程化困难),最好能天生支持分布式,语言层面提供raft,BFT等算法,提供分布式锁。

以上都是一个底层程序员的意淫,且当一笑话看,但我想这个需求应该有一定的普遍性。

另说明,我拿golang协程举例并不代表我认可golang的协程模式,我个人更倾向于erlang的模式,进程间完全没有共享。

@JacksonTian 印象中是在V2EX中看别人提过,不知道真实与否,不过看你的反应,恐怕是虚假消息了。另外问一下《深入浅出nodejs 2》是真的么,计划什么时候出版?

@youth7 是真的,朴灵在写了,听说写了一小半了。

楼上都是大佬(逃

已经谈到node.js的未来了哇

来自酷炫的 CNodeMD

@coordcn 突然想起了你的回复中几个点没有看懂,想请教几个问题: 1,能够天生利用多核 nodejs通过cluster模块或者child_process模块不也是可以利用多核么?

2,天生支持分布式 go是否天生支持?如果是的话是通过什么模块/机制实现 java/erlang属于天生支持分布式么?

@youth7

1.天生利用多核

erlang,go都支持M对N调度,多核心利用过程是对用户透明的,用户不用关心建立的用户态进程(erlang)或协程(go)具体是哪个线程来执行,调度是由语言的runtime做的,进程或协程之通信erlang用消息,go用channel都是在一个内存空间,消息传递比直接函数调用低,但比跨进程高很多。nodejs的虽然可以用cluster多进程,但进程之间是隔离的,要通讯需要做一些额外的工作,效率也不高,如果要调动所有进程协作,比如完成某个计算密集任务,我们需要自己来做进程间同信,所以我个人认为还算不上天然。

2.天生支持分布式 erlang支持分布式的,但算不上完美。go分布式需要自己结合grpc等做,不是天生的,nodejs跟go一样,并不是天生的,现在天生支持分布式的语言很少。

回到顶部