javascript - 如何在今天的 v8 中包含另一个 js 文件?
问题描述
我在这里找到了一个旧的 anwser 和后来的更新,但我很难将此代码改编为最新的(2020)V8 版本。
我遇到了很多困难:
String::New
被删除了,现在String::NewFromUtf8Literal
需要一个Isolate* isolate
我不知道如何传递给函数的东西Include
,我应该在之前添加它const Arguments& args
吗?Script::Compile
现在将Context
对象作为参数- 而且我不知道把最后两行代码放在哪里
Handle<ObjectTemplate> global = ObjectTemplate::New(); global->Set(String::New("include"), FunctionTemplate::New(Include));
- 更新 -
经过一些工作,我有这样的代码。
但是,由于存在错误,它仍然无法编译:
似乎我无法
Local
从 a 中得到 aPersistent
,即使我使用了 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>
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); |
解决方案
我不知道如何传递给函数 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
功能几乎可以满足您的需求。
推荐阅读
- spring-kafka - 如何在消息聊天室中管理 kafka 主题
- php - omnipay 中的 curl 命令
- java - Fetch join 导致 N+1 查询或抛出 org.hibernate.QueryException
- makefile - 带有 CMake 的 CodeLite 在构建时不执行 make
- javascript - Material-UI TableCell-root中padding-right 40px是什么原因
- c - 从 NASM 调用 C 函数 _printf 会导致分段错误
- android - 如何在 Activity 类中正确使用 TextToSpeech?
- php - PHP glob 和取消链接
- html - 视频来自浏览器缓存时缺少 Cors-Header
- google-cloud-data-fusion - 尝试在我的谷歌云数据融合工作流程中连接到 mysql 数据库时连接超时