reactjs 如何在Micro-frontend上运行Web Worker?

svmlkihl  于 2023-06-29  发布在  React
关注(0)|答案(2)|浏览(88)

我正在使用React,Webpack并采用Micro-frontend模型。我有两个简单的应用程序如下:
1.应用程序A( shell 应用程序)
1.应用程序B(远程应用程序)。
App B使用一个简单的Web Worker,如下所示:
new Worker(new URL("./myworker.ts", import.meta.url))
App B正常运行,但在App A上运行时,它崩溃了:
Uncaught SecurityError: Failed to construct 'Worker': Script at 'appB.com/worker.js' cannot be accessed from origin 'appA.com'
我知道有一种方法是使用Blob,但在这种情况下,我不知道如何做到这一点,因为工人是在App B本身。
还有一件事,我希望App B能够独立运行,并能够在shell应用程序(App A)上运行良好。
有什么解决办法吗?谢谢

thtygnil

thtygnil1#

为了在微前端架构中正常运行,您可以使用创建Blob URL的技术。在App B中,您可以为worker脚本创建一个Blob URL,而不是直接将脚本URL传递给Worker构造函数。这允许工作器在App A的上下文中运行,同时保持其独立性。

const workerScript = `
  // Contents of myworker.ts
  self.onmessage = function (e) {
    // Worker logic
    self.postMessage("Message received by the worker");
  };
`;

const blob = new Blob([workerScript], { type: "application/javascript" });
const workerUrl = URL.createObjectURL(blob);

new Worker(workerUrl);

myworker.ts中的worker脚本嵌入在workerScript字符串中。然后,这个字符串被转换为一个Blob对象,并使用URL.createObjectURL()分配一个URL。最后,Worker构造函数与这个创建的URL一起提供。

bt1cpqcv

bt1cpqcv2#

解决方案1:使用Blob在内存中创建一个类似文件的对象。Blob对象可以创建Web Worker。
Blob对象不受与常规文件相同的安全限制,也就是说,即使两个源不同,您也可以从Blob创建Web Worker。

const workerBlob = new Blob([workerSource],               {type: "application/javascript"});
  const worker = new Worker(workerBlob);

解决方案2:使用Service Workers作为创建后台工作者的方法,即使用户没有积极使用应用程序,这些工作者也可以运行。使用Service Worker创建可从App A和App B访问的Web Worker。

const sw = new ServiceWorker();
  sw.register("./serviceworker.js");

  const worker = new Worker("/serviceworker.js/worker.js");

与Blob具有相同的优势
解决方案3:使用跨域资源共享(CORS)允许从不同的源加载工作者脚本。这可以通过向worker脚本添加header来完成:

Access-Control-Allow-Origin: *
  Access-Control-Allow-Headers: Content-Type

参考文献:

相关问题