Electronとは
- GitHub.inc が開発
- HTML5 で OSX, Windows, Linux のデスクトップアプリを開発できる実行環境
- Atom の実行環境としても使われいて Atom Shell と呼ばれていた
- JS の実行エンジンとして Node.js、HTML5 の実行環境として Chromium を使用
- ビルドしたアプリには Chromium が内蔵されるので特別なインストールは不要。スタンドアローンアプリとして配布可。
Electron の採用事例
- Atom エディタ
- Visual Studio Code
- Slack の Windows 版
- Kobito の Windows 版
- Docker GUI
他の類似技術との比較
via 初めてのElectron! HTML5でデスクトップアプリを作成しよう - ICS MEDIA
Electronの場合、エントリポイントがjsファイルなのでhtmlはなくてもOK
使用できる技術
- Node.js / npmライブラリ
- React や AngularJS などのフレームワーク
- Chromium の webview など
- Chrome Developer Tools
- ELectron が提供するモジュール郡やHTML5の独自拡張
- ローカルファイルやOSのAPIへのアクセス
webとネイティブのいいとこどり。
2つの内部プロセス
以下の2つのプロセスに実行される JS のプログラムを書く。
- メインプロセス
- 起動時に実行
- OS とのやりとりをするバックエンド処理
- レンダラプロセス
- メインプロセスから起動
- HTML/CSSによる描画やブラウザコンテキストのJSの実行
それぞれコンテキストが異なるので両者間で通信するには IPC(プロセス間通信) を行う必要あり。
install
npm install -g electron-prebuilt
electron -v
> v0.36.7
Hello World と表示する
package.json
{
"name": "hello-electron",
"name": "main.js"
}
main.js
var app = require('app');
var BrowserWIndow = require('browser-window');
var mainWindow = null;
app.on('window-all-closed', function(){
if(process.platform != 'darwin'){
app.quit();
}
});
app.on('ready', functin(){
mainWindow = new BrowserWindow(
{ width: 800, height: 600}
);
mainWindow.loadUrl(
'file://' + __dirname + '/index.html'
);
mainWindow.on('closed', function(){
mainWindow = null;
});
});
index.html
<html>
<head><title>Hello, World</title></head>
<body>
<h1>Hello, world</h1>
<ul>
<li>Node.js <script>document.write(process.version)</script></li>
<li>Electron <script>document.write(process.versions.electron)</script></li>
</ul>
</body>
</html>
実行
electron .
Markdown Viewer を作る
npm library
npm install markdown --save
npm install chokidar --save
main.js
さっきと同じ
index.html
<html>
<head><title>Markdown Viewer</title></head>
<body>
<div id="container"></div>
<script src="app.js"></script>
</body>
</html>
app.js
var fs = require('fs');
var markdown = require('markdown').markdown;
var chokidar = require('chokidar');
var watcher = chokidar.watch('./README.md');
watcher.on('add', updateHTML);
watcher.on('change', updateHTML);
var container = document.getElementById('container');
function updateHTML(path, stats){
fs.readFile(path, 'utf8', function(err,content){
container.innerHTML = markdown.toHTML(content);
});
}
実行
clipboard 監視アプリ
- webviewタグ
- chromium の機能
- clipboardモジュール
- Electronが提供するモジュール
main.js
さっきと同じ
index.html
<html>
<head><title>Clipboard Monitor</title></head>
<body>
<div id="container"></div>
<webview id="webview"></webview>
<script src="app.js"></script>
</body>
</html>
app.js
var clipboard = require('clipboard');
var container = document.getElementById('container');
var webview = document.getElementById('webview');
var current = '';
setInterval(function(){
var url = clipboard.readText();
if(url.match(/^https?:\/\//) && current !== url){
container.innerText = current = url;
webview.setAttribute('src', url);
}
}, 500);
実行
トレイアプリ
main.js
var app = require('app');
var Menu = require('menu');
var Tray = require('tray');
var appIcon = null;
app.on('ready', function(){
appIcon = new Tray('./icon.jpg');
var contextMenu = Menu.buildFromTemplate([
{label: '晴', type:'radio'},
{label: '曇り', type:'radio'},
{label: '雨', type:'radio'},
{type:'separator'},
{
label: '終了',
accelerator: 'Command+Q',
click: function(){
app.quit();
}
}
]);
appIcon.setContextMenu(contextMenu);
});
app.dock.hide();
実行
アプリの配布
npm install -g --save electron-packager
// OS X, Windows向けにパッケージング、2回目以降は上書きで
electron-packager . helloApp --platform=darwin,win32 --arch=x64 --version=0.36.7 --overwrite
パラメータの詳細は公式のusageを
インストーラとしてdmgファイル化したい場合は electron-builder を使う
アプリのバージョンアップ
一度配布したアプリのバージョンアップを促すにはOS標準のautoUpdaterを利用すると良い(linuxは対象外)
- メインプロセスでautoUpdaterのAPIをコール
- サーバに置いたメタデータを読む
- バージョンが上がっていたら自分自身を書き換える
Mac App Storeで公開
バージョン0.34.0からMac App Storeでの配布が可能。 証明書の設定が必要であったり、使えないAPIがあったりと制限がある。