0Pricing
React Academy · レッスン

プロセス間のIPC通信

ipcMainとipcRendererを使い、メインプロセスとReactのレンダラー間で安全にメッセージを送信します。

「プロセス間のIPC通信」はCoddyKit上の無料React Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

ipcMain.handle:リクエストとレスポンスのパターン

ipcMain.handleは、レンダラーからのリクエストに応答する名前付きチャンネルをメインプロセスに登録します。非同期のハンドラー関数を受け取り、その戻り値がレンダラー側のPromiseの解決値になります。そのため、ファイルの読み取りやデータベースへの問い合わせなどの操作に適しています。

ipcRenderer.invoke:メインプロセスの呼び出し

ipcRenderer.invokeは、名前付きチャンネルにメッセージを送信し、メインプロセスのハンドラーの戻り値で解決されるPromiseを返します。これにより、preloadスクリプトとReactコンポーネントの両方でasync/awaitを自然に使える、明確な非同期リクエストとレスポンスのパターンを構築できます。

contextBridge 経由で invoke を公開する

preloadスクリプトでは、ipcRenderer.invokeの呼び出しをラップしてcontextBridge経由で公開します。たとえば、api.readFile = (filePath) => ipcRenderer.invoke('read-file', filePath)のように記述します。レンダラーはwindow.api.readFile(path)を呼び出し、Promiseを受け取ります。シンプルで、サンドボックスも維持されます。

レンダラーが ipcRenderer をインポートしない理由

contextIsolationが有効な場合、レンダラープロセスはrequire('electron')を実行したり、ipcRendererを直接インポートしたりできません。そのモジュール自体を利用できないためです。すべてのIPC通信は、preloadスクリプトでcontextBridgeを介して公開する必要があります。これは意図的な設計であり、XSS攻撃によってIPCにアクセスされるのを防ぎます。

ipcMain.on:応答を待たないメッセージ

ipcMain.onは、ipcRenderer.send(invokeではありません)で送信された一方向のメッセージを待ち受けます。自動的に応答するチャンネルはありません。イベントのログ記録やネイティブ通知のトリガーなど、レンダラーが返信を必要としない通知やコマンドに適したパターンです。

メインプロセスからレンダラーへのデータ送信

メインプロセスは、webContents.send('channel-name', data)を使用してレンダラーにデータを送信できます。これは、メインプロセスから通信を開始する主な方法です。たとえば、ファイルシステムの監視イベントやネイティブメニューの操作をReact UIに転送する場合に使用します。

ipcRenderer.on:preload での待ち受け

preload スクリプトでは、ipcRenderer.on('update', callback) によってメインプロセスからのプッシュメッセージを受け取るリスナーを登録します。callback には event とメインプロセスが送信した data が渡され、それを contextBridge が公開した関数経由で renderer に渡します。

contextBridge によるイベントリスナーの公開

プッシュイベントには、次のようなパターンが適しています。api.onUpdate = (callback) => ipcRenderer.on('update', (_event, data) => callback(data)) と定義し、React コンポーネントは window.api.onUpdate(setData) を呼び出して購読します。メインプロセスが新しいデータをプッシュすると、callback が state を更新します。

イベントリスナーのクリーンアップと削除

メモリリークや callback の重複実行を防ぐため、不要になった ipcRenderer.on リスナーはすべて削除する必要があります。preload 関数は、たとえば () => ipcRenderer.removeListener('update', callback) のようなクリーンアップ関数を返し、React はそれを useEffect のクリーンアップ用 return から呼び出します。

セキュリティ:IPC 入力の検証

renderer からの IPC 入力は、メインプロセスのハンドラーでは信頼できないデータとして扱う必要があります。ファイルパスは必ず検証してパストラバーサル攻撃を防ぎ、クエリパラメーターをサニタイズし、送信元の origin が想定したものか確認してください。汎用的な eval や exec の IPC チャネルを公開してはいけません。

IPC チャネルの構成

アプリが大きくなったら、IPC チャネルに名前空間の規則を設けて整理してください。例として、'fs:read-file'、'db:query'、'window:minimize' のように命名します。チャネル名は共有の constants ファイルにまとめ、main.js と preload スクリプトの両方からインポートしてください。これにより、タイプミスを防ぎ、リファクタリングを安全に行えます。

ipcMain.handle の戻り値

ipcMain.handle のハンドラーが返した値はどうなりますか?

レッスンのまとめ

IPC は Electron における通信の中核です。ipcMain.handle と ipcRenderer.invoke は、renderer から開始する処理のための Promise ベースのリクエストとレスポンスの組み合わせです。メインプロセスから開始するプッシュには、webContents.send と ipcRenderer.on を組み合わせます。renderer 内のすべての IPC は preload の contextBridge を経由させ、メモリリークを防ぐためにリスナーは必ずクリーンアップしてください。

よくある質問

「プロセス間のIPC通信」レッスンは無料ですか?

はい。「プロセス間のIPC通信」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「プロセス間のIPC通信」で何を学びますか?

ipcMainとipcRendererを使い、メインプロセスとReactのレンダラー間で安全にメッセージを送信します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「プロセス間のIPC通信」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Electronのアーキテクチャ:メインプロセスとレンダラープロセス
  2. ElectronでReactをセットアップする
  3. プロセス間のIPC通信
  4. デスクトップ向けのパッケージ化と配布
← React Academyに戻る