メインコンテンツへ飛ぶ

マルチスレッド

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')