跳到主要內容

多執行緒

透過 Web Workers,可以在作業系統層級的執行緒中執行 JavaScript。

多執行緒 Node.js

可以在 Electron 的 Web Workers 中使用 Node.js 功能,為此,應在 webPreferences 中將 nodeIntegrationInWorker 選項設定為 true

const win = new BrowserWindow({
webPreferences: {
nodeIntegrationInWorker: true
}
})

nodeIntegrationInWorker 可以獨立於 nodeIntegration 使用,但 sandbox 不得設定為 true

注意: 此選項在 SharedWorkerService Worker 中不可用,因為沙箱政策不相容。

可用的 API

Web Workers 支援所有 Node.js 的內建模組,並且仍然可以使用 Node.js API 讀取 asar 封存檔。但是,Electron 的內建模組都不能在多執行緒環境中使用。

原生 Node.js 模組

任何原生 Node.js 模組都可以直接在 Web Workers 中載入,但強烈建議不要這樣做。大多數現有的原生模組都是假設單執行緒環境而編寫的,在 Web Workers 中使用它們將導致崩潰和記憶體損壞。

請注意,即使原生 Node.js 模組是執行緒安全的,但在 Web Worker 中載入它仍然不安全,因為 process.dlopen 函數不是執行緒安全的。

目前安全載入原生模組的唯一方法是確保應用程式在 Web Workers 啟動後不載入任何原生模組。

process.dlopen = () => {
throw new Error('Load native module is not safe')
}
const worker = new Worker('script.js')