Node.js是壹個強大的平臺,理想狀態下壹切都都可以用javascript寫成。然而,妳可能還會用到許多遺留的庫和系統,這樣的話使用c++編寫Node.JS擴展會是壹個不錯的註意。
以下所有例子的源代碼可在node擴展示例中找到 。
編寫Node.js C + +擴展很大程度上就像是寫V8的擴展; Node.js增加了壹些接口,但大部分時間妳都是在使原始的V8數據類型和方法,為了理解以下的代碼,妳必須首先閱讀V8引擎嵌入指南。
Javascript版本的Hello World
在講解C++版本的例子之前,先讓我們來看看在Node.js中用Javascript編寫的等價模塊是什麽樣子。這是壹個最簡單的Hello World,也不是通過HTTP,但它展示了node模塊的結構,而其接口也和大多數C++擴展要提供的接口差不多:
HelloWorldJs = function() {
this.m_count = 0;
};
HelloWorldJs.prototype.hello = function()
{
this.m_count++;
return “Hello World”;
};
exports.HelloWorldJs = HelloWorldJs;
正如妳所看到的,它使用prototype為HelloWorldJs類創建了壹個新的方法。請註意,上述代碼通過將HelloWorldJS添加到exports變量來暴露構造函數。
要在其他地方使用該模塊,請使用如下代碼:
var helloworld = require(‘helloworld_js’);
var hi = new helloworld.HelloWorldJs();
console.log(hi.hello()); // prints “Hello World” to stdout
C++版本的Hello World
要開始編寫C++擴展,首先要能夠編譯Node.js(請註意,我們使用的是Node.js 2.0版本)。本文所講內容應該兼容所有未來的0.2.x版本。壹旦編譯安裝完node,編譯模塊就不在需要額外的東西了。
完整的源代碼可以在這裏找到 。在使用Node.js或V8之前,我們需要包括相關的頭文件:
#include <v8.h>
#include <node.h>
using namespace node;
using namespace v8;
在本例子中我直接使用了V8和node的命名空間,使代碼更易於閱讀。雖然這種用法和谷歌的自己的C++編程風格指南相悖,但由於妳需要不停的使用V8定義的類型,所以目前為止的大多數node的擴展仍然使用了V8的命名空間。
接下來,聲明HelloWorld類。它繼承自node::ObjectWrap類 ,這個類提供了幾個如引用計數、在V8內部傳遞contex等的實用功能。壹般來說,所有對象應該繼承ObjectWrap:
class HelloWorld: ObjectWrap
{
private:
int m_count;
public:
聲明類之後,我們定義了壹個靜態成員函數,用來初始化對象並將其導入Node.js提供的target對象中。設個函數基本上是告訴Node.js和V8妳的類是如何創建的,和它將包含什麽方法: