首页 > 解决方案 > 如何在今天的 v8 中包含另一个 js 文件?

问题描述

我在这里找到了一个旧的 anwser 和后来的更新,但我很难将此代码改编为最新的(2020)V8 版本。

我遇到了很多困难:

  1. String::New被删除了,现在String::NewFromUtf8Literal需要一个Isolate* isolate我不知道如何传递给函数的东西Include,我应该在之前添加它const Arguments& args吗?
  2. Script::Compile现在将Context对象作为参数
  3. 而且我不知道把最后两行代码放在哪里
    Handle<ObjectTemplate> global = ObjectTemplate::New();
    global->Set(String::New("include"), FunctionTemplate::New(Include));
    

- 更新 -

经过一些工作,我有这样的代码

但是,由于存在错误,它仍然无法编译:

  1. 似乎我无法Local从 a 中得到 a Persistent,即使我使用了 danijar 的策略。也许是因为我没有使用构造函数,但我认为我不能在这个函数范围内构造一个 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);
          |   
    

标签: javascriptv8

解决方案


我不知道如何传递给函数 Include,我应该在之前添加这个const Arguments& args吗?

不,您不能修改将从 JS 调用的函数的签名,但您不需要:(FunctionCallbackInfo它是 的替代品Arguments)有一个GetIsolate()方法。

Script::Compile现在将Context对象作为参数

由于您对此有疑问,我猜您只对所有内容使用单个上下文。只需将其存储在 a 中,并在需要时从它v8::Persistent创建一个。v8::Local(目前,您也可以使用 deprecated Isolate::GetCurrentContext(),但对于新编写的代码,我建议您不要这样做,因为您将来必须迁移时才会为自己创建更多工作。)

我不知道在哪里放最后两行代码

无论您在哪里设置全局对象,在应用程序的启动顺序中的某个位置。

所有这些问题(以及更多问题)都可以通过研究 V8 项目维护的“shell”示例应用程序来回答:https ://chromium.googlesource.com/v8/v8/+/master/samples/shell.cc 。特别是,它的Load功能几乎可以满足您的需求。


推荐阅读