Electron さわってみた

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();

実行

tray.png (27.2 kB)

アプリの配布

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は対象外)

  1. メインプロセスでautoUpdaterのAPIをコール
  2. サーバに置いたメタデータを読む
  3. バージョンが上がっていたら自分自身を書き換える

Mac App Storeで公開

バージョン0.34.0からMac App Storeでの配布が可能。 証明書の設定が必要であったり、使えないAPIがあったりと制限がある。