<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>Electron &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/electron/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>Electron、React Native、Cordova…Web技術でネイティブアプリ開発する方法を、アシアル田中さんに聞いた</title>
		<link>/shumpei-shiraishi/24253/</link>
		<pubDate>Wed, 20 Sep 2017 01:00:22 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Cordova]]></category>
		<category><![CDATA[Electron]]></category>
		<category><![CDATA[React Native]]></category>
		<category><![CDATA[アシアル]]></category>
		<category><![CDATA[ネイティブアプリ]]></category>

		<guid isPermaLink="false">/?p=24253</guid>
		<description><![CDATA[連載： HTML5 Conference 2017特集 (7)こんにちは、編集長の白石です。 この記事は、9月24日に開催されるHTML5 Conference 2017に登壇するエキスパートに、予定しているセッションの...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2017/" class="series-457" title="HTML5 Conference 2017特集" data-wpel-link="internal">HTML5 Conference 2017特集</a> (7)</div><p>こんにちは、編集長の白石です。</p>

<p>この記事は、9月24日に開催される<a href="http://events.html5j.org/conference/2017/9/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference 2017</a>に登壇するエキスパートに、予定しているセッションのトピックを中心に、様々な技術的なお話を伺おうというものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。</p>

<p>今回お話を伺ったのは、アシアル株式会社 代表取締役社長の田中正裕さんです。</p>

<p><img src="/wp-content/uploads/2017/09/DSC05050.jpg" alt="" width="640" height="416" class="alignnone size-full wp-image-24312" srcset="/wp-content/uploads/2017/09/DSC05050.jpg 640w, /wp-content/uploads/2017/09/DSC05050-300x195.jpg 300w, /wp-content/uploads/2017/09/DSC05050-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>田中さんのセッションは「<a href="http://events.html5j.org/conference/2017/9/session/#h3" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web技術でネイティブアプリを開発する話</a>」（ホール 14:20-15:00）です。
（現在<a href="https://html5j.connpass.com/event/64992/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference</a>は定員オーバーの状態ですが、無料イベントということもあってキャンセルも多めに出るらしいので、あきらめずにキャンセル待ちすることをお勧めします！）</p>

<h2>Webとネイティブ境目が曖昧になってきた</h2>

<p><b class="speaker">白石:</b> 田中さんは、ずっとWebとネイティブのハイブリッドアプリの分野で活躍してらっしゃいます。そんな田中さんから見て、最近のWebやモバイルアプリ開発についてはどのように見ていらっしゃいますか？</p>

<p><b class="speaker">田中:</b> はい、まずはそもそも<strong>最近Webがネイティブにかなり近づいてきた</strong>な、と思っています。</p>

<p>例えば<strong>実現できる機能</strong>。以前はWebとネイティブはできることに差がありましたが、最近はWebにできることがすごく増えてきています。Service Workerの登場で、以前はWebでは実現が難しかった、プッシュ通知やバックグラウンド処理なども可能になってきている。</p>

<p>ネイティブは<strong>コードがバイナリにコンパイルされて高速に動く</strong>、という点でも、Web Assemblyの登場により、今後は目立ったディスアドバンテージではなくなっていくでしょう。そもそも、端末速度の向上とブラウザエンジンの高速化で、速度差自体が目立たなくなってきています。</p>

<p><b class="speaker">白石:</b> Web Assemblyは期待ですよね。そのうち、フルWeb AssemblyのWebアプリフレームワークが出たりするのではないか、と期待しています。</p>

<p><b class="speaker">田中:</b> きっと出るでしょうね。<strong>iOS 11がWeb Assemblyに対応したことも、すごく大きな意味を持っていると思います</strong>。</p>

<p>他には、<strong>アプリの起動方法</strong>も違いとしてよく挙げられていましたが、Webはブラウザからアクセスするもので、ネイティブはインストールして使用するもの、という区分けも最近意味がなくなってきました。例えばProgressive Web Appsなんかはその象徴ですよね。ブラウザがWebアプリを端末にインストールしたら、あとはネイティブアプリと遜色なく動作する。</p>

<p><img src="/wp-content/uploads/2017/09/cfcaf6eeddc91267089972517eadeac9.jpg" alt="" width="640" height="413" class="alignnone size-full wp-image-24313" srcset="/wp-content/uploads/2017/09/cfcaf6eeddc91267089972517eadeac9.jpg 640w, /wp-content/uploads/2017/09/cfcaf6eeddc91267089972517eadeac9-300x194.jpg 300w, /wp-content/uploads/2017/09/cfcaf6eeddc91267089972517eadeac9-207x134.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">白石:</b> Safariには昔から、ホームスクリーンにWebサイトへのブックマークを追加する機能がありますが、それがもっとスマートな形で実現しそうですね。</p>

<p><b class="speaker">田中:</b> そして、<strong>Web技術を使ってアプリを作る方法自体が今や多様化していて</strong>、以前のような「Webかネイティブか」という単純な二分法じゃなくなっているんですよね。</p>

<h2>Electron</h2>

<p><b class="speaker">白石:</b> はい、その多様化したアプリ開発手法を本日は伺いに参りました。一つ一つ教えてください。</p>

<p><b class="speaker">田中:</b> カンファレンスのセッションではコード例を挙げながらお話しようと思いますが、今日は口頭による説明で進めましょう。</p>

<p>ではまず最初に、<strong><a href="https://electron.atom.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Electron</a></strong>の紹介からいきたいと思います。クロスプラットフォームなデスクトップアプリを開発するためのフレームワークで、元々はGitHubが開発した「Atom Shell」というツールでした。</p>

<p><img src="/wp-content/uploads/2017/09/b309412fccac651c5527b1f2b991dac3-640x519.png" alt="" width="640" height="519" class="aligncenter size-large wp-image-24255" srcset="/wp-content/uploads/2017/09/b309412fccac651c5527b1f2b991dac3-640x519.png 640w, /wp-content/uploads/2017/09/b309412fccac651c5527b1f2b991dac3-300x243.png 300w, /wp-content/uploads/2017/09/b309412fccac651c5527b1f2b991dac3-207x168.png 207w, /wp-content/uploads/2017/09/b309412fccac651c5527b1f2b991dac3.png 646w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">田中:</b> 特徴としては、Chromiumを組み込んだブラウザレイヤーと、Node.jsによるネイティブレイヤーの<strong>二層構造になっている</strong>という点が挙げられるかと思います。WebViewはもちろん、Node.jsもクロスプラットフォーム性の非常に高いプラットフォームですので、Electronを用いると、クロスプラットフォームなアプリを簡単に開発することができます。</p>

<p><b class="speaker">白石:</b> 著名なところでいうと、SlackはElectronで書かれているんですよね。</p>

<p><b class="speaker">田中:</b> そうです。Slack、Visual Studio Code、そしてもちろんGitHub製のエディタであるAtomと、<strong>著名なベンダーもElectronの採用には積極的</strong>ですね。</p>

<p><b class="speaker">白石:</b> Electronの将来は明るそうですね。Electronの欠点とかはあるんでしょうか？</p>

<p><b class="speaker">田中:</b> WebViewの上で動作するので、やはりパフォーマンスやメモリ使用量の面では不利になりますね。ただ実際には、PCはモバイルに比べると速度面で優位ですので、そこまで気にするところでもありません。</p>

<p>さっき挙げた例で言うと、SlackやAtomは重いなあ…と感じることが多いですが、Visual Studio Codeはすごく軽快に動作します。なんでElectron開発元が開発している<a href="https://pavelfatin.com/typing-with-pleasure/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Atomがあんなに重い</a>のか(笑)。VS Codeの軽快さは、相当な技術力のなせる業なのかもしれません。</p>

<p><b class="speaker">白石:</b> さすがマイクロソフトってところですね。</p>

<h2>Cordova</h2>

<p><b class="speaker">田中:</b> では次は<strong><a href="https://cordova.apache.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Cordova</a></strong>についてですが、これは説明の必要もないくらい有名なフレームワークですね。Electronのモバイル版と言ってもいいかなと。WebViewと、ネイティブ機能を利用するためのCordovaプラグインという「二層構造」であるところも同様です。</p>

<p><img src="/wp-content/uploads/2017/09/ca4059d14ea5ff949406ad69e4dcd9d3-640x590.png" alt="" width="640" height="590" class="aligncenter size-large wp-image-24256" srcset="/wp-content/uploads/2017/09/ca4059d14ea5ff949406ad69e4dcd9d3.png 640w, /wp-content/uploads/2017/09/ca4059d14ea5ff949406ad69e4dcd9d3-300x277.png 300w, /wp-content/uploads/2017/09/ca4059d14ea5ff949406ad69e4dcd9d3-207x191.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>Electronと違うところは、よりベースとなるOSの依存度が高いというところが挙げられると思います。WebViewは基本的にOSネイティブのものを使用しますし、Cordovaプラグインは通常ネイティブの開発言語で開発します。（Electronの場合はWebViewは組み込みのChromium、ネイティブ部分はNode.js）</p>

<p><b class="speaker">白石:</b> 田中さんは<a href="https://ja.monaca.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Monaca</a>の開発者でもあり、Cordovaのことは誰よりも知りつくしていらっしゃるかと思いますが、利点や欠点を教えていただけますか？</p>

<p><b class="speaker">田中:</b> 利点はやはり<strong>クロスプラットフォーム性</strong>です。複数のモバイルOS上で動作するアプリを、ほぼ1ソースで書くことができます。</p>

<p>欠点は昔から言われているように、パフォーマンスが遅いという点。ただ先程も申し上げたように、端末もブラウザも速度が向上していて、<strong>「遅さ」はあまり気にならないレベルになっていると思います</strong>。少なくとも、Monacaのユーザーに限って言うと、ほとんどの方が問題ないとおっしゃってますね。</p>

<p><b class="speaker">白石:</b> ぼくも、もうそういう段階なんじゃないかな…とは思っていたのですが、田中さんに言われると説得力が違いますね。</p>

<p><b class="speaker">田中:</b> 今では、Cordovaを使っていても、ユーザーが気付くこともほとんどないと思います。例えば、◯◯（某ECアプリ）も実はCordovaを使っているようなんです。</p>

<p><b class="speaker">白石:</b> えっ！あの◯◯が！ぼくもよく使っていますが、全然気づきませんでした。</p>

<p><b class="speaker">田中:</b> そうなんです。意外と広がっているんですよね。今後もその存在感は増していく…と言ってもいいんじゃないでしょうか。</p>

<h2>React Native</h2>

<p><b class="speaker">田中:</b> では次は<strong><a href="https://facebook.github.io/react-native/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">React Native</a></strong>です。Facebookが作っているモバイルアプリ用のフレームワークで、一言で言えば<strong>Reactを使ってモバイルアプリを作るためのツール</strong>ですね。Reactの仮想DOMを、ネイティブのUIコンポーネントを利用してレンダリングするものです。</p>

<p><img src="/wp-content/uploads/2017/09/3b017fa494b999834a7b7f8fcc067744-640x489.png" alt="" width="640" height="489" class="aligncenter size-large wp-image-24257" srcset="/wp-content/uploads/2017/09/3b017fa494b999834a7b7f8fcc067744-640x489.png 640w, /wp-content/uploads/2017/09/3b017fa494b999834a7b7f8fcc067744-300x229.png 300w, /wp-content/uploads/2017/09/3b017fa494b999834a7b7f8fcc067744-207x158.png 207w, /wp-content/uploads/2017/09/3b017fa494b999834a7b7f8fcc067744.png 644w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">白石:</b> React Nativeは最近人気急上昇中ですよね。その理由は何なんでしょうか？</p>

<p><b class="speaker">田中:</b> React自体に人気があるということと、そしてFacebookが自ら使用しているのが大きいですね。React Nativeは、元々Instagramのチームが作っていたそうです。</p>

<p><b class="speaker">白石:</b> React Nativeの利点や欠点はなんでしょうか。</p>

<p><b class="speaker">田中:</b> WebViewの上で動作するのではなく、<strong>ネイティブに動作するアプリが作れる</strong>というのは大きな利点ですね。パフォーマンス上の問題も生じにくいし、ネイティブのルック＆フィールをそのまま利用できる。</p>

<p>また、<strong>UIスレッドとJavaScriptのUIスレッドが最初から分かれている</strong>のも利点だと思います。JavaScriptの処理がUIスレッドの動作を阻害しないので、UIが60fpsを維持しやすい。</p>

<p><img src="/wp-content/uploads/2017/09/0d1fc25917d5033de13db1bb5ff53ac5.jpg" alt="" width="640" height="415" class="alignnone size-full wp-image-24315" srcset="/wp-content/uploads/2017/09/0d1fc25917d5033de13db1bb5ff53ac5.jpg 640w, /wp-content/uploads/2017/09/0d1fc25917d5033de13db1bb5ff53ac5-300x195.jpg 300w, /wp-content/uploads/2017/09/0d1fc25917d5033de13db1bb5ff53ac5-207x134.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">白石:</b> では、React Nativeには欠点といえるものはありますか？</p>

<p><b class="speaker">田中:</b> 作ってみると分かるのですが、<strong>結構作り方に癖がある</strong>んですよね。それに慣れるのが少し大変かもしれません。コードの共通化は促進されるものの、クロスプラットフォームじゃないというところも、議論が分かれるところです。</p>

<p><b class="speaker">白石:</b> Facebookは「Learn Once Write Anywhere」（一度学べばどこでも書ける）と言っていますね。</p>

<p><b class="speaker">田中:</b> そうですね。クロスプラットフォームは最初から目指していない。そこもCordovaとは大きな違いです。</p>

<p>CordovaはWebそのものですから、ブラウザを使って開発し、ブラウザの機能が増えてネイティブと遜色なくなれば、<strong>なくなって当然のものという前提でした</strong>。React Nativeは、ネイティブアプリをJavaScriptで作るという発想です。なので、<strong>開発にはネイティブの知識が必要になります</strong>。JavaScriptを使用するので、開発体験自体はWebに近いものがあるのですが、やはりHTMLやCSSを使ったUI開発とは別物です。</p>

<h2>NativeScriptとWeex</h2>

<p><b class="speaker">田中:</b> あとはNativeScript、あとWeexというフレームワークを紹介していこうと思います。</p>

<p><b class="speaker">白石:</b> ここらへんまで来ると、聞いたことないという人も多そうですね〜。</p>

<p><b class="speaker">田中:</b> <strong><a href="https://www.nativescript.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">NativeScript</a></strong>は、ネイティブで動作するアプリをJavaScriptで書けるフレームワークです。「React NativeからReactを抜いたもの」と考えてもいいでしょう。</p>

<p><img src="/wp-content/uploads/2017/09/8f838a4f8fe2ceccfa26523dee3df81f-640x476.png" alt="" width="640" height="476" class="aligncenter size-large wp-image-24258" srcset="/wp-content/uploads/2017/09/8f838a4f8fe2ceccfa26523dee3df81f-640x476.png 640w, /wp-content/uploads/2017/09/8f838a4f8fe2ceccfa26523dee3df81f-300x223.png 300w, /wp-content/uploads/2017/09/8f838a4f8fe2ceccfa26523dee3df81f-207x154.png 207w, /wp-content/uploads/2017/09/8f838a4f8fe2ceccfa26523dee3df81f.png 734w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">白石:</b> ぼくもNativeScriptの名前は聞いたことがあったのですが、Angularの界隈で耳にしました。</p>

<p><b class="speaker">田中:</b> そう、<strong>Angularと組み合わせて使える</strong>というのを一つのウリにしています。Angularのイベントとかにも積極的に出ていて、Angularチームとの関係は良好そうです。</p>

<p><b class="speaker">白石:</b> 利点や欠点を教えていただけますか？</p>

<p><b class="speaker">田中:</b> 利点はやはりネイティブのパフォーマンスで動くこと、そしてAngularと組み合わせて使えることでしょうね。ただ、「組み合わせて使える」と言っても、React Nativeほどスムーズには使えないのが悩ましいところですが。</p>

<p>欠点は…なんといっても<strong>ユーザーが少ない</strong>ことですね。採用事例とかも探したのですが、今のところ見つかっていない状態です。<a href="https://github.com/NativeScript/NativeScript" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">GitHub上ではかなりの人気なのですが</a> （筆者注: 2017/9/16時点で11,076のスターを集めている）。</p>

<p>あと、開発していたTelerikという会社が<a href="https://www.progress.com/company" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Progress</a>という大企業に買収されてしまって。その後ちょっと開発が停滞してしまっているように見えるんですよね。それもちょっと心配なところです。</p>

<p><b class="speaker">白石:</b> 買収あるあるですね(笑)。</p>

<p><b class="speaker">田中:</b> 最後は<strong><a href="https://weex.incubator.apache.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Weex</a></strong>をご紹介しましょう。</p>

<p>これはVue.jsを使ってネイティブアプリを作れるというフレームワークです。React NativeのVue版と言っても差し支えないかと思います。</p>

<p><img src="/wp-content/uploads/2017/09/47fb8c8b3ebd64a3c5bd860933b30c1e-640x561.png" alt="" width="640" height="561" class="aligncenter size-large wp-image-24259" srcset="/wp-content/uploads/2017/09/47fb8c8b3ebd64a3c5bd860933b30c1e.png 640w, /wp-content/uploads/2017/09/47fb8c8b3ebd64a3c5bd860933b30c1e-300x263.png 300w, /wp-content/uploads/2017/09/47fb8c8b3ebd64a3c5bd860933b30c1e-207x181.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">白石:</b> では、利点もReact Nativeなどと同様に、ネイティブの速度で動く、ネイティブのUIコンポーネントが使えると言ったところですよね、きっと。</p>

<p><b class="speaker">田中:</b> はい、あと面白いのは、これってアリババが開発に携わっているんです。なので、実は中国ではすでに事例が多いそうなのですよね（筆者注: <a href="https://weex.incubator.apache.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Weexのサイト</a>に、「Who uses it」というセクションで採用企業の一覧がある）。</p>

<p><b class="speaker">白石:</b> おお、それはNativeScriptとは違うところですね。アリババが付いているとなると、開発リソースも割けそうだし、事例もどんどん増えていきそうです（筆者注: 元々<a href="https://github.com/alibaba/weex" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">アリババのGitHubリポジトリ</a>上で開発されていたが、Apache Software Foudationに寄贈された）。</p>

<p><b class="speaker">田中:</b> Vue自体もすごく人気がありますしね。Vueに関心のある方にとっては、注目に値するプロダクトだと思います。</p>

<h2>Web技術を用いたネイティブアプリ開発は広まるか？</h2>

<p><b class="speaker">白石:</b> では最後にまとめとして、Web技術を使ってネイティブアプリを作るという手法は、今後も広がっていくのかどうかをお聞きしたいです。</p>

<p><b class="speaker">田中:</b> そうですね、今回取り上げた各プロダクトのnpmのダウンロード数とかを見ると、右肩上がりではあるんです。ただ、その事実を以て、Web技術によるアプリ開発の人気が高まっていると言い切れるかは微妙です。アプリ開発市場そのものも、まだまだ拡大していっていますからね。</p>

<p>個人的には、Web技術によるアプリ開発が、ネイティブの開発手法よりも人気が上回るようなことにはならないと思います。OSの開発元がオフィシャルに推進しているわけでも、何かを保証しているわけでもありませんし。これまでiOSやAndroidの開発者を雇って、アプリ開発を行っていたような企業が、Cordovaを選ぶようなことは、今後もあまり起きないと考えています。</p>

<p><img src="/wp-content/uploads/2017/09/cd1aae51a0afb4f8d39b32db9d75c7fe.jpg" alt="" width="640" height="425" class="alignnone size-full wp-image-24314" srcset="/wp-content/uploads/2017/09/cd1aae51a0afb4f8d39b32db9d75c7fe.jpg 640w, /wp-content/uploads/2017/09/cd1aae51a0afb4f8d39b32db9d75c7fe-300x199.jpg 300w, /wp-content/uploads/2017/09/cd1aae51a0afb4f8d39b32db9d75c7fe-207x137.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker">白石:</b> なるほど、冷静なご意見。</p>

<p><b class="speaker">田中:</b> ただ一つだけ言えるのは、<strong>Web技術者による、フロントエンドのアプリケーション開発が今後も伸びていく</strong>のは間違いないということです。それが純粋なWeb技術だけを用いてProgressive Web Appsを作るのか、先程紹介した技術のどれかを利用してモバイルアプリを作るのかについては、あまり変わらないと思います。</p>

<p>だから、<strong>元々Webをやっていた会社にとっては、既存のスキルセットや資産を使って、やれることの選択肢が増えてきているのは間違いありません</strong>。</p>

<p>Web技術の進化も、Webブラウザによる実装もまだまだ続いていますし、Webの未来にはまだまだ期待しています。</p>

<p><b class="speaker">白石:</b> よくわかりました。田中さん、今日はWeb技術を使ってネイティブアプリを作るテクノロジーについて、幅広く教えていただきありがとうございました。大変勉強になりました。</p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2017特集]]></series:name>
	</item>
		<item>
		<title>Electronプログラミング入門 — インストールからミニブラウザ構築まで</title>
		<link>/yosuke_furukawa/20841/</link>
		<pubDate>Thu, 15 Sep 2016 00:00:50 +0000</pubDate>
		<dc:creator><![CDATA[古川陽介]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Chromium]]></category>
		<category><![CDATA[Electron]]></category>
		<category><![CDATA[Node.js]]></category>

		<guid isPermaLink="false">/?p=20841</guid>
		<description><![CDATA[連載： Web技術でアプリ開発2016 (6)Electronとは、デスクトップクライアントを作るためのフレームワークです。クロスプラットフォームで動作することをサポートしているため、Electronで作ったアプリケーシ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/web-based-apps-2016/" class="series-391" title="Web技術でアプリ開発2016" data-wpel-link="internal">Web技術でアプリ開発2016</a> (6)</div><div id="attachment_20845" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2016/09/electron-eyecatch-640x361.png" alt="Electron" width="640" height="361" class="size-large wp-image-20845" srcset="/wp-content/uploads/2016/09/electron-eyecatch.png 640w, /wp-content/uploads/2016/09/electron-eyecatch-300x169.png 300w, /wp-content/uploads/2016/09/electron-eyecatch-207x117.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Electron</p></div>

<p>Electronとは、デスクトップクライアントを作るためのフレームワークです。クロスプラットフォームで動作することをサポートしているため、Electronで作ったアプリケーションはMac、Windows、Linuxの環境でも動作します。Atomと呼ばれる GitHub社製のエディタがあります。 ElectronはAtomを作る際にフレームワークとして作られました。以前はAtomShellと呼ばれていましたが、Electronとして名前を変更し、2016年にはversion 1.0がリリースされるまでに成長しました。</p>

<p>ElectronはJavaScript / HTML / CSSを使ってクライアントアプリケーションを作成します。中のアーキテクチャはChromiumとNode.jsで作られており、Web開発の技術を使ってデスクトップアプリケーションを構築することが可能です。</p>

<p>ElectronはCheng Zhao氏 (以降zcbenz)が開発したフレームワークですが、zcbenz氏は実際Electronの開発前にNW.js(旧 NodeWebkit) と呼ばれるフレームワークのコントリビューターでした。ElectronはNW.jsと非常によく似たフレームワークですが、いくつか技術的に異なるポイントが有ります。決定的な違いは、Chromiumの組み込み方の違いです。ElectronはライブラリとしてChromiumを組み込んでいるのに対して、NW.jsはChromiumをforkしたプロジェクトを使っています。Chromiumは非常に進化が早いプロダクトなので、forkして持つよりもアップデートを考えると効率的です。</p>

<p>とはいえ、NW.jsとElectronの技術的な部分以外は違いはそこまでありません。Atom開発当初にNW.jsが多少不安定だったために新しいプロダクトとして立ち上げたという側面もあるそうです。詳しくは<a href="https://github.com/electron/electron/blob/master/docs/development/atom-shell-vs-node-webkit.md" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AtomShellとNodeWebkitの違い</a>に詳しく記載されています。</p>

<h2>Electronの特徴</h2>

<p>いくつか特徴があるので紹介します。</p>

<h3>Electronのランタイム</h3>

<p>Electron そのものはただのランタイムライブラリです、Node.jsにおける<code>node</code>コマンドのようなもので、<code>electron</code>コマンドでエントリポイントとなるJavaScriptを実行します。</p>

<p><code>electron</code>コマンドは<a href="http://electron.atom.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">公式サイト</a>からダウンロードすることもできますが、Node.jsのパッケージモジュールである、<code>npm</code>コマンドを使ってインストールすることも可能です。</p>

<p></p><pre class="crayon-plain-tag">$ npm install electron -g</pre><p></p>

<p>※ 以前までは <code>npm install electron-prebuilt</code>からインストールする必要がありましたが、最近は<code>npm install electron</code>でinstallできるようになりました。</p>

<p>これで<code>electron</code>コマンドが有効になるので、そのコマンドを使ってデスクトップアプリケーションを起動させます。アプリケーションを実際に書くのは後述します。</p>

<h3>Electron / Browser間でモジュールを共有</h3>

<p>Electronアプリを構築すると、シームレスにブラウザからNode.jsのコードを呼ぶことが可能です。そのため、下記のようなコードを実行することもできます。　</p>

<p></p><pre class="crayon-plain-tag">// script tag から
&lt;script&gt;
// 自分のローカルファイル読みこんだり
const fs = require(‘fs’);
fs.readFile(‘foo/bar/baz’, (err, data) =&gt; {
  console.log(data);
});
&lt;/script&gt;

&lt;script&gt;
// 外部プロセスを呼んだり
const cp = require(‘child_process’);
cp.exec(‘ls -l’, (err, stdout) =&gt; {
  console.log(stdout);
});
&lt;/script&gt;</pre><p></p>

<p>ただし、この方法を使った場合、DOM-based XSSが発生すると、任意のコマンドだったり、ファイルが操作できてしまう結果になるため、プロダクションでElectronを活用する場合は注意が必要です。</p>

<p><a href="http://utf-8.jp/public/2016/0307/electron.pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">参考資料: Electronの倒し方</a></p>

<h2>Hello World</h2>

<p>一旦Electronを起動してみましょう。Electronを動かすだけなら Node.jsはbuilt-inされているので不要ですが、npmがある方が便利なのでNode.jsをインストールしておきましょう。Node.jsは <a href="https://nodejs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">公式サイト</a>からダウンロードできます。Macであれば、<code>brew</code>でもインストール可能です。</p>

<p>Node.jsがインストールされたらElectronをインストールしてみましょう。下記の通りです。</p>

<p></p><pre class="crayon-plain-tag">$ npm install electron -g</pre><p></p>

<p>適当なフォルダを作成し、<code>package.json</code>、<code>main.js</code>、<code>index.html</code>を作成します。
package.jsonは下記の通りに作成します。</p>

<p></p><pre class="crayon-plain-tag">{
  "name": "electron-intro",
  "version": "0.0.1",
  "main": "main.js"
}</pre><p></p>

<p><code>main.js</code>を記述します。</p>

<p></p><pre class="crayon-plain-tag">const {app, BrowserWindow} = require('electron');

// window objectがGCされないようにするために、globalに定義する
let win;

function createWindow () {
  win = new BrowserWindow({width: 800, height: 600});

  win.loadURL(`file://${__dirname}/index.html`);

  win.on('closed', () =&gt; {
    // windowがクローズされたら null にして削除
    win = null;
  });
}

app.on('ready', createWindow);

app.on('window-all-closed', () =&gt; {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

app.on('activate', () =&gt; {
  if (win === null) {
    createWindow();
  }
});</pre><p></p>

<p>最後に表示するための<code>index.html</code>を記述します。</p>

<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;Hello Electron!&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;Hello Electron!&lt;/h1&gt;
    Node version: &lt;script&gt;document.write(process.versions.node)&lt;/script&gt;,
    Chrome version: &lt;script&gt;document.write(process.versions.chrome)&lt;/script&gt;,
    Electron version: &lt;script&gt;document.write(process.versions.electron)&lt;/script&gt;.
  &lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p>これだけでHello Worldは一旦完成です。 下記のようなファイル構成になっていることを確認してください。</p>

<pre><code>.
├── index.html
├── main.js
└── package.json
</code></pre>

<p>Electronを起動させてみましょう。</p>

<p></p><pre class="crayon-plain-tag">$ electron .</pre><p></p>

<p>下記のようなウィンドウが出たら完成です。</p>

<div id="attachment_20847" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2016/09/hello_world-640x477.png" alt="Hello, World実行結果" width="640" height="477" class="size-large wp-image-20847" srcset="/wp-content/uploads/2016/09/hello_world.png 640w, /wp-content/uploads/2016/09/hello_world-300x224.png 300w, /wp-content/uploads/2016/09/hello_world-207x154.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Hello, World実行結果</p></div>

<h2>PhotonKitを使ってミニマムブラウザを作る</h2>

<p>これだけだと味気ないので、PhotonKitを使ってミニマムブラウザを作ってみましょう。ブラウザを作ると言っても、 Chromiumを内包しているElectronであれば、Chromiumの機能を借りてくるだけなのでそこまで難しくはないです。</p>

<p>PhotonKitはCSSフレームワークの1つです。BootstrapやMaterial Design Liteのようなclass setを持っています。Mac のクライアントのようなアプリケーションを作るためのデザインテンプレートになっています。</p>

<div id="attachment_20849" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2016/09/photon-640x353.png" alt="Photon" width="640" height="353" class="size-large wp-image-20849" srcset="/wp-content/uploads/2016/09/photon.png 640w, /wp-content/uploads/2016/09/photon-300x165.png 300w, /wp-content/uploads/2016/09/photon-207x114.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Photon</p></div>

<p>まずは<code>package.json</code>を作りましょう。</p>

<p></p><pre class="crayon-plain-tag">{
  "name": "electron-mini-browser",
  "version": "0.0.1",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "electron index.js"
  },
  "keywords": [],
  "author": "",
  "license": "MIT",
  "dependencies": {
    "electron": "^1.3.5"
  }
}</pre><p></p>

<p><code>npm start</code>でElectronを起動できるようにしておくことと、<code>dependencies</code>に<code>electron</code>をインストールしておきましょう。下記の方法でpackage.jsonに記述しつつ、インストールさせることが可能です。　</p>

<p></p><pre class="crayon-plain-tag">$ npm install electron --save</pre><p></p>

<p>次に<code>index.js</code>を作成します。</p>

<p></p><pre class="crayon-plain-tag">'use strict';
const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;

let mainWindow = null;

app.on('window-all-closed', function() {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

app.on('ready', function() {
  mainWindow = new BrowserWindow({
    width: 800, 
    height: 600,
  });
  mainWindow.loadURL(`file://${__dirname}/index.html`);

  mainWindow.on('closed', function() {
    mainWindow = null;
  });
});</pre><p></p>

<p>実際のページ(index.html)を作成します。</p>

<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;link rel="stylesheet" href="./css/photon.css"&gt;
    &lt;script src="./js/main.js"&gt;&lt;/script&gt;
    &lt;title&gt;Hello Electron!&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div class="window"&gt;
    &lt;header class="toolbar toolbar-header"&gt;
    &lt;h1 class="title"&gt;Hello Electron!&lt;/h1&gt;
    &lt;div class="toolbar-actions"&gt;
     &lt;!-- リロードボタン --&gt;
     &lt;button id="reload" class="btn btn-default"&gt;
       &lt;span class="icon icon-arrows-ccw icon-text"&gt;&lt;/span&gt;
       Reload
     &lt;/button&gt; 
     &lt;!-- 戻るボタン --&gt;
     &lt;button id="back" class="btn btn-default"&gt;
       &lt;span class="icon icon-left icon-text"&gt;&lt;/span&gt;
       Back
     &lt;/button&gt; 
     &lt;!-- 進むボタン --&gt;
     &lt;button id="forward" class="btn btn-default"&gt;
       &lt;span class="icon icon-right icon-text"&gt;&lt;/span&gt;
       Forward
     &lt;/button&gt; 
     &lt;!-- URL バー --&gt;
     &lt;input type="text" id="urlbar" class="form-control" placeholder="URL" value="https://github.com/"&gt;
     &lt;!-- お気に入りボタン --&gt;
     &lt;button id="favorite" class="btn btn-default"&gt;
       &lt;span class="icon icon-star icon-text"&gt;&lt;/span&gt;
       Favorite
     &lt;/button&gt; 
    &lt;/div&gt;
    &lt;/header&gt;
      &lt;div class="window-content"&gt;
        &lt;div class="pane-group"&gt;
          &lt;div class="pane-sm sidebar"&gt;
            &lt;!-- お気に入りリスト --&gt;
            &lt;ul id="fav-list" class="list-group"&gt;
            &lt;/ul&gt;
          &lt;/div&gt;
            &lt;!-- Webページ表示領域 --&gt;
          &lt;webview class="pane" id="webview" src="https://www.github.com/" autosize="on" style="height:100%;"&gt;&lt;/webview&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;footer class="toolbar toolbar-footer"&gt;
    &lt;h1 class="title"&gt;Footer&lt;/h1&gt;
    &lt;/footer&gt;
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p>ページの中のボタンに動きを与えるため、<code>js/main.js</code>を作成します。</p>

<p></p><pre class="crayon-plain-tag">document.addEventListener('DOMContentLoaded', () =&gt; {
  const webview = document.getElementById('webview');
  const reloadButton = document.getElementById('reload');
  const backButton = document.getElementById('back');
  const forwardButton = document.getElementById('forward');
  const favoriteButton = document.getElementById('favorite');
  const urlbar = document.getElementById('urlbar');
  const favList = document.getElementById('fav-list');

  // webview表示の時にurlbarの値を変える
  webview.addEventListener('load-commit', ({ url, isMainFrame }) =&gt; {
    if (isMainFrame) {
      urlbar.value = url;
    }
  });

  // urlbarでEnterキーを押したら遷移する
  urlbar.addEventListener('keypress', (e) =&gt; {
    if (e.key === 'Enter') {
      webview.setAttribute('src', urlbar.value);
    }
  });

  // 更新ボタンをクリックしたらwebviewをリロードする
  reloadButton.addEventListener('click', () =&gt; {
    webview.reload();
  });

  // 戻るボタンをクリックしたらwebviewを戻る
  backButton.addEventListener('click', () =&gt; {
    webview.goBack();
  });
  
  // 進むボタンをクリックしたらwebviewを進ませる
  forwardButton.addEventListener('click', () =&gt; {
    webview.goForward();
  });
  
  // お気に入りボタンをタップしたらリストにURLを追加する
  favoriteButton.addEventListener('click', () =&gt; {
    const listItem = document.createElement('li');
    const listContent = document.createElement('p');
    listItem.setAttribute('class', "list-group-item");
    listItem.setAttribute('data-url', urlbar.value);
    listContent.textContent = urlbar.value;
    listItem.appendChild(listContent);
    favList.appendChild(listItem);
    listItem.addEventListener('click', () =&gt; {
      const url = listItem.getAttribute('data-url');
      webview.setAttribute('src', url);
    });
  });
});</pre><p></p>

<p>最後にPhotonKitのCSSとFontセットを <a href="http://photonkit.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ダウンロード</a>しておきます。
下記のようなディレクトリ構成になります。</p>

<p></p><pre class="crayon-plain-tag">.
├── css
│   ├── photon.css
│   └── photon.min.css
├── fonts
│   ├── photon-entypo.eot
│   ├── photon-entypo.svg
│   ├── photon-entypo.ttf
│   └── photon-entypo.woff
├── index.html
├── index.js
├── js
│   └── main.js
└── package.json</pre><p></p>

<p>全てを終えたら、<code>npm start</code>コマンドで起動します。下記のようなブラウザが出現できたら完成です。</p>

<div id="attachment_20846" style="width: 650px" class="wp-caption aligncenter"><img src="https://github.com/yosuke-furukawa/electron-intro/raw/master/img/electron-mini-browser.gif" alt="Electron+Photonで作ったミニブラウザ" width="640" height="374" class="size-large wp-image-20846" /><p class="wp-caption-text">Electron+Photonで作ったミニブラウザ</p></div>

<h2>プラットフォーム/ライブラリの特徴</h2>

<table>
<thead>
<tr>
  <th>項目</th>
  <th>説明</th>
</tr>
</thead>
<tbody>
<tr>
  <td>対応プラットフォーム</td>
  <td>Windows, Linux, OS X</td>
</tr>
<tr>
  <td>コードベースは（ほぼ）完全に統一できるか？</td>
  <td>ほぼ統一できる</td>
</tr>
<tr>
  <td>UIを記述する言語</td>
  <td>JavaScript, HTML, CSS</td>
</tr>
<tr>
  <td>UIはネイティブかウェブか</td>
  <td>基本はウェブだが、OSネイティブの機能(タスクバー等)は一部利用できる</td>
</tr>
<tr>
  <td>パフォーマンス</td>
  <td>基本ウェブなのでウェブページと同等、ただし自分でオフラインキャッシュの仕組みを持てるので、改善可能</td>
</tr>
<tr>
  <td>ネイティブな機能を呼び出せるか？</td>
  <td>Node.jsからOSの機能を呼び出せる。</td>
</tr>
</tbody>
</table>

<p>以下に、上の表を補足します。</p>

<h3>対応プラットフォーム</h3>

<p>Electronの公式サポートはWindows, Linux, OS Xの３つのみです。今のところはデスクトップアプリケーションのためのフレームワークなので、モバイル対応は全く考えられていません。</p>

<h3>コードベースは (ほぼ) 完全に統一できるか？</h3>

<p>ほぼ統一できます。ただし、OS X用の機能であったり、Windows専用の機能は用意されていて、プラットフォームによって呼び出し可能なAPIや受信可能なEventが若干異なります。クロスプラットフォームでOSの専用の機能を利用する上で、気になる方は一度<a href="http://electron.atom.io/docs/api/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">API</a>を確認すると良いでしょう。</p>

<h3>UIを記述する言語</h3>

<p>Hello Worldやミニブラウザを作って分かる通り、HTML/JS/CSSで書きます。ネイティブ部分の呼び出しもNode.jsなので、 JavaScriptになります。</p>

<p>JavaScriptのレイヤはNode.js部分とChromium部分でv8(JavaScript Engine)が動くので、ほぼ同一の動きをします、ただし、Node.jsとChromiumでv8のバージョンは若干違う可能性があります。基本的な部分は変わりませんが、ES2016の対応状況を見てもらえれば分かる通り、新しいJavaScriptの機能面で違いはあります。</p>

<div id="attachment_20844" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2016/09/compat-640x155.png" alt="ES2016の対応状況" width="640" height="155" class="size-large wp-image-20844" srcset="/wp-content/uploads/2016/09/compat.png 640w, /wp-content/uploads/2016/09/compat-300x73.png 300w, /wp-content/uploads/2016/09/compat-207x50.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">ES2016の対応状況</p></div>

<h3>UIはネイティブかウェブか</h3>

<p>基本はウェブです。デスクトップアプリケーションとして、タスクトレイに常駐させたい場合やOSネイティブのダイアログボックスを使いたい場合は専用のAPIがあるので、それを利用して機能を作ることも可能です。</p>

<h3>パフォーマンス</h3>

<p>Electronは基本的にウェブなので、ネイティブのデスクトップアプリと比較するとそこまで高速ではありません。</p>

<p>Electronのアプリを起動させると、Chromium用のプロセスが3つ起動し、Node.js用のメインプロセスが1つ起動します。合計4プロセスが常駐することになります。言ってしまえばブラウザそのものを起動しつつ、バックグラウンドにNode.jsを起動しているのと同様です。富豪的な方法で実現していると言えるでしょう。</p>

<p>そのため、描画パフォーマンス等はブラウザの機能がそのまま利用できますが、実行効率が良いモデルとはいえません。パフォーマンスにシビアなアプリケーションを作る場合は Electron ではなく、ネイティブの機能を使って作る方が良いでしょう。</p>

<h3>ネイティブな機能を呼び出せるか？</h3>

<p>ElectronからNode.jsを呼び出せばファイル操作や外部プロセスコールといった基本的な機能は呼び出せます。また、C言語等で書かれたネイティブライブラリもNode.jsアドオンがあれば呼び出すことが可能です。ただし、ネイティブライブラリに関しては、通常のnpmでインストールするだけでは利用できないことがあります。Nodeのバージョンがelectronのbuilt-inで保持しているバージョンと異なる場合にうまく利用できないことが多いです。ネイティブライブラリを利用したい場合は下記のガイドを確認することを推奨します。</p>

<p><a href="https://github.com/electron/electron/blob/master/docs/tutorial/using-native-node-modules.md" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ネイティブライブラリ利用ガイド</a></p>

<h2>まとめ</h2>

<p>Electronの概要とアプリ構築の方法、ウェブ用プラットフォームを構築する上での共通質問項目を記述しました。Electron はこれまでのAngularJSやReact等で構築されたSingle Page Applicationを活用して、デスクトップアプリケーションを構築するのに非常に向いています。</p>

<p>まだv1.0がリリースされて日が浅いこともあり、そこまでノウハウが溜まっているわけではありません。特にセキュリティやパフォーマンスなどの改善は今進んでいますが、ユーザーからのノウハウも溜める必要があると感じています。</p>

<p>もしまだ触っていない方がいらっしゃるのであれば、<a href="http://yosuke-furukawa.hatenablog.com/entry/2015/12/31/223045" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">electronica</a>などのチュートリアルもあるので是非やってみてください。</p>

<p>また今回の<a href="http://nodefest.jp/2016/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Node学園祭</a>では、Electron作者のzcbenzもゲストスピーカーとして登壇する予定です。Electronの今後の話が聞けると思います。</p>

<p>一緒にElectronを盛り上げていきましょう。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Web技術でアプリ開発2016]]></series:name>
	</item>
	</channel>
</rss>
