今日のv8に別のjsファイルファイルを含めるにはどうすればよいですか?

Nov 23 2020

ここで古い回答とその後の更新を見つけましたが、このコードを最新(2020)のV8バージョンに適合させるのは困難です。

私が遭遇する多くの困難があります:

  1. String::Newが削除され、関数に渡す方法がわからないString::NewFromUtf8Literalニーズが発生しました。前にこれを追加する必要がありますか?Isolate* isolateIncludeconst Arguments& args
  2. Script::CompileかかるContext今のparamaterとしてオブジェクトを
  3. そして、最後の2行のコードをどこに置くかわかりません
    Handle<ObjectTemplate> global = ObjectTemplate::New();
    global->Set(String::New("include"), FunctionTemplate::New(Include));
    

-更新-

いくつかの作業の後、私はこのような私のコードを持っています。

ただし、エラーがあるため、コンパイルされません。

  1. ダニジャーの戦略を使っLocalPersistentとしても、からは得られないようです。コンストラクターを使用したことがないためかもしれませんが、この関数スコープ内でPersistをここで構築することはできないと思います。

    samples/import.cc:74:103: Error:cannot convert ‘v8::Local<v8::Context>’ to ‘v8::Context*’
       74 |     global_context = v8::Persistent<v8::Context, CopyablePersistentTraits<v8::Context>>::New(isolate, local_context);
          |                                                                                                       ^~~~~~~~~~~~~
          |                                                                                                       |
          |                                                                                                       v8::Local<v8::Context>
    
  2. ここにいくつかのエラーがありString::NewFromUtf8Literalます

    samples/import.cc:34:110: Error:‘static v8::Local<v8::String> v8::String::NewFromUtf8Literal(v8::Isolate*, const char*, v8::NewStringType, int)’ is private within this context
       34 |   Handle<String> source = String::NewFromUtf8Literal(args.GetIsolate(), buff, v8::NewStringType::kNormal, len);
          |   
    

回答

1 jmrk Nov 24 2020 at 12:15

Include関数に渡す方法がわかりませんconst Arguments& args。前にこれを追加する必要がありますか?

いいえ、JSから呼び出される関数のシグネチャを変更することはできませんが、変更する必要はありません:(FunctionCallbackInfoの代わりになりますArguments)にはGetIsolate()メソッドがあります。

Script::CompileかかるContext今、パラメータとしてオブジェクトを

これについて質問があるので、すべてに単一のコンテキストのみを使用していると思います。に保存し、必要なときにいつでもv8::Persistent作成できますv8::Local。(当面は非推奨を使用することもできますIsolate::GetCurrentContext()が、新しく記述されたコードについては、将来、移行する必要がある場合にのみ、より多くの作業を作成するため、これはお勧めしません。)

最後の2行のコードをどこに置くかわかりません

グローバルオブジェクトを設定する場所はどこでも、アプリの起動シーケンスのどこかにあります。

これらすべての質問(およびそれ以上)は、V8プロジェクトが維持している「シェル」サンプルアプリを調べることで答えることができます。 https://chromium.googlesource.com/v8/v8/+/master/samples/shell.cc。特に、そのLoad機能はあなたが望むことをほぼ実行します。