如何在 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 的上下文中?的主要内容,如果未能解决你的问题,请参考以下文章

移动开发(杂记)

如何在反应原生导航 v5 中将数据传递回上一个屏幕?

我们如何在反应原生项目中将多个图像合并为单个图像

我们如何在反应原生版本 .61 中将动画添加到底部选项卡图标

如何在 Swift 的 JavaScriptCore 中导入模块?

一个人如何在JavaScriptCore中使用摩卡咖啡和柴? [关闭]