web-dev-qa-db-ja.com

リモートvs ipcRenderer、ipcMainを使用する場合

電子のメインプロセスとレンダラープロセス間の通信を理解しようとしています。ドキュメント https://github.com/electron/electron/blob/master/docs/api/remote.md には、「リモートモジュールがプロセス間通信(IPC )レンダラープロセスとメインプロセスの間。」

ただし、ドキュメントのセットアップ方法は非常にまばらです。

IPCのサンプルを入手できます。これは十分に単純なアプリケーションで動作します。どのようなシナリオでリモートモジュールを使用する必要がありますか?

45
user1513388

リモート ドキュメントから:

Electronでは、GUI関連のモジュール(ダイアログ、メニューなど)はメインプロセスでのみ使用でき、レンダラープロセスでは使用できません。レンダラープロセスからこれらを使用するには、メインプロセスにプロセス間メッセージを送信するためにipcモジュールが必要です。リモートモジュールを使用すると、明示的にプロセス間メッセージを送信せずにメインプロセスオブジェクトのメソッドを呼び出すことができます。 JavaのRMI。レンダラープロセスからブラウザーウィンドウを作成する例:

const remote = require('electron').remote;
const BrowserWindow = remote.BrowserWindow;

var win = new BrowserWindow({ width: 800, height: 600 });
win.loadURL('https://github.com');

基本的に、remoteモジュールを使用すると、レンダリングプロセスのメインプロセスに通常制限されている処理を、手動で大量のipcメッセージをやり取りすることなく簡単に実行できます。

したがって、レンダラープロセスでは、次の代わりに:

const ipc = require('electron').ipcRenderer;
ipc.send('show-dialog', { msg: 'my message' });
ipc.on('dialog-shown', () => { /*do stuff*/ });

(そして、それらのメッセージに応じて何かを行うようにメインでコーディングします)。

レンダラーでこれをすべて行うことができます:

const remote = require('electron').remote;
const dialog = remote.require('dialog')

dialog.showErrorBox('My message', 'hi.');

Ipcモジュールは明示的には必要ありません(ただし、舞台裏で行われています)。 2つが相互に排他的であることは言うまでもありません。

リモートを使用する際のもう1つの質問。モジュールではなくメインプロセスに存在する機能にアクセスすることは可能ですか?

あなたが本当に求めているのは、メイン/レンダラープロセス間でコードを共有する方法と、レンダラーでモジュールを必要とする方法です。

編集:通常のようにそれを要求することができます。これのエッジの場合は、レンダラーウィンドウの現在のURLがローカルファイル(file://を使用してロードされていない)を指していない場合です。リモートURLをロードする場合、必要なパスは絶対パスである必要があります。または、以下で述べたようにリモートを使用できます。

古い:

これは、remoteのもう1つの使用例です。例えば:

remote.require('./services/PowerMonitor.js')

このようなリモートを使用すると、メインプロセスのコンテキストでコードが実行されることに注意してください。それは用途があるかもしれませんが、私は注意します。

ビルトインノードモジュールまたはelectronは通常のように必要です:

require('electron')
require('fs')

レンダラーからグローバル変数にアクセスできますか?

はい。

//in main
global.test = 123;
//in renderer
remote.getGlobal('test') //=> 123
74
ccnokes