Google で簡単に検索すると、node.js 用のC++ の「Hello World」を作成するためのチュートリアルが少なくとも 1 つ見つかりますが、 Cのみを使用してそのような拡張機能を作成できるかどうかは不明です。可能だとすると、どのような課題/制限に直面するでしょうか?
6 に答える
必要に応じて、拡張機能の一部を C で記述できますが、C コードを Node.js で結合するには、少なくとも少しの C++ コードが必要です。
HelloWorld でわかるように、拡張機能は、Node が期待するすべてのクラスを持つv8.h
およびヘッダーに依存しています。node.h
それらがないと、JS オブジェクトを適切に作成して Node.js にエクスポートすることができません。
そうは言っても、C 関数を呼び出すだけの C++ 関数の小さなセットを簡単に作成し、ある種の C 構造をラップすることができます。
ハッカーニュースでこれを見つけました:
https://github.com/wesolows/v8plus
v8+: ノード アドオン C++ から C 境界へ
このレイヤーは、C で少なくとも単純な Node アドオンを作成する方法を提供します。他の方法では使用することが予想される恐ろしい C++ グープをすべて使用する必要はありません。そのグープはまだ存在しますが、それを書く必要はありません。さらに重要なことは、混乱を招き、エラーが発生しやすい C++ セマンティクスを回避して、正常なプログラミング環境でモジュールを作成できることです。
モジュールが libuv を使用している場合は、それをノード実行可能ファイルにリンクできます。共有ライブラリが行うように libuv 関数をエクスポートします。
その後、node-ffi を使用してそれとやり取りできます (ここでは C++ の知識は必要ありません)。
MSVSを使用してWindowsで作成した方法は次のとおりです。
- MSVS で新しい DLL ソリューションを作成する
- libuvをダウンロードし、インクルード ファイルと lib ファイルを MSVS にコピーします。
- node.libファイルをダウンロードし、MSVS の lib フォルダーに配置します。
- メイン イベント ループにタイマーを追加する以下のサンプル ソースをコンパイルします。
testlib.c:
#include <stdio.h>
#include <stdlib.h>
#include "uv.h"
void (*p_callback)(int number, char *text);
void timer_cb1 (uv_timer_t* timer, int status) {
printf("libuv timer here\n", status);
p_callback(123, "it worked!");
}
void set_timer (int interval, void *pfunction) {
uv_loop_t *loop;
uv_timer_t *timer1;
printf("set_timer called. interval=%d callback=%p\n", interval, pfunction);
p_callback = pfunction;
printf("uv_version_string = %s\n", uv_version_string());
loop = uv_default_loop();
if (loop == 0) {
puts("could not get the reference to the default loop");
return;
}
puts("got the default loop. now allocating the timer struct");
timer1 = (uv_timer_t *) malloc(sizeof(uv_timer_t));
if (timer1 == 0) {
puts("malloc failed");
return;
}
puts("initializing timer");
uv_timer_init(loop, timer1);
puts("starting timer");
uv_timer_start(timer1, (uv_timer_cb) &timer_cb1, interval, interval);
puts("timer created. returning");
}
testlib.def を使用します。
EXPORTS set_timer
node.lib にリンクすることを忘れないでください
- 作成した dll を test フォルダーに移動し、そこで次のコマンドを実行します。
npm install ffi
(現在、ビルド ツールが必要です。手順を確認してください)
node test-lib.js
test-lib.js はここにあります:
var ffi = require('ffi');
var testlib = ffi.Library('testlib', {
'set_timer': [ 'void', [ 'int', 'pointer' ] ]
});
var callback = ffi.Callback('void', ['int', 'string'],
function(number, text) {
console.log("javascript callback here!!! number=" + number + " text=" + text);
}
);
console.log('registering the callback...');
testlib.set_timer(500, callback);
console.log('done')
想像力を使って。libuv 内にはネットワーク、ワーカー スレッド、その他のオプションがあります。