解构/黑客NodeJs

shr*_*ivb 3 javascript operating-system node.js

我正在尝试理解Node的内部工作,我正处于这样一个问题,即我无法将用js编写的Node如何挂钩/绑定到用C/C++编写的低级系统调用.

当我写这段代码时 -

var http = require('http');
var server = http.createServer(function(req,res) { res.end('Hacking Node'); });
server.listen(8081);
Run Code Online (Sandbox Code Playgroud)

server.listen如何监听只有操作系统可以访问的特定端口?其他各种功能也是如此.

到目前为止的旅程一直是这样.

我检查了net.js和os.js文件.但不能说得多.

我也挖到了用C编写的进程文件 - unix和windows版本.

最后,经过进一步调查后,点击了Node.js文件

// https://github.com/joyent/node/tree/6cbfcdad46d733bb04332063727e304e449dc86b/src/node.js
Run Code Online (Sandbox Code Playgroud)

有以下评论 -

// This file is invoked by node::Load in src/node.cc, and responsible for
// bootstrapping the node.js core. Special caution is given to the performance
// of the startup process, so many dependencies are invoked lazily.
Run Code Online (Sandbox Code Playgroud)

Node.cc在第2708行加载此Node.js文件.

// https://github.com/joyent/node/blob/6cbfcdad46d733bb04332063727e304e449dc86b/src/node.cc - line 2708
Run Code Online (Sandbox Code Playgroud)

就我而言.有人能指出我接下来会发生什么,并帮助我填写这个难题的部分.

use*_*109 5

我很惊讶没有人提到libuv.这是一个示意图.(这不是100%准确).

              2 V8 compiler
             /             \
            /               \
   1 Your code              3 node.js core system libraries(net,fs,events)
                                       JavaScript
                                      ------------    
                                     V8 bindings(C++)
                                         / | \
                                        /  |  \
                              4 node.js platform code C/C++
                                  events   fs  net
                                        \  |  /
                                         \ | / 
                                          \|/
                                        runs on
                                     5 libuv C/C++
                               High Performance Event Loop
                                           |
                                        syscalls
                                           |
                                        6 Kernel
Run Code Online (Sandbox Code Playgroud)

记住你如何做.toString()并展示JS函数.这对V8绑定不起作用(显示[本机代码]).node.js platform(C++)函数具有V8绑定.因为节点提供了事件和异步执行,所以您在事件循环上执行的所有操作都在libuv上运行.显示libuv用法的旧博客.

libuv为您处理系统调用的调度,V8处理您的JS代码.节点将JS扩展到系统.