如何 运行 一个 JavaScript 文件 - V8

How to run a JavaScript file - V8

我已将 v8 嵌入到我的 C++ 应用程序中。参考 https://chromium.googlesource.com/v8/v8/+/master/samples/hello-world.cc 我可以 运行 一个 javascript。已经过测试并且工作正常。

我从我的 C++ 应用程序访问链接,下载 html 数据,下载 javascript。 html 中的一些嵌入式脚本调用外部脚本文件中的函数。如何确保外部脚本可用于嵌入式脚本?

下载的 JavaScript 个文件(一个或多个)可能较大。在这种情况下,如何使用 v8 执行 HTML 中的 JavaScript api? v8 中 运行 a JavaScript 的代码如下,

  // Create a string containing the JavaScript source code.
  v8::Local<v8::String> source =
      v8::String::NewFromUtf8(isolate, "'Hello' + ', World!'",
                              v8::NewStringType::kNormal)
          .ToLocalChecked();
  // Compile the source code.
  v8::Local<v8::Script> script =
      v8::Script::Compile(context, source).ToLocalChecked();
  // Run the script to get the result.
  v8::Local<v8::Value> result = script->Run(context).ToLocalChecked();

假设下载的 javascript 是 200KB,我如何将这么大的缓冲区提供给 v8::Script::Compile api。当我有多个文件时,如何将它们提供给 v8?

How do I ensure that the external scripts are available for the embedded ones?

您先加载外部脚本。

How do I execute the JavaScript API present in HTML using v8?

你是说 DOM 吗? windowdocument之类的? DOM 不是 ECMAScript 的一部分,所以 V8 对此一无所知;它由嵌入器提供(即通常 Chrome)。在您自己的嵌入中,您需要使用 V8 的 API 自己提供所有这些对象。不用说,这是一项 巨大 的工作量。如果您想要一种呈现网站的方法,那么我建议您为此使用一些现有的 component/library,例如 Chromium Embedded Framework,或您最喜欢的 GUI 工具包的 WebView(或任何名称)。

Assuming downloaded JavaScript is 200KB, how can I feed such a large buffer to v8::Script::Compile API?

就像你给 V8 提供一个小脚本一样:将它放入 v8::Local<v8::String>,然后调用 v8::Script::Compilev8::Script::Run

And when I have more than one file present, how can feed I them to v8 ?

重复调用 v8::Script::Compilev8::Script::Run,可能使用循环。例如,参见 V8 的 shell sample,特别是函数 RunMain.

As I receive partial JavaScript in HTTP packets (chunks), can I pass the partial JavaScript to V8?

是的,V8有一个脚本流接口。请参阅 v8::ScriptCompiler::ExternalSourceStream 的 API 文档。有关如何使用它的示例,您可以研究tests。对于小至 200KB 的脚本,流式传输可能值得也可能不值得;绝对不需要。