ipcRenderer
レンダラープロセスからメインプロセスに非同期通信を行います。
プロセス: レンダラー
ipcRenderer
モジュールはEventEmitterです。レンダラープロセス(ウェブページ)からメインプロセスに同期および非同期メッセージを送信するためのいくつかのメソッドを提供します。メインプロセスから応答を受信することもできます。
コードの例については ipc チュートリアルを参照してください。
メソッド
ipcRenderer
モジュールには、イベントに応答しメッセージを送信するための次のメソッドがあります。
ipcRenderer.on(channel, listener)
channel
文字列listener
関数event
IpcRendererEvent...args
any[]
channel
をリッスンし、新しいメッセージが届くとlistener
がlistener(event, args...)
で呼び出されます。
ipcRenderer.off(channel, listener)
channel
文字列listener
関数event
IpcRendererEvent...args
any[]
ipcRenderer.removeListener
のエイリアスです。
ipcRenderer.once(channel, listener)
channel
文字列listener
関数event
IpcRendererEvent...args
any[]
イベントに対して listener
関数を1回追加します。この listener
は、channel
にメッセージが送信されたときに1回だけ呼び出され、その後削除されます。
ipcRenderer.addListener(channel, listener)
channel
文字列listener
関数event
IpcRendererEvent...args
any[]
ipcRenderer.on
の別名です。
ipcRenderer.removeListener(channel, listener)
channel
文字列listener
関数event
IpcRendererEvent...args
any[]
指定された channel
のリスナ配列から、指定された listener
を削除します。
ipcRenderer.removeAllListeners(channel)
channel
文字列
すべてのリスナ、または指定された channel
のリスナを削除します。
ipcRenderer.send(channel, ...args)
channel
文字列...args
any[]
channel
経由でメインプロセスに非同期メッセージを送信します(引数あり)。 引数は 構造化されたクローンアルゴリズム でシリアル化されるため、window.postMessage
と同様に、プロトタイプチェーンは含まれません。 関数、Promise、シンボル、WeakMap、またはWeakSetを送信すると、例外が発生します。
注意: DOMオブジェクトや特別なElectronオブジェクトなどの標準外のJavaScriptタイプを送信すると、例外が発生します。
メインプロセスは
ImageBitmap
、File
、DOMMatrix
などのDOMオブジェクトをサポートしていないため、このようなオブジェクトはElectronのIPCを介してメインプロセスに送信できません。メインプロセスにはそれらをデコードする方法がないからです。このようなオブジェクトをIPC経由で送信しようとすると、エラーが発生します。
メインプロセスは ipcMain
モジュールで channel
をリッスンして処理します。
MessagePort
をメインプロセスに転送する必要がある場合は、ipcRenderer.postMessage
を使用します。
メソッド呼び出しの結果など、メインプロセスから単一の応答を受信する必要がある場合は、ipcRenderer.invoke
を使用することを検討してください。
ipcRenderer.invoke(channel, ...args)
channel
文字列...args
any[]
Promise<any>
を返します。メインプロセスからの応答で解決されます。
channel
経由でメインプロセスにメッセージを送信し、結果を非同期で取得します。 引数は 構造化されたクローンアルゴリズム でシリアル化されるため、window.postMessage
と同様に、プロトタイプチェーンは含まれません。 関数、Promise、シンボル、WeakMap、またはWeakSetを送信すると、例外が発生します。
メインプロセスは ipcMain.handle()
で channel
をリッスンする必要があります。
たとえば
// Renderer process
ipcRenderer.invoke('some-name', someArgument).then((result) => {
// ...
})
// Main process
ipcMain.handle('some-name', async (event, someArgument) => {
const result = await doSomeWork(someArgument)
return result
})
MessagePort
をメインプロセスに転送する必要がある場合は、ipcRenderer.postMessage
を使用します。
メッセージに対する応答が必要ない場合は、ipcRenderer.send
を使用することを検討してください。
注意: DOMオブジェクトや特別なElectronオブジェクトなどの標準外のJavaScriptタイプを送信すると、例外が発生します。
メインプロセスは
ImageBitmap
、File
、DOMMatrix
などのDOMオブジェクトをサポートしていないため、このようなオブジェクトはElectronのIPCを介してメインプロセスに送信できません。メインプロセスにはそれらをデコードする方法がないからです。このようなオブジェクトをIPC経由で送信しようとすると、エラーが発生します。
注意: メインプロセスのハンドラでエラーが発生すると、
invoke
によって返されるpromiseが拒否されます。ただし、レンダラープロセスのError
オブジェクトは、メインプロセスでスローされたものと同じではありません。
ipcRenderer.sendSync(channel, ...args)
channel
文字列...args
any[]
any
を返します -
ハンドラーから返された値。ipcMain
channel
経由でメインプロセスにメッセージを送信し、結果を同期的に待機します。引数は構造化されたクローンアルゴリズム
を使用してシリアル化されます(
と同様)。したがって、プロトタイプチェーンは含まれません。Function、Promise、Symbol、WeakMap、WeakSetを送信すると例外がスローされます。window.postMessage
注意: DOMオブジェクトや特別なElectronオブジェクトなどの標準外のJavaScriptタイプを送信すると、例外が発生します。
メインプロセスは
ImageBitmap
、File
、DOMMatrix
などのDOMオブジェクトをサポートしていないため、このようなオブジェクトはElectronのIPCを介してメインプロセスに送信できません。メインプロセスにはそれらをデコードする方法がないからです。このようなオブジェクトをIPC経由で送信しようとすると、エラーが発生します。
メインプロセスは
モジュールでipcMain
channel
をリッスンして処理し、event.returnValue
を設定することで応答します。
⚠️ 警告: 同期メッセージを送信すると応答が受信されるまでレンダラープロセス全体がブロックされるので、このメソッドは最後の手段としてのみ使用してください。非同期バージョンの
を使用する方がはるかに適切です。
invoke()
ipcRenderer.postMessage(channel, message, [transfer])
channel
文字列message
anytransfer
MessagePort[](任意)
メインプロセスにメッセージを送信します。オプションで、0個以上の
オブジェクトの所有権を転送します。MessagePort
転送されたMessagePort
オブジェクトは、生成されたイベントのports
プロパティにアクセスすることで、メインプロセスで
オブジェクトとして利用できます。MessagePortMain
たとえば
// Renderer process
const { port1, port2 } = new MessageChannel()
ipcRenderer.postMessage('port', { message: 'hello' }, [port1])
// Main process
ipcMain.on('port', (e, msg) => {
const [port] = e.ports
// ...
})
MessagePort
とMessageChannel
の使用の詳細については、MDNのドキュメント
を参照してください。
ipcRenderer.sendToHost(channel, ...args)
channel
文字列...args
any[]
ipcRenderer.send
のようですが、イベントはメインプロセスではなくホストページの<webview>
要素に送信されます。