4

Duktape を使用して JavaScript を埋め込んでいますが、使用するrequireと常にエラーが発生します。

int main(){
  duk_context *ctx = duk_create_heap_default();
  duk_peval_file(ctx, "example.js");
  printf("file load err %s", duk_safe_to_string(ctx, -1));
  duk_destroy_heap(ctx);
}

example.js

var mylib = require("mylib")
print (mylib.hello)

mylib.js

exports.hello = "Hello"

エラー:

ファイル読み込みエラー TypeError: 呼び出し可能ではありません

スタック ダンプは次のように述べています。

duk_js_call.c:682
require native strict preventyield
eval example.js:1 preventyield

4

2 に答える 2

5

Duktape では、移植性を維持するために、モジュール検索機能を提供する必要があります (しゃれた意図はありません)。ただし、Duktape の経験がほとんどない場合でも、実装は非常に単純で簡単な作業です。
非常にシンプルですが、完全に機能するモジュール検索機能は次のようになります。

Duktape.modSearch = function(id) {
    return readFileAsString(id);
}

これによりrequire(filename)、Duktape Javascript 環境からファイル名をパラメーターとして呼び出し、それをモジュールとして使用できるようになります。より高度な機能では、エラーを処理したり、複数のパスやフォルダーを検索したりできます。

この関数を使用するにはrequire()、ファイルの読み取りを処理し、その内容を文字列として返す C/C++ 関数を作成し、この関数を Duktape エンジンにバインドする必要があります (この例はDuktapeのホームページにあります)。
ここで、Duktape ランタイムからこの関数定義を呼び出す (たとえば、 を使用duk_eval_string(ctx, "Duktape.modSearch = ...");) と、 を呼び出すことができるはずですrequire()

于 2015-03-14T23:03:22.760 に答える