如何在 JavaScriptCore 中将新的原生类添加到 WebWorker 的上下文中?
Posted
技术标签:
【中文标题】如何在 JavaScriptCore 中将新的原生类添加到 WebWorker 的上下文中?【英文标题】:How to Add a new native class to WebWorker's context in JavaScriptCore? 【发布时间】:2015-11-05 10:59:29 【问题描述】:我在 webkit-gtk 浏览器中有一个通过 javascriptCore 扩展 JavaScript 的应用程序。现在我有几个类可以添加到全局上下文中,如下所示:
void create_js(gpointer context, char* className, JSClassDefinition clasDefinition)
JSClassRef classDef = JSClassCreate(&clasDefinition);
JSObjectRef classObj = JSObjectMake(context, classDef, context);
JSObjectRef globalObj = JSContextGetGlobalObject(context);
JSStringRef str = JSStringCreateWithUTF8CString(className);
JSObjectSetProperty(context, globalObj, str, classObj, kJSPropertyAttributeNone, NULL);
JSStringRelease(str);
现在,我还想将这些类添加到 WebWorker 的上下文中,这样我就可以从用 JS 实例化的工作人员调用它们。
我试过像这样获取Worker
对象:
JSStringRef workerStr = JSStringCreateWithUTF8CString("Worker");
JSObjectRef worker = JSObjectGetProperty(context, globalObj, workerStr, NULL);
JSObjectSetProperty(context, worker, str, classObj, kJSPropertyAttributeNone, NULL);
JSStringRelease(workerStr);
但这会将其添加到 WorkerConstructor
对象中,并且当调用 new Worker()
时,这些类不可用。
【问题讨论】:
不确定您的具体要求。但我认为我们可以在工作文件中包含一个执行此操作的脚本。像这样。 importScripts("globalWorker.js") 您将 Worker 类放到全局上下文中,您应该将它们添加到 WebWorker 的上下文而不是主上下文中,因为这两个上下文不同。 您正在尝试将新创建的类添加到Worker
类定义中。通常,您需要将您的类添加到全局对象和新创建的 JSVirtualMachine 中的每个全局对象。 Worker
将创建一个新的 JSVirtualMachine
及其全局上下文和全局对象;完全隔离的环境
【参考方案1】:
在大多数常见浏览器实现中启动 Web Worker 之前,无法修改 WorkerGlobalScope
或类似的范围/上下文。启动此特定 Web Worker 后,这些范围仅对 Web Worker 上下文可用。
使用共享方法的唯一方法是在单独的共享文件/资源中定义它们并使用importScripts()
包含它们
self.importScripts('foo.js');
self.importScripts('foo.js', 'bar.js', ...);
importScripts('foo.js');
importScripts('foo.js', 'bar.js', ...);
注意:
importScripts()
和self.importScripts()
实际上是等价的 - 都表示importScripts()
在工作人员的内部范围内被调用。
来源
WorkerGlobalScope DedicatedWorkerGlobalScope SharedWorkerGlobalScope【讨论】:
【参考方案2】:使用 "importScripts()" 与 WorkerGlobalScope 共享资源
importScripts('resource.js');
【讨论】:
以上是关于如何在 JavaScriptCore 中将新的原生类添加到 WebWorker 的上下文中?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在反应原生版本 .61 中将动画添加到底部选项卡图标