<?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>Kameda Shohei &#8211; HTML5Experts.jp</title>
	<atom:link href="/shohey1226/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>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>
