Node.js源码研究之模块组织加载

2019-12-22 15:35栏目:龙电竞官网
TAG:

node.native 是node.js 的一个 C++11 移植版本,由Danielkang开荒。示范代码运用node.native写的最简便的web-server示例:

Node.js逐步受到社区的广阔关怀,方今Node.js的C++移植版node.native也悄然出现。node.native遵从C++11言语,目前还处在恐慌的开采阶段,未有正经八百可信赖的版本。

简轻便单研商了一下node.js源码,它有8000行C++代码,2000行javascript代码,来走访js和C++间是怎么组织连接起来,以致各样模块是怎么着相互调用的。

#include iostream#include ""using namespace native::http;int main(){ http server; if(server.listen("0.0.0.0", 8080, [](request req, response res){ res.set_status(200); res.set_header("Content-Type", "text/plain"); res.end("C++ FTWn"); })) std::cout  "Server running at "  std::endl; return native::run();}

使用node.native开荒Web应用,一如Node.js的品格大同小异轻易和有力。以Web服务器为例,node.native的实今世码如下:

正文使用的node.js版本是0.4.8,可以在

值得注意的是,node.native由头文件组成,供给接纳libuv和库。关于node.native的编写翻译效能能够查阅那篇小说介绍:。项目地址:

#include <iostream> #include <native/native.h> using namespace native::http;   int main() {     http server;     if(!server.listen("0.0.0.0", 8080, [](request& req, response& res) {         res.set_status(200);         res.set_header("Content-Type", "text/plain");         res.end("C++ FTWn");     })) return 1; // Failed to run server.       std::cout << "Server running at http://0.0.0.0:8080/" << std::endl;     return native::run(); } 

js2c.py

而使用原装Node.js完成的代码如下:

node.js使用了V8附带的js2c.py工具把装有内置的js代码调换到C++里的数组,生成node_natives.h直接include到程序中,成了C++源码的风流浪漫部分。那样做能增进内置js模块的编译功效。

var http = require('http'); http.createServer(function (req, res) {   res.writeHead(200, {'Content-Type': 'text/plain'});   res.end('Hello Worldn'); }).listen(1337, "127.0.0.1"); console.log('Server running at http://127.0.0.1:1337/');  

node.js里停放的javascript包含了主程序src/node.js和模块程序lib/*.js,通过js2c.py让每多个js文件都生成三个源码数组,存放在build/src/node_natives.h里,node_natives.h在node.js编译后才会变动(编写翻译的脚本wscript中调用了js2c.py卡塔尔(英语:State of Qatar),能够看见大致的结构如下:

何以node.native项目值得关心呢?devthought网址列举了三条理由:

namespace node {  const char node_native[] = {47, 47, 32, 67, 112 ......}  const char console_native[] = {47, 47, 32, 67, 112 ......}  const char buffer_native[] = {47, 47, 32, 67, 112 ......}  .....  }  struct _native { const char* name; const char* source; size_t source_len;};  static const struct _native natives[] = {  { "node", node_native, sizeof(node_native)-1 },  { "dgram", dgram_native, sizeof(dgram_native)-1 },  { "console", console_native, sizeof(console_native)-1 },  { "buffer", buffer_native, sizeof(buffer_native)-1 },  ....  } 
  1. C++语言扩展了一些增进语言可用性的性状。特别是在无名函数的支撑,在node.native项目中利用布满。
  2. 接纳C++语言能够更有助于地与现成的C/C++函数库交互作用。
  3. 有的是厂商依据质量的思量,选用C++编写Web应用程序和服务器。

那一个文件被含有在node_javascript.cc里,node_javascript.cc提供了三个接口:

除了这几个之外,devthought网址还针对Node.js、LuaJIT和C++(node.native)三者做了二个主导的本性基准测验,结果是node.native最好,测量试验结果比Node.js快九成。当然这只是三个回顾的评估,鉴于node.native版本还不牢固,在拿到正确的结论早先,大家还索要做严苛的准绳测验。

MainSource() 处理node_native源码重临v8::Handle类型的数量可供编写翻译。

Node.js社区近年来也有些变化,Node.js创办人RyanDahl宣布IsaacSchlueter将接任自个儿的任务,而团结将转而搞任何研究项目。而微软则实现了与Joyent的通力合营承诺,公布了支持Node.js的Windows Azure SDK,Azure Node Package Manager (NPM卡塔尔模块允许开垦职员在别的情形中动用Windows Azure存款和储蓄服务来布署Node应用程序,还是能使用新型集成的Cloud9 IDE在Azure云端铺排代码。

DefineJavaScript(target)把别的具有模块源码造成v8::Handle类型后加载到传播的target对象上。

抱有的js模块都被调换来了C数组,接下去看看它们怎么试行和相互调用。

执行js主程序/传递process

先看看node.js的最底层C++传递给javascript的多个变量process,在一齐始运转node.js时,程序会先布署好process

Handleprocess = SetupProcessObject(argc, argv); 

版权声明:本文由龙竞技官网发布于龙电竞官网,转载请注明出处:Node.js源码研究之模块组织加载