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で送ればプロセス内なので連想配列も無事送ることができた。