Wie kann ich eine andere js-Datei in die heutige Version 8 aufnehmen?
Ich finde einen alten anwser und später aktualisiert hier , aber es ist schwer für mich , auf die neueste (2020) V8 - Version diesen Code anzupassen.
Es gibt viele Schwierigkeiten, auf die ich stoße:
String::New
wird entfernt und jetzt einString::NewFromUtf8Literal
Bedarf,Isolate* isolate
den ich nicht an die Funktion übergeben kannInclude
, sollte ich dies einfach vorher hinzufügenconst Arguments& args
?Script::Compile
nimmtContext
jetzt ein Objekt als Parameter- Und ich weiß nicht, wo ich die letzten beiden Zeilencodes platzieren soll
Handle<ObjectTemplate> global = ObjectTemplate::New(); global->Set(String::New("include"), FunctionTemplate::New(Include));
- UPDATE -
Nach einiger Arbeit habe ich meinen Code so .
Aufgrund der folgenden Fehler wird es jedoch immer noch nicht kompiliert:
Scheint, dass ich kein
Local
von einem bekommen kannPersistent
, selbst wenn ich Danijars Strategie angewendet habe . Vielleicht liegt es daran, dass ich den Konstruktor nicht verwendet habe, aber ich glaube nicht, dass ich hier innerhalb dieses Funktionsumfangs einen Persist konstruieren kann.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>
Es gibt einige Fehler mit
String::NewFromUtf8Literal
hiersamples/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); |
Antworten
Ich weiß nicht, wie ich an die Funktion Include übergeben soll. Soll ich das vorher hinzufügen
const Arguments& args
?
Nein, Sie können die Signatur von Funktionen, die von JS aufgerufen werden, nicht ändern, müssen jedoch nicht: FunctionCallbackInfo
(was der Ersatz für ist Arguments
) eine GetIsolate()
Methode haben.
Script::Compile
Context
Nimmt jetzt ein Objekt als Parameter
Da Sie eine Frage dazu haben, verwenden Sie vermutlich nur einen einzigen Kontext für alles. Speichern Sie es einfach in einem v8::Persistent
und erstellen Sie ein v8::Local
daraus, wann immer Sie es benötigen. (Vorerst können Sie auch den veralteten Isolate::GetCurrentContext()
Code verwenden , aber für neu geschriebenen Code würde ich davon abraten, da Sie in Zukunft nur dann mehr Arbeit für sich selbst schaffen würden, wenn Sie von ihm weg migrieren müssen.)
Ich weiß nicht, wo ich die letzten beiden Zeilencodes einfügen soll
Überall dort, wo Sie das globale Objekt einrichten, irgendwo in der Startsequenz Ihrer App.
All diese Fragen (und mehr) könnten beantwortet werden, indem Sie die "Shell" -Beispiel-App studieren, die das V8-Projekt verwaltet: https://chromium.googlesource.com/v8/v8/+/master/samples/shell.cc. Insbesondere macht seine Load
Funktion so ziemlich das, was Sie wollen.