node.js - 当worker中启用 Node 集成时,如何在Electron中注册Service Worker?

标签 node.js electron

我正在尝试在一个简单的 Electron 应用程序中注册一个服务 worker (为了复制,您可以使用 https://github.com/Robinfr/electron-react-typescript ),但它不断崩溃。更具体地说,窗口打开,但 DevTools 总是崩溃并断开连接,因此应用程序无法加载。

我正在尝试使用服务工作人员来拦截我正在开发的应用程序所需的网络请求。

我发现,当您通过 nodeIntegrationInWorker 在工作线程中启用 Node 集成时,尤其会出现此问题。当此选项被禁用时,它可以工作,我可以安装软件。然而,当您启用此选项时,一切都会崩溃。

要重现此情况,您可以从上面克隆样板并使用以下窗口配置:

new BrowserWindow({
  width: 800,
  height: 600,
  webPreferences: {
    nodeIntegration: true,
    sandbox: false,
    nodeIntegrationInWorker: true // <-- this causes the DevTools to crash
  }
});

您还必须修改 webpack.renderer.dev.config.js 并将以下选项添加到 devServer:

contentBase: path.resolve(__dirname, 'public'),
watchContentBase: true,

然后,在项目根目录中创建一个名为 public 的文件夹,并添加一个名为 sw.js 的文件。

问题是,对于我正在开发的应用程序,我不仅有软件,而且还有网络工作人员内部的 Node 。所以我需要找到解决这个问题的方法。

我花了一些时间寻找类似的问题,但找不到任何东西,尤其是没有找到解决我的问题的方法。

还有想法吗?

最佳答案

如果渲染器线程和工作线程都启用了 Node 集成,我终于弄清楚如何使用服务工作线程。我花了一段时间,但您可以使用 webview 标记来实现此目的,请参阅 Documentation 。根据Chromium documentationwebview 标签可用于:

[...] embed 'guest' content (such as web pages) in your Chrome App. The guest content is contained within the webview container; an embedder page within your Chrome App controls how the guest content is laid out and rendered.

因此它类似于 iframe,但 webview 在与您的应用单独的进程中运行。它没有与您的网页相同的权限,并且您的应用和嵌入内容之间的所有交互都将是异步的。

在 Electron 中,webview 不被视为工作线程,因为它位于不同的进程中,也就是说不在渲染器线程中运行,如果为渲染器和工作线程启用了 Node 集成,则它无法访问 Node API 。有一个选项可以为 webview 启用此功能,但就我而言,我特别不想访问 Node ,因为不知何故,这总是导致我的 Electron 应用程序崩溃。

我的解决方案:

webview 嵌入到加载注册 SW 的 HTML 文件的页面上。

这似乎有效,但我必须承认,如果启用 Node 集成,如果您尝试在渲染器线程中注册 SW,我仍然不确定为什么 Electron 会崩溃。也许这与本地 Node 模块是在单线程环境下编写的这一事实有关。这是他们的 docs on multithreading 的摘录.

Any native Node.js module can be loaded directly in Web Workers, but it is strongly recommended not to do so. Most existing native modules have been written assuming single-threaded environment, using them in Web Workers will lead to crashes and memory corruptions.

关于node.js - 当worker中启用 Node 集成时,如何在Electron中注册Service Worker?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59107643/

相关文章:

electron - 如何从 Electron 获取原生节点模块? ref 和 ffi 模块出现错误

javascript - 如何抓取存储在html页面中的图像

javascript - 如何使用 Electron (如 steam-overlay)创建应用程序

javascript - Mongoose 尝试使用 Promise 处理预保存错误

javascript - .sort() 根本不工作( Mongoose )

node.js - 在使用electron-builder安装应用程序的同时,向用户环境添加命令行脚本

javascript - Electron 加载远程URL和加载本地文件

javascript - 使用 Google Home 或 Alexa 的 TTS

javascript - 对 nodejs 服务器的 jquery ajax 请求仅适用于页面刷新

node.js - Sequelize 获取最近的位置获取点