SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Electron基礎入門 ~ HTML5でWin/Mac/Linuxのデスクトップアプリを作ろう

HTML5でクロスプラットフォームなデスクトップアプリを開発できる「Electron」とは

Electron基礎入門 ~HTML5でWin/Mac/Linuxのデスクトップアプリを作ろう 第1回

  • X ポスト
  • このエントリーをはてなブックマークに追加

Electronの仕組み

 ElectronはNode.jsでプログラミングできるChromiumブラウザです。初期化プロセスもブラウザと同じような手順を踏みます。

 Electronが起動すると、一番大本のBrowserプロセスが呼び出されます。

 次に、Browserプロセスが各ウィンドウ(Rendererプロセス)を生成します。各RendererプロセスとはIPC(プロセス間通信)でやりとりします。BrowserプロセスからRendererプロセスへ、「file:// からはじまるこのHTMLを呼びなさい」という命令が伝えられ、RendererプロセスがGUIをHTMLで描画するというのが一連の初期化プロセスです。Renderer1プロセスが、ブラウザでいう1つのタブにあたります。

Electronの仕組み(出典:Practice on embedding Node.js into Atom Editor
Electronの仕組み(出典:Practice on embedding Node.js into Atom Editor)

Node.jsとElectronの統合

 ElectronはどのようにNode.js[1]をChromiumを動かしているのでしょうか。ちょっと詳しく見てみましょう。Node.jsのイベントループは以下のようになります。

Node.jsのイベントループ(出典:Practice on embedding Node.js into Atom Editor
Node.jsのイベントループ(出典:Practice on embedding Node.js into Atom Editor)

 対する、WindowsやMacのGUIのイベントループはこのようになっています。

GUIのイベントループ(出典:Practice on embedding Node.js into Atom Editor
GUIのイベントループ(出典:Practice on embedding Node.js into Atom Editor)

 ElectronはNode.jsのイベントループを各プラットフォーム(Win、Mac、Linux)のGUIイベントループと統合し、IO pollだけ外部に出し、IPCで通信するようにChromiumにハックを仕込んでJavaScriptでGUIウィンドウを操作出来るようにしているのです。

Electronのイベントループ(出典:Practice on embedding Node.js into Atom Editor
Electronのイベントループ

 さらに、Electronはビルド高速化のために、様々な工夫をしています。ChromiumはChromeのオープンソース版で、非常に大きく複雑なプロジェクトなので、ビルドするだけで数十分かかってしまいます。そのため、Electronは、Chromiumをモジュール単位であらかじめビルドしておいて、libchromiumcontentという単一の共有ライブラリから、Chromium Content APIへのバインディングを用意することで、ビルドの高速化とクロスプラットフォームビルドを実現しています。

[1] Electronで動いているのは実はNode.jsのフォーク版のio.jsですが、今回はNode.jsで統一しています。

Electronの問題

 Electronは開発が非常に活発です。ほぼ3日ごとに新しいバージョンがリリースされます。バグはまだまだありますが、基本的な部分は安定して動きます。

 Electronでは、JavaScriptはNode.js上で動作します。common-jsスタイルのrequireが使えるため、ライブラリによっては、Node.jsで動くことを想定してない場合があるかもしれません。そういう場合はnode-integration: falseを指定するとよいでしょう。

 デフォルトでは、HTMLをfile:// スキーマで表示するため、Chromeのサンドボックス機能がoffになり、ローカルのファイルにアクセスできてしまいます。外部のウェブサイトにアクセスする場合は、タグを使うか、アプリ内部でhttpdを立て、http:// スキーマでアプリケーションを動作させるなどの工夫が必要です。また、ウェブアプリではないため、Twitter APIなどのOAuth認証を通すにはちょっとした工夫が必要です。

 また、配布バイナリサイズが結構大きいです。ZIPで30MB、バイナリ単体が100MBのファイルサイズになります。

まとめ

 Electronは開発元が有名なGitHub社であり、AtomやSlackなどの有名プロダクトに採用され非常に注目度が高く、開発も盛んです。

 クロスブラウザに対応しなくてはならないWebアプリとは違って、Chromiumだけを対象にすれば良いため、HTML5の機能をフルに使えます。また、ビルドも速く、ランタイムも不要なため、気軽にデスクトップアプリを作って配布できます。バイナリ連携が出来るため、社内用開発ツールを作るのにもよいでしょう。

 Node.jsを使ったことがある人にとってはすごく簡単です。逆に使ったことがない人にとってはNode.jsが邪魔になることもあるかもしれません。ファイルサイズが大きい問題もありますが、インターネットが高速化した時代なら問題にならないのかもしれません。

 Webアプリケーションをそのままクロスプラットフォームのデスクトップアプリにできるというのは、プロダクションアプリに限らず、ゲームや、業務アプリなど、幅広い活用法があります。

 次回からは、Electronの実行環境構築と簡単なサンプルアプリを作っていきます。それでは、良いElectronライフを!

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
この記事の著者

森 和之(モリ カズユキ)

 フロントエンドからバックエンドまで開発する猫エンジニア。 2007年に株式会社ミクシィに最初の新卒として入社。mixiアプリ・mixiプラットフォームのプロジェクト立ち上げから開発に携わった。 スタートアップに関わった後、トップゲート社に転職し、ユーザーに一番近いところから世界の見方が変わるプロダクトの開発を目指す。 最近はDockerとNodeとElectronに夢中。 Twitter: mainyaa GitHub: mainyaa

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8782 2015/07/02 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング