Node.jsの動く仕組み
IIJ 大津繁樹
2011年12月16日
#include <stdio.h> #include "uv.h" static void cb(uv_write_t* req, int status) { printf("Hello from Callback.\n"); uv_unref(uv_default_loop()); } int main() { uv_tty_t tty; // tty stream handle uv_write_t req; // write request int ret = uv_tty_init(uv_default_loop(), &tty, 1, 0); uv_buf_t bufs[] = { uv_buf_init("Hello UV!\n",10) }; ret = uv_write(&req, (uv_stream_t*)&tty, bufs, 1, cb); uv_run(uv_default_loop()); return 0; }
function Module() { this.exports = {}; ... } Module.require = function(id) { var module = new Module(id); (function (exports, require, module) { モジュール内コード exports = ... })(module.exports, Module.require, module); return module.exports; } // こっから本体 var require = Module.require; var hoge = require("モジュール名");
exports.foo = "foo";
var hoge = require("./hoge.js"); console.log(hoge.foo);
> node run.js > foo
void Work(uv_work_t* req) { ... } void Done(uv_work_t* req) { HandleScope scope; Local<Value> argv[1] = {Local<Value>::New(String::New("Work Done"))}; callback->Call(Context::GetCurrent()->Global(), 1, argv); callback.Dispose(); } Handle<Value> putQueue(const Arguments& args) { HandleScope scope; callback = Persistent<Function>::New(Local<Function>::Cast(args[0])); int status = uv_queue_work(uv_default_loop(),&request,Work, Done); return Undefined(); } void RegisterModule(Handle<Object> exports) { exports->Set(String::NewSymbol("putQueue"), FunctionTemplate::New(putQueue)->GetFunction());} NODE_MODULE(thread_test, RegisterModule);
> node-waf configure build Setting srcdir to : /home/ohtsu/tmp/thread_test ... 'build' finished successfully (0.038s)
var thread_test = require('./thread_test.node'); thread_test.putQueue(function(msg) { console.log(msg); });
> node run.js >'Work Done'
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(80);