質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

1回答

2200閲覧

ElectronのnodeIntegrationをfalseとしたときのプロセス間通信について

huinki

総合スコア10

Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

1グッド

2クリップ

投稿2019/02/01 06:02

編集2019/02/01 06:24

ElectronのBrowserWindowモジュールの設定でnodeIntegrationをfalseとした場合はレンダラープロセスからメインプロセスで定義している関数を呼び出すことは不可能でしょうか?

main.js

1exports.testFunc = () => { 2 return 'success'; 3}

renderer.js

1const main = require('electron').remote.require('./main'); 2 3const result = main.testFunc(); 4console.log(result);

Cannot read property 'require' of undefind
とエラーになります。

参考にしたページは以下となります。
https://electronjs.org/docs/api/remote

nodeIntegrationの設定をfalseとしている状態で、プロセス間通信は実現可能なのでしょうか。

このようにすれば実現可能などあれば、ざっくりで良いのでアドバイス頂ければと思います。
よろしくお願いします。

y-ymo10👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

同じところで引っかかったので調べたところ、以下のISSUEが見つかりました。
https://github.com/electron/electron/issues/5113
こちらによると nodeIntegration:false の状態でIPCにアクセス出来ないのは仕様とのことです。

Electron4以降は、nodeIntegrationの指定をしない場合、以下の警告が発生します。

Electron Deprecation Warning (nodeIntegration default change) This window has node integration enabled by default. In Electron 5.0.0, node integration will be disabled by default. To prepare for this change, set {nodeIntegration: true} in the webPreferences for this window, or ensure that this window does not rely on node integration and set {nodeIntegration: false}.

ですので、単純にこの警告を回避したいだけなのであれば、 nodeIntegration:trueを設定し、IPCにアクセスするのが簡単です。

他の方法としては、BrowserWindowwebPreferences.preloadで読み込む方法もあります。

js

1new BrowserWindow({ 2 webPreferences: { 3 nodeIntegration: false, 4 preload: __dirname + '/preload.js', //フルパスの指定が必要 5 } 6});

js

1// preload.js 2const electron = require('electron'); 3global.electron = electron;

このようにして、preload.jsからglobalオブジェクトにrequireしたものをセットしておくと、
nodeIntegration:falseであっても、rendererプロセスからwindow.electronのように参照することができます。

但し、この手法を取った場合、Electron4では更に以下のような警告が表示されます。

Electron Deprecation Warning (contextIsolation default change) This window has context isolation disabled by default. In Electron 5.0.0, context isolation will be enabled by default. To prepare for this change, set {contextIsolation: false} in the webPreferences for this window, or ensure that this window does not rely on context isolation being disabled, and set {contextIsolation: true}.

For more information, see https://electronjs.org/docs/tutorial/security#3-enable-context-isolation-for-remote-content

要は、Electron5からはcontextIsolation: trueがデフォルトになるとの警告なのですが、

js

1new BrowserWindow({ 2 webPreferences: { 3 nodeIntegration: false, 4 contextIsolation: true, 5 preload: __dirname + '/preload.js', 6 } 7});

とした場合、preload.jsglobalと、rendererプロセスのwindowが分離されるため、明示的にcontextIsolation: falseを指定する必要があります。

投稿2019/04/08 06:53

sansaisoba

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問