Electronではレンダーとサーバーは別プロセスなので、情報交換はプロセス間通信となる。
そんな訳で情報交換には多少の制約はありそうだ。
以下の例はプロセス間(レンダーとサーバー)で配列をやり取りしている。
サーバー側
- index.js
レンダー側
- render.js
- subrender.js
全ソースは以下。
index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Electron ipc test</title> <script type="text/javascript" src="render.js"></script> </head> <body> <div>ipc test !</div> </body> </html>
index.js
'use strict'; var electron = require('electron'); var app = electron.app; var BrowserWindow = electron.BrowserWindow; var mainWindow = null; app.on( 'window-all-closed', function() { if (process.platform != 'darwin') app.quit(); } ); app.on( 'ready', function() { mainWindow = new BrowserWindow({width: 500, height: 300}); mainWindow.loadURL('file://' + __dirname + '/index.html'); mainWindow.webContents.openDevTools(); mainWindow.on( 'closed', function() { mainWindow = null; } ); } ); electron.ipcMain.on( 'hello-from-render', function(ev, arg) { console.log('receive data from render.'); for(var key of Object.keys(arg)) console.log('key=' + key + ' v=' + arg[key]); console.log('send data from server.'); var ary = []; ary.push('A'); ary.push('B'); ary.push('C'); ary['A'] = 'a'; ary['B'] = 'b'; ary['C'] = 'c'; for(var key of Object.keys(ary)) console.log('key=' + key + ' v=' + ary[key]); console.log('send ...'); mainWindow.webContents.send('hello-from-server', ary); } );
render.js
'use strict'; var electron = require('electron'); window.onload = function() { console.log('send data from render.'); var ary = []; ary.push('A'); ary.push('B'); ary.push('C'); ary['A'] = 'a'; ary['B'] = 'b'; ary['C'] = 'c'; for(var key of Object.keys(ary)) console.log('key=' + key + ' v=' + ary[key]); console.log('send ...'); electron.ipcRenderer.send('hello-from-render', ary); console.log('send to sub ...'); require('./subrender').emit('hello-from-render', ary); } electron.ipcRenderer.on( 'hello-from-server', function(ev, arg) { console.log('receive data from server.'); for(var key of Object.keys(arg)) console.log('key=' + key + ' v=' + arg[key]); } );
subrender.js
'use strict'; var EventEmitter = require('events').EventEmitter; const event = new EventEmitter; module.exports = event; event.on( 'hello-from-render', function(arg) { console.log('receive data from render by sub.'); for(var key of Object.keys(arg)) console.log('key=' + key + ' v=' + arg[key]); } );
実行結果は以下の通り。
サーバー側のログ
receive data from render. <-- 連想配列の要素が欠落 key=0 v=A key=1 v=B key=2 v=C send data from server. key=0 v=A key=1 v=B key=2 v=C key=A v=a key=B v=b key=C v=c send ...
レンダー側のログ
send data from render. key=0 v=A key=1 v=B key=2 v=C key=A v=a key=B v=b key=C v=c send ... send to sub ... receive data from render by sub. <-- EventEmitterでは連想配列もOK。 key=0 v=A key=1 v=B key=2 v=C key=A v=a key=B v=b key=C v=c receive data from server. <-- 連想配列の要素が欠落 key=0 v=A key=1 v=B key=2 v=C
添え字の配列は渡せるが、連想配列を渡すことはできなかった。
Jsonに変換できない、というのが理由でしょうか。
因みにNode.jsのイベントモジュールEventEmitterで送ればプロセス内なので連想配列も無事送ることができた。