メインコンテンツへ飛ぶ

ipcRenderer

History

レンダラープロセスからメインプロセスに非同期通信をします。

Process: Renderer

ipcRenderer モジュールは Event Emitter を継承しています。 レンダラープロセス (ウェブページ) からメインプロセスに同期及び非同期メッセージを送れるように、いくつかのメソッドを提供します。 メインプロセスからの返信を受け取ることもできます。

See IPC tutorial for code examples.

メソッド

ipcRenderer オブジェクトは、イベントを受け取り、送るために以下のメソッドがあります。

ipcRenderer.on(channel, listener)

channel に新しいメッセージが来たときに listenerlistener(event, args...) として呼ばれます、

警告

Do not expose the event argument to the renderer for security reasons! Wrap any callback that you receive from the renderer in another function like this: ipcRenderer.on('my-channel', (event, ...args) => callback(...args)). Not wrapping the callback in such a function would expose dangerous Electron APIs to the renderer process. See the security guide for more info.

ipcRenderer.off(channel, listener)

指定した channel の listener 配列から、指定した listener を削除します。

ipcRenderer.once(channel, listener)

イベントに対する一回限りの listener 関数を追加します。 この listener は、次にメッセージが channel へ送信されたときに、削除されてから呼び出されます。

ipcRenderer.addListener(channel, listener)

ipcRenderer.on の別名です。

ipcRenderer.removeListener(channel, listener)

ipcRenderer.off の別名です。

ipcRenderer.removeAllListeners([channel])

  • channel string (任意)

Removes all listeners from the specified channel. Removes all listeners from all channels if no channel is specified.

ipcRenderer.send(channel, ...args)

  • channel string
  • ...args any[]

引数と共に、channel を介してメインプロセスに非同期メッセージを送信します。 引数は window.postMessage と同じように 構造化複製アルゴリズム によってシリアライズされるため、プロトタイプチェーンは含まれません。 関数、Promise、Symbol、WeakMap、WeakSet の送信は、例外が送出されます。

注意: DOM オブジェクトや特殊な Electron オブジェクトなど、非標準の JavaScript 型を送信すると例外が発生します。

メインプロセスでは ImageBitmapFileDOMMatrix などの DOM オブジェクトをサポートしていません。そのため、これらのオブジェクトをメインプロセスでデコードする方法がなく、Electron の IPC を介してメインプロセスに送信することはできません。 IPC 経由でこのようなオブジェクトを送信するとエラーになります。

The main process handles it by listening for channel with the ipcMain module.

MessagePort をメインプロセスに転送する必要がある場合は、ipcRenderer.postMessage を使用してください。

メソッド呼び出しの結果のようにメインプロセスから応答を一つだけ受け取りたい場合は、ipcRenderer.invoke の使用を検討してください。

ipcRenderer.invoke(channel, ...args)

  • channel string
  • ...args any[]

戻り値 Promise<any> - メインプロセスからの応答で解決します。

channel を介して非同期でメインプロセスにメッセージを送信し、結果を待ちます。 引数は window.postMessage と同じように 構造化複製アルゴリズム によってシリアライズされるため、プロトタイプチェーンは含まれません。 関数、Promise、Symbol、WeakMap、WeakSet の送信は、例外が送出されます。

The main process should listen for channel with ipcMain.handle().

以下がその例です。

// レンダラープロセス
ipcRenderer.invoke('some-name', someArgument).then((result) => {
// ...
})

// メインプロセス
ipcMain.handle('some-name', async (event, someArgument) => {
const result = await doSomeWork(someArgument)
return result
})

MessagePort をメインプロセスに転送する必要がある場合は、ipcRenderer.postMessage を使用してください。

メッセージの応答が必要ない場合は、ipcRenderer.send の使用を検討してください。

注意 DOM オブジェクトや特殊な Electron オブジェクトなど、非標準の JavaScript 型を送信すると例外が発生します。

メインプロセスでは ImageBitmapFileDOMMatrix などの DOM オブジェクトをサポートしていません。そのため、これらのオブジェクトをメインプロセスでデコードする方法がなく、Electron の IPC を介してメインプロセスに送信することはできません。 IPC 経由でこのようなオブジェクトを送信するとエラーになります。

注意 メインプロセスのハンドラがエラーを送出すると、 invoke が返す Promise は拒否されます。 ただし、レンダラープロセスの Error オブジェクト はメインプロセスでのものと異なります。

ipcRenderer.sendSync(channel, ...args)

  • channel string
  • ...args any[]

Returns any - The value sent back by the ipcMain handler.

channel を介して同期でメインプロセスにメッセージを送信し、結果を待ちます。 引数は window.postMessage と同じように 構造化複製アルゴリズム によってシリアライズされるため、プロトタイプチェーンは含まれません。 関数、Promise、Symbol、WeakMap、WeakSet の送信は、例外が送出されます。

注意: DOM オブジェクトや特殊な Electron オブジェクトなど、非標準の JavaScript 型を送信すると例外が発生します。

メインプロセスでは ImageBitmapFileDOMMatrix などの DOM オブジェクトをサポートしていません。そのため、これらのオブジェクトをメインプロセスでデコードする方法がなく、Electron の IPC を介してメインプロセスに送信することはできません。 IPC 経由でこのようなオブジェクトを送信するとエラーになります。

The main process handles it by listening for channel with ipcMain module, and replies by setting event.returnValue.

⚠️ 警告: 同期メッセージを送信すると、応答を受信するまでレンダラープロセス全体がブロックされます。そのため、このメソッドは最終手段として使用してください。 It's much better to use the asynchronous version, invoke().

ipcRenderer.postMessage(channel, message, [transfer])

  • channel string
  • message any
  • transfer MessagePort[] (任意)

メッセージをメインプロセスに送信し、任意でゼロ個以上の MessagePort オブジェクトの所有権を転送します。

転送した MessagePort オブジェクトは、発生したイベントの ports プロパティにアクセスすることで、MessagePortMain オブジェクトとしてメインプロセスで利用可能になります。

以下がその例です。

// レンダラープロセス
const { port1, port2 } = new MessageChannel()
ipcRenderer.postMessage('port', { message: 'hello' }, [port1])

// メインプロセス
ipcMain.on('port', (e, msg) => {
const [port] = e.ports
// ...
})

MessagePortMessageChannel の使用方法の詳細については MDN のドキュメント を参照してください。

ipcRenderer.sendToHost(channel, ...args)

  • channel string
  • ...args any[]

ipcRenderer.send に似ていますが、イベントはメインプロセスの代わりにホストページの <webview> に送信されます。