<?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>React Native &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/react-native/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>React Native入門 ─ Hello,Worldからネイティブ連携まで</title>
		<link>/shohey1226/20480/</link>
		<pubDate>Tue, 06 Sep 2016 00:16:23 +0000</pubDate>
		<dc:creator><![CDATA[Kameda Shohei]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[React Native]]></category>

		<guid isPermaLink="false">/?p=20480</guid>
		<description><![CDATA[連載： Web技術でアプリ開発2016 (1)モバイルアプリ開発におけるWeb技術の可能性を探る特集・第一弾でご紹介するのはReact Native。その生い立ち、チュートリアルから、コードベースやUIを記述する言語、パ...]]></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> (1)</div><p>モバイルアプリ開発におけるWeb技術の可能性を探る特集・第一弾でご紹介するのはReact Native。その生い立ち、チュートリアルから、コードベースやUIを記述する言語、パフォーマンスまで解説します。</p>

<h2>概要</h2>

<p>React Nativeは2013年にFacebook社内のハッカソンで生まれたプロジェクトです。2014年にiOSアプリのFacebook Ads ManagerをReact Nativeを用いて開発し、2015年3月にオープンソースとして公開されました。そして、半年後の2015年9月にAndroidをサポートし、今年のF8では、MicrosoftがReact Nativeで<a href="https://github.com/ReactWindows/react-native-windows" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Windowsプラットフォーム（PC, Mobile, Xbox）の開発</a>ができます、という発表がありました。また、<a href="https://github.com/ptmt/react-native-macos" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">macOSアプリの開発</a>、<a href="https://github.com/CanonicalLtd/react-native" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ubuntuアプリの開発</a>など他のプラットフォームの開発もできるようにするプロジェクトも走っているようです。</p>

<p>React Nativeのコンセプトは、&#8221;Write Once, Run Anywhere”(一つのコードでどこでも動く）ではなく、&#8221;Learn Once, Run Anywhere&#8221;(一度学べば、どこでも動かせる）です。一度React Nativeを理解すれば、どのプラットフォーム上でも同様のコーディングを行って、プラットフォームネイティブなアプリケーションを開発することが出来ます。Githubのスター数は35,000を超え、リリースの頻度も多く、グローバルな視点でみると、非常に熱い技術であると言えます。</p>

<p>（編集部注: 「Write Once, Run Anywhere」は、あらゆるプラットフォームで同一のコードが動作するという、Javaが喧伝していたコンセプトです）</p>

<h2>Hello, World</h2>

<p>以下は、macOS上で開発することを前提としたチュートリアルです。</p>

<p>React Native開発に必要なものは、 Node.js, React Nativeのコマンドラインツール、<a href="https://facebook.github.io/watchman/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Watchman</a>（Facebookによって開発されているファイル監視ツール）になります。Homebrewで下記のようにインストールします。</p>

<p><code>
$ brew install node
$ brew install watchman
$ npm install -g react-native-cli
$ npm -v
3.6.0
$ node -v
v5.0.0
</code></p>

<h3>iOS</h3>

<p>iOSの場合はXcodeが必要です。XcodeはMac App Storeからインストールしましょう。　準備が整ったところで、プロジェクトを作って走らせてみます。</p>

<p><code>
$ react-native init AppByWebTech2016
$ cd AppByWebTech2016
$ react-native run-ios
</code></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/Simulator-Screen-Shot-2016.08.27-9.57.40.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/Simulator-Screen-Shot-2016.08.27-9.57.40-169x300.png" alt="Simulator Screen Shot 2016.08.27 9.57.40" width="169" height="300" class="alignnone size-medium wp-image-20490" srcset="/wp-content/uploads/2016/08/Simulator-Screen-Shot-2016.08.27-9.57.40-169x300.png 169w, /wp-content/uploads/2016/08/Simulator-Screen-Shot-2016.08.27-9.57.40.png 360w, /wp-content/uploads/2016/08/Simulator-Screen-Shot-2016.08.27-9.57.40-116x207.png 116w" sizes="(max-width: 169px) 100vw, 169px" /></a></p>

<h3>Android</h3>

<p>Androidの場合は、Android Studioが必要なのでインストールしておきます。アプリの起動には、実機をUSBで繋げておくか、Emulatorが必要なので適宜用意します。今回は、<a href="https://www.genymotion.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Genymotion</a>(個人利用は無料）を起動しておいて, 下記のコマンドを走らせます。</p>

<p><code>
$ react-native run-android
</code></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/a468941aa8d025ee9409bc979399be8d.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/a468941aa8d025ee9409bc979399be8d-182x300.png" alt="スクリーンショット 2016-08-27 10.32.12" width="182" height="300" class="alignnone size-medium wp-image-20492" srcset="/wp-content/uploads/2016/08/a468941aa8d025ee9409bc979399be8d-182x300.png 182w, /wp-content/uploads/2016/08/a468941aa8d025ee9409bc979399be8d.png 389w, /wp-content/uploads/2016/08/a468941aa8d025ee9409bc979399be8d-126x207.png 126w" sizes="(max-width: 182px) 100vw, 182px" /></a></p>

<h3>NativeBaseを使う</h3>

<p>これだけだと味気ないので、<a href="http://nativebase.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">NativeBase</a>を用いてUIを作ってみたいと思います。NativeBaseはWebでいうBootstrapのようなものです。ボタン等のUIを自分でデザインする必要がなく見栄えの良いインターフェイスを簡単に作ることができます。</p>

<p>では、NativeBaseをインストールしてみましょう。(※react-nativeのバージョンは0.32)</p>

<p><code>
$ cd AppByWebTech2016
$ npm install native-base --save
$ react-native link react-native-vector-icons
</code></p>

<p>index.ios.jsを下記のように変更すると、</p>

<p></p><pre class="crayon-plain-tag">import React, { Component } from 'react';
import { Container, Content, Button, Header, Title, List, ListItem, Badge } from 'native-base';
import { Col, Row, Grid } from 'react-native-easy-grid';
import { AppRegistry, Text, View } from 'react-native';

class AppByWebTech2016 extends Component {
  render() {
    return (
      &lt;Container&gt;
        &lt;Header&gt;
          &lt;Title&gt;Hello World&lt;/Title&gt;
        &lt;/Header&gt;
        &lt;Content&gt;
          &lt;List&gt;
            &lt;ListItem &gt;
              &lt;Badge&gt;1&lt;/Badge&gt;
            &lt;/ListItem&gt;
            &lt;ListItem&gt;
              &lt;Badge primary&gt;2&lt;/Badge&gt;
            &lt;/ListItem&gt;
            &lt;ListItem&gt;
              &lt;Text&gt;List 3&lt;/Text&gt;
            &lt;/ListItem&gt;
          &lt;/List&gt;
          &lt;Grid&gt;
            &lt;Row&gt;
              &lt;Col&gt;
                &lt;Button style={{margin:10}}&gt; Click Me! &lt;/Button&gt;
              &lt;/Col&gt;
              &lt;Col style={{backgroundColor: '#204d74'}}&gt;
                &lt;Text style={{fontSize: 20, color: 'white', margin: 10}}&gt;React Native!&lt;/Text&gt;
              &lt;/Col&gt;
            &lt;/Row&gt;
            &lt;Row style={{backgroundColor: '#00c497'}}&gt;
              &lt;Text style={{fontSize: 24, color: '#333', margin: 10}}&gt;Learn once, Write anywhere&lt;/Text&gt;
            &lt;/Row&gt;
          &lt;/Grid&gt;
        &lt;/Content&gt;
      &lt;/Container&gt;
    );
  }
}

AppRegistry.registerComponent('AppByWebTech2016', () =&gt; AppByWebTech2016);</pre><p></p>

<p>スタイルのことを気にせずボタンを作ることができ、グリッドなども簡単に使用できます。プロトタイピングなどにはもってこいのモジュールとなっています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/59dd481d8a7df9a47c7015bc6728d49b.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/59dd481d8a7df9a47c7015bc6728d49b-300x279.png" alt="スクリーンショット 2016-08-27 14.09.20" width="300" height="279" class="alignnone size-medium wp-image-20493" srcset="/wp-content/uploads/2016/08/59dd481d8a7df9a47c7015bc6728d49b-300x279.png 300w, /wp-content/uploads/2016/08/59dd481d8a7df9a47c7015bc6728d49b-207x193.png 207w, /wp-content/uploads/2016/08/59dd481d8a7df9a47c7015bc6728d49b.png 373w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

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

<table>
<thead>
<tr>
  <th align="left">項目</th>
  <th align="right">説明</th>
</tr>
</thead>
<tbody>
<tr>
  <td align="left">対応プラットフォーム</td>
  <td align="right">iOS, Android, Windows(PC, Mobile, Xbox), macOS※, Ubuntu※</td>
</tr>
<tr>
  <td align="left">コードベースは（ほぼ）完全に統一できるか？</td>
  <td align="right">統一できない（実際は7,8割は共有できる）</td>
</tr>
<tr>
  <td align="left">UIを記述する言語</td>
  <td align="right">JavaScript, React, スタイルシート</td>
</tr>
<tr>
  <td align="left">UIはネイティブか、Webか</td>
  <td align="right">WebViewではない。ネイティブもしくはJSとのハイブリットで実現</td>
</tr>
<tr>
  <td align="left">パフォーマンス</td>
  <td align="right">ネイティブ同等</td>
</tr>
<tr>
  <td align="left">ネイティブな機能を呼び出せるか？</td>
  <td align="right">APIを通じて自由に呼び出せる</td>
</tr>
</tbody>
</table>

<p>※コミュニティがサポート</p>

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

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

<p>私が確認したのはiOSとAndroidですが、前述した通り、下記のプラットフォームでReact Nativeの方法でNativeアプリを動かすことができるようです。</p>

<ul>
<li>iOS</li>
<li>Android</li>
<li>Windows(PC, Mobile, Xbox)</li>
<li>MacOS</li>
<li>Ubuntu</li>
<li>Browser※1</li>
</ul>

<p>※１<a href="https://github.com/necolas/react-native-web" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">React Native for Web</a>というChrome, Firefox, Safari &gt;= 7, IE 10, Edge.のBrowser上でReact Nativeコードを動かすというプロジェクトさえ存在します。</p>

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

<p>残念ながら完全には統一できません。現実には各プラットフォームの作法（例えば、iOSはtabbarは下部、Androidは上部）
が存在し、完全に同じにすべきかというのは別の議論が必要な気がします。ただ<a href="https://www.quora.com/How-much-will-you-be-able-to-share-code-between-Android-and-iOS-with-React-Native" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">85%は同じコードを再利用できた</a>といった話もないわけではありません。ビジネスロジック部分は統一させ、UIは個別のコードで実現するというのが、コードの再利用＋ネイティブの作法の両面を考慮に入れたReact Nativeの流儀だと言ってよいでしょう。</p>

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

<p>コードはJavaScript(ES6), コンポーネントはReact, デザインはスタイルシートを用いて記述していきます。
スタイルシートはCamel記法となるのでCSSのbackground-colorがbackgroundColorという属性になり、非常に馴染みの深いものになります。
React Nativeは、レイアウトを行うためにFlexboxを用います。最近のWebブラウザでは広くサポートされているので、ご存じの方も多いことでしょう。</p>

<p>ES6やReactは確かに学習コストがあります。しかし、Web業界で生きているひとは少なくとも触っておくべき技術でしょう。React Nativeでのアプリ開発の経験が逆にWebに生かすというようなことも起きるかもしれません。</p>

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

<p>ネイティブのコンポーネントを利用する限り、ネイティブと同等のパフォーマンスになると言ってよいでしょう。パフォーマンスの最適化を開発者に意識させないようにすることがReact Nativeが実現しようとしていることです。</p>

<p>しかし、<a href="http://facebook.github.io/react-native/releases/0.32/docs/performance.htm" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">公式のドキュメント</a>によると、現実には何点か難しい箇所があると述べられています。</p>

<p>React Nativeは下図のようにスレッドが走っています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/8E2942F7-B660-46DC-85BA-58DA362472DB.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/8E2942F7-B660-46DC-85BA-58DA362472DB-300x167.png" alt="8E2942F7-B660-46DC-85BA-58DA362472DB" width="300" height="167" class="alignnone size-medium wp-image-20497" srcset="/wp-content/uploads/2016/08/8E2942F7-B660-46DC-85BA-58DA362472DB-300x167.png 300w, /wp-content/uploads/2016/08/8E2942F7-B660-46DC-85BA-58DA362472DB-207x115.png 207w, /wp-content/uploads/2016/08/8E2942F7-B660-46DC-85BA-58DA362472DB.png 622w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p><a href="https://www.youtube.com/watch?v=0MlT74erp60" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">React.js Conf 2016 &#8211; Tadeu Zagallo &#8211; Optimising React Native: Tools and Tips</a>より転載</p>

<p>端的に言うと、JavaScriptのビジネスロジックが動くJSスレッド上で時間のかかる処理を行うと、UI出力時に遅延が起きてしまうケースがあります。
もしパフォーマンスに影響が出たときは、このJSスレッドを意識してコードを見直してみる必要があります。</p>

<p>今年のReact Confの発表でも言及されていましたが、Facebookは社内にReact Nativeのパフォーマンスチームを作ってパフォーマンスを継続的に改善しています。彼らがリソースを割いて注力している部分でもあるので、これからも改善されていく部分だと思います。</p>

<h3>UIはネイティブか、Webか</h3>

<p>WebViewを使わないという観点でWebではありません。ネイティブのライブラリを呼び出すAPIが多いですが、JSとのコードのハイブリッドといったイメージでしょうか。UIの動作は非常にネイティブライクです。</p>

<h3>ネイティブな機能を呼び出す方法</h3>

<p>React Nativeとネイティブ間を受け渡すようなAPIが用意されています。
これを使うことで容易にネイティブからの値を受け取ったり、受け渡したりすることができます。
この程よい抽象化があることで、現行のiOSアプリにも組み込むことが可能となります。
実際、Facebookのアプリでも一部はReact Nativeで書かれてると言っています。</p>

<p>今回は非常に簡単な例ですが、React Native側で２つの数字を渡しネイティブ側で和を求めて返すメソッドを用いて説明します。(今回はiOS）</p>

<p>まずは、Xcodeで<code>ios/AppByWebTech2016.xcodeproj</code>をOpenし、新規作成からCocoaClassを選び、適当なSubクラスを選びます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/ED821C61-EBBF-4046-B1F7-C2C177606302.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/ED821C61-EBBF-4046-B1F7-C2C177606302-300x151.png" alt="ED821C61-EBBF-4046-B1F7-C2C177606302" width="300" height="151" class="alignnone size-medium wp-image-20501" srcset="/wp-content/uploads/2016/08/ED821C61-EBBF-4046-B1F7-C2C177606302-300x151.png 300w, /wp-content/uploads/2016/08/ED821C61-EBBF-4046-B1F7-C2C177606302-207x104.png 207w, /wp-content/uploads/2016/08/ED821C61-EBBF-4046-B1F7-C2C177606302.png 560w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/EF401AE0-3C72-41CE-BA43-95D68531F7B6.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/EF401AE0-3C72-41CE-BA43-95D68531F7B6-300x210.png" alt="EF401AE0-3C72-41CE-BA43-95D68531F7B6" width="300" height="210" class="alignnone size-medium wp-image-20502" srcset="/wp-content/uploads/2016/08/EF401AE0-3C72-41CE-BA43-95D68531F7B6-300x210.png 300w, /wp-content/uploads/2016/08/EF401AE0-3C72-41CE-BA43-95D68531F7B6.png 640w, /wp-content/uploads/2016/08/EF401AE0-3C72-41CE-BA43-95D68531F7B6-207x145.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>すると、AppNativeSum.hとAppNativeSum.mができると思います。
このファイルを下記のように書き換えます。RCT_*(ReaCTの略らしい）の接頭辞がついたAPIをReact Nativeが提供しています。Callbackを用いて返す方法もありますが、今回はPromiseを使います。</p>

<p></p><pre class="crayon-plain-tag">#import "RCTBridgeModule.h"

@interface AppNativeSum : NSObject &amp;lt;RCTBridgeModule

@end</pre><p></p>

<p></p><pre class="crayon-plain-tag">#import "AppNativeSum.h"

@implementation AppNativeSum

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(sumNumber:(int)val1 val2:(int)val2 resolver:(RCTPromiseResolveBlock)resolve
                  rejecter:(RCTPromiseRejectBlock)reject)
{
  NSInteger val3 = val1 + val2;
  NSString *val3Str = [NSString stringWithFormat:@"%ld", (long)val3];
  resolve(val3Str);
}

@end</pre><p></p>

<p>このメソッドの戻り値は、JavaScriptのPromiseです。通常のPromiseと同様に、async/awaitを使って非同期処理の結果を処理することも可能です。</p>

<p></p><pre class="crayon-plain-tag">import { NativeModules } from 'react-native';
var AppNativeSum = NativeModules.AppNativeSum;

class AppByWebTech2016 extends Component {

  constructor(props){
    super(props);
    this.state = {
      sum: 0
    }
  }

  async componentDidMount(){
    let sum = await AppNativeSum.sumNumber(1,2);
    this.setState({sum: sum});
  }
...</pre><p></p>

<p>ネイティブコードに精通していれば、公式ドキュメントにあるAPIに渡すだけで容易にReact Nativeとネイティブのやりとりができます。</p>

<h2>まとめ</h2>

<p>マレーシアの友人が、彼の国では企業がReact Nativeエンジニアの採用をしていると言っていました(中国でも似たような状況にあるとか)。
日本でもちらほらReact Nativeを採用する会社がでてきているようです。一年半以上経過し、リリース速度が多少遅くなっているといってもどんどん新しいバージョンが出てきて、かつよりよいUIモジュールもでてきています。今こそ、React Nativeを始めてみてはいかがでしょうか。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Web技術でアプリ開発2016]]></series:name>
	</item>
	</channel>
</rss>
