多线程
借助 Web Workers,可以在操作系统级别的线程中运行 JavaScript。
多线程 Node.js
可以在 Electron 的 Web Worker 中使用 Node.js 功能,为此,应在 webPreferences
中将 nodeIntegrationInWorker
选项设置为 true
。
const win = new BrowserWindow({
webPreferences: {
nodeIntegrationInWorker: true
}
})
nodeIntegrationInWorker
可以独立于 nodeIntegration
使用,但 sandbox
不能设置为 true
。
注意
由于沙盒策略不兼容,此选项在 SharedWorker
s 或 Service Worker
s 中不可用。
可用 API
Node.js 的所有内置模块都在 Web Worker 中受支持,并且可以使用 Node.js API 读取 asar
归档。然而,Electron 的内置模块都不能在多线程环境中使用。
原生 Node.js 模块
任何原生 Node.js 模块都可以直接在 Web Worker 中加载,但强烈建议不要这样做。大多数现有的原生模块都是在假定单线程环境下编写的,在 Web Worker 中使用它们将导致崩溃和内存损坏。
请注意,即使原生 Node.js 模块是线程安全的,在 Web Worker 中加载它仍然不安全,因为 process.dlopen
函数不是线程安全的。
目前安全加载原生模块的唯一方法是确保在 Web Worker 启动后,应用程序不加载任何原生模块。
process.dlopen = () => {
throw new Error('Load native module is not safe')
}
const worker = new Worker('script.js')