web-dev-qa-db-ja.com

Node.jsインタープリターをC / C ++に組み込む方法は?

C/C++アプリケーションでNode.jsスクリプトを使用したい。一部の人々は私にv8、libev、libeioから始めることを提案しました。しかし、それはNode.jsを一から書き直すことを意味します。

では、Node.jsをCまたはC++に埋め込むことは可能ですか?

36
Jeff

おそらく、V8はC++で記述されており、node.jsはV8で実行できますが、極端にJavaScriptを実行する正当な理由がない限り、 C++あなたはおそらく適切なC++ライブラリを見つけ、必要な機能をC++に直接実装する方がはるかに良いでしょう。スクリプト言語とネイティブコードを統合する作業は、通常、簡単ではありません。例えば。 V8ドキュメント 。 Qtはc ++とjavascriptの間でかなりまともな統合を提供しますが、スクリプトとコードの間でオブジェクトを前後に移動することはまだ簡単ではありません。

0

最初にアプリケーションをノードのC++モジュールとして実装するのに十分かどうかを検討し、次に主要部分をNodeスクリプトとして接着する必要があります。

それ以外の場合は、コアコードを例に取り、不要な部分(HTTPモジュールなど)を削除してコンポーネントをそこに挿入することで、"re-implement Node"を使用することもできます。最も苦痛のない方法は、サブツリーのマージを行い、ビルドシステムを削除し、ビルドスクリプトにプレフィックスを追加して、それが存在するディレクトリを指すようにすることです。その後、特定のパーツの作成を停止できます。ただし、Nodeのビルドシステムにはいくつかの部分が含まれており、実行するのは非常に困難な場合があります。

また、デフォルトでロードされたものを使用してNodeを再パッケージ化し、実行可能ファイルの名前を変更することもできます。ただし、これは私が説明した最初のアプローチを取るより複雑な方法であり、/usr/bin/にスクリプトをインストールするだけで、次のようになります。

  #!/usr/bin/node
  var myAppMain = require('libmyApp');
  myAppMain.withConfig(filename,
  function(err, cnf) {
     if (err) throw err; // parser or file access error
     cnf.evalMe();
  });

JSlintをパーサーとして使用し、次に危険な呼び出しをgrepしてからeval(conf_script)を使用するか、require(config.js)を使用できますが、exports.someMethod = function (...) {...}を追加する必要があります。ただし、一般的にはrequire()の方がはるかに安全ですが、関数の代わりにexports.someMethod = function (...) {...}に置き換えてrequire('OnlyCallMySafeMethods')を追加して拒否する構成のプリプロセッサを実装することもできますrequire('fs')または他のlibへの試みで、誰かが使用することを恐れている可能性があります。この種類の安全性は、オプションのオプションですお望みかもしれません、それは本当にすべてあなた次第です。 exports.someMethod = ....置換で少しやり、上部にrequire('myAppConfigLib)を1つ追加して、ユーザーがAPIとスクリプト/構成に追加したいものをすべて使用できるようにすると思いますが!

更新:行66src/node.jsには非常に役立つコメントがあります:

  // To allow people to extend Node in different ways, this hook allows
  // one to drop a file lib/_third_party_main.js into the build
  // directory which will be executed instead of Node's normal loading.

src/の内容はビルド時にバイトコードにコンパイルされることにも注意してください。

14
errordeveloper

Node.JSの埋め込みが、Node.JSフォークJXcoreによって正式にサポートされるようになりました。埋め込みドキュメントは このリンク から入手できます。

14
Nuray Altin

私はあなたが探していると思うものに近いものを構築しました:

https://github.com/ZECTBynmo/tacnode

これは、node.jsをC++アプリケーションに静的にリンクできるライブラリです。洗練されていませんが、単純なノードスクリプトを起動するために使用しました。

2
ZECTBynmo

Npmを活用する機能を含め、ノードを埋め込むには多くの理由があります。

残念ながらJXCoreは死にかけています。この記事はいくつかの選択肢を提供します。 http://www.goland.org/nodeapps/

1
Philip Taylor

私はちょうどチェックアウトしていた js-git これはNode.js用に作成され、他のいくつかのNode.jsモジュールにも依存しています。

ただし、同じ開発者がツール tim-task を作成して、いくつかの一般的なNode.js関数、最も重要なのはrequireをラップし、いくつかのNode.jsモジュールをそのような方法でまとめましたNode.jsに依存しないようにする必要があります。彼はそれを使用して git-web-platform を作成しました。つまり、ブラウザーで使用できるJSファイルとしてjs-gitをパックしました。結果のパックされたファイルは this のようになります。これはおそらく、純粋なV8でのみ小さな変更を加えて使用することもできます。

これはあなたにとって役に立つかもしれません。ただし、このアプローチには制限があることに注意してください。

0
Albert