マルチスレッド
Web Workers により、JavaScript を OS レベルのスレッドで実行することが可能になります。
マルチスレッド Node.js
Electron の Web Workers 内で Node.js の機能を使用するには、webPreferences
の nodeIntegrationInWorker
オプションを true
に設定する必要があります。
const win = new BrowserWindow({
webPreferences: {
nodeIntegrationInWorker: true
}
})
nodeIntegrationInWorker
は nodeIntegration
とは独立して使用できますが、サンドボックス
は true
に設定してはなりません。
注意: サンドボックスポリシーの非互換性により、このオプションは SharedWorker
や Service Worker
では利用できません。
利用可能な API
Node.js の 組み込みモジュールはすべて Web Workers でサポートされており、asar
アーカイブは Node.js API で読み取ることができます。 しかし、Electron の組み込みモジュールは、マルチスレッド環境では使用できません。
ネイティブ Node.js モジュール
任意のネイティブ Node.js モジュールを Web Workers に直接ロードできますが、そのようにしないことを強く推奨します。 既存のネイティブモジュールのほとんどはシングルスレッド環境を想定して作成されており、Web Workers でそれらを使用するとクラッシュやメモリ破壊につながります。
ネイティブ Node.js モジュールがスレッドセーフであっても、process.dlopen
関数はスレッドセーフではないため、Web Worker でロードするのは安全ではありません。
ネイティブモジュールを安全にロードする唯一の方法は、Web Workers の起動後にアプリがネイティブモジュールをロードしないようにすることです。
process.dlopen = () => {
throw new Error('Load native module is not safe')
}
const worker = new Worker('script.js')