多线程

使用 Web Workers可以在系统级线程中运行JavaScript。

多线程Node.js

webPreferences中将 n​​odeIntegrationInWorker选项设置为 true,可以在Electron的Web Workers中使用Node.js功能:

  1. let win = new BrowserWindow({
  2. webPreferences: {
  3. nodeIntegrationInWorker: true
  4. }
  5. })

如果要把 nodeIntegrationInWorker独立于 nodeIntegration 使用, sandbox就不能设置为 true

可用API

WebWork虽然支持Node.js的所有内置模块,也可以使用Node.js API读取asar档案。但Electron的内置模块并不能在多线程环境中使用。

原生的 Node.js 模块

由于大多数现有的原生模块已经被假设为单线程环境,在Web Workers中使用它们可能会导致崩溃和内存损坏,所以强烈建议你不要直接将本地Node.js模块加载到Web Workers中。

还要注意的是,虽然本地Node.js模块是安全的线程,但将其加载到Web中仍然是不安全的,因为 process.dlopen功能并不是一个安全线程。

现在安装原生模块的唯一方法是确保应用程序在Web Workers启动后绝不加载本地模块。

  1. process.dlopen = () => {
  2. throw new Error('Load native module is not safe')
  3. }
  4. let worker = new Worker('script.js')