<?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>Angular 2 &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/angular-2/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>Angular 2を使うならUIはコレで！Ionic 2ことはじめ（正式リリース版対応）</title>
		<link>/rdlabo/22296/</link>
		<pubDate>Thu, 16 Feb 2017 00:14:20 +0000</pubDate>
		<dc:creator><![CDATA[榊原昌彦]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Angular 2]]></category>
		<category><![CDATA[Ionic2]]></category>

		<guid isPermaLink="false">/?p=22296</guid>
		<description><![CDATA[連載： React/Angular2時代のWeb開発 (3)Web制作してると、また新技術が出たのかと思うと、気づいたら「新常識」が増えてたということに頻繁に出会います。 タスクランナー、SCSS、LiveReload、...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/webdev-2016/" class="series-400" title="React/Angular2時代のWeb開発" data-wpel-link="internal">React/Angular2時代のWeb開発</a> (3)</div><p>Web制作してると、また新技術が出たのかと思うと、気づいたら「新常識」が増えてたということに頻繁に出会います。</p>

<p>タスクランナー、SCSS、LiveReload、SPA、PWA、ハイブリッドアプリ。そういった近年のキーワードを一気に体験できるUIフレームワーク「Ionic 2」が先日リリースされましたので、ご紹介します。</p>

<p><strong>編集部注: Angular 2の正式名称は「Angular」ですが、現状だと「AngularJS 1.x」のことを呼称していると誤解される可能性が高いと判断し、本稿では「Angular 2」で統一させていただきます</strong></p>

<p>記事の内容が古くなってたので、2017年8月11日に更新しました</strong></p>

<h2>Ionic 2の概要</h2>

<p><img src="/wp-content/uploads/2017/02/ionic-2-final-header.jpg" alt="ionic-2-final-release" width="640" height="384" class="alignnone size-full wp-image-22302" srcset="/wp-content/uploads/2017/02/ionic-2-final-header.jpg 640w, /wp-content/uploads/2017/02/ionic-2-final-header-300x180.jpg 300w, /wp-content/uploads/2017/02/ionic-2-final-header-207x124.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
Ionic2は、アメリカの<a href="https://ionic.io/about" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Ionic社</a>が中心となって開発しているオープンソースのモバイルフレームワークです。
Angular 1上に構築されたIonic 1の後継プロダクトとなり、当時の経験が反映され、とても完成度が高く仕上がっています。
つい先日の2017年1月29日に正式リリースされました。</p>

<p><a href="https://ionic.io/about" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Drifty Co</a>がデモアプリとして、<a href="https://pwa.ionic.io/ionic-conference-app/www/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Ionic 2 Conference Application</a>を公開していますので、ぜひアクセスしてみてください。モバイルアプリのデモですので、スマホからアクセスするのがいいかと思います。Ionic 2の世界観とデフォルトデザインの完成度の高さがよくわかるデモとなっています。</p>

<p>このデモでわかる操作性・UI以外にも、Ionic2には</p>

<ul>
<li>ターミナルにコマンドを4行入れるだけで開発をはじめることができる</li>
<li>Webはもちろんのこと、iOS/Android/WindowsPhoneアプリとしてもリリースできる</li>
<li>ブラウザにPush通知を送ったり、オフライン対応することも可能</li>
<li>Angular 2上に構築されているので高速</li>
</ul>

<p>という特徴があります。
Web最前線の現場で使われてる技術を体験するために、ぜひとも一度使ってみてください！
　</p>

<h2>4行で高速開発環境構築</h2>

<p>Ionic 2でどのような体験ができるかをご紹介するために、実際にプロジェクトを立ち上げてみます。以下は、Node.js(6以上)をインストールされている環境を前提にしていますので、未インストールの場合は <a href="https://nodejs.org/ja/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">https://nodejs.org/ja/</a> からインストールください。</p>

<p>最初に、ターミナル（Windowsの場合はコマンドプロンプト）を立ち上げ、以下のコマンドを入力します。これで、Ionic 2を構築するためのIonic CLIというパッケージをインストールします。
</p><pre class="crayon-plain-tag">npm install -g ionic cordova</pre><p></p>

<p>次に、プロジェクトを作るフォルダに移動して、以下のコマンドを入力します。するとProjectNameという名前のフォルダが作成され、2-3分でプロジェクトが作成されます。
</p><pre class="crayon-plain-tag">ionic start ProjectName --v2</pre><p></p>

<p>最後に、ProjectNameというフォルダに移動し、<code>ionic serve</code>という開発を開始するためのコマンドを入力します。</p>

<p></p><pre class="crayon-plain-tag">cd ProjectName
ionic serve</pre><p></p>

<p>すると、自動的にブラウザが立ち上がり、画面が表示されます。URLが<code>http://localhost:8100/</code>になっていると思いますが、これはIonic CLIが自動的に開発用サーバを立ち上げてくれたためです。（実際にアクセスしているのは、<code>www/</code>フォルダの中です）</p>

<p>4行のコマンドで開発の準備が完了しました！</p>

<p><img src="/wp-content/uploads/2017/02/fc943b474dd3f664b17206df1d0b5983-300x236.png" alt="Ionic-serve" width="300" height="236" class="alignnone size-medium wp-image-22322" style="border:1px solid #c0c0c0" srcset="/wp-content/uploads/2017/02/fc943b474dd3f664b17206df1d0b5983-300x236.png 300w, /wp-content/uploads/2017/02/fc943b474dd3f664b17206df1d0b5983.png 640w, /wp-content/uploads/2017/02/fc943b474dd3f664b17206df1d0b5983-207x163.png 207w" sizes="(max-width: 300px) 100vw, 300px" />
　</p>

<h2>5分でIonic 2の開発を体験！</h2>

<p>早速開発してみましょう。Ionic 2は、様々な機能が実装されているためにいろいろな設定ファイルやフォルダが用意されていますが、最初は<code>src/</code>と<code>www/</code>の中をさわれば事足ります。</p>

<p></p><pre class="crayon-plain-tag">ProjectName/
├── src/
　　├── app/
　　├── assets/
　　├── pages/
　　　　├── about/
　　　　├── contact/
　　　　├── home/
　　　　└── tabs/
　　├── theme/
　　└── index.html
└── www/</pre><p></p>

<p>では、まず<code>src/pages/</code>の中を見てみましょう。</p>

<p>4つのフォルダが、画面のそれぞれのComponentに対応しています。例えば、Home画面だと以下の通りです。
メインコンテンツは<code>home/home.html</code>が、タブのエリアは<code>tabs/tabs.html</code>がテンプレートになっています。</p>

<p><img src="/wp-content/uploads/2017/02/components-300x236.jpg" alt="components" width="300" height="236" class="alignnone size-medium wp-image-22335" srcset="/wp-content/uploads/2017/02/components-300x236.jpg 300w, /wp-content/uploads/2017/02/components.jpg 640w, /wp-content/uploads/2017/02/components-207x163.jpg 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>試しに、<code>home/home.html</code>をログインフォームにしてみましょう。<code>home/home.html</code>の中身を以下に差し替えて見てください。</p>

<p></p><pre class="crayon-plain-tag">&lt;ion-header&gt;
  &lt;ion-navbar&gt;
    &lt;ion-title&gt;Home&lt;/ion-title&gt;
  &lt;/ion-navbar&gt;
&lt;/ion-header&gt;

&lt;ion-content padding&gt;
  &lt;ion-list&gt;
    &lt;ion-item&gt;
      &lt;ion-label fixed&gt;Username&lt;/ion-label&gt;
      &lt;ion-input type="text" value=""&gt;&lt;/ion-input&gt;
    &lt;/ion-item&gt;

    &lt;ion-item&gt;
      &lt;ion-label fixed&gt;Password&lt;/ion-label&gt;
      &lt;ion-input type="password"&gt;&lt;/ion-input&gt;
    &lt;/ion-item&gt;
  &lt;/ion-list&gt;
  &lt;button ion-button block&gt;Login&lt;/button&gt;
&lt;/ion-content&gt;</pre><p></p>

<p>そして保存すると、自動的にブラウザが更新されて、ログインフォームが表示されます。
LiveReloadという機能で、一回いっかい更新ボタンを自分で押す必要がないので、複数ディスプレイで作業してる時とても捗ります。</p>

<p><img src="/wp-content/uploads/2017/02/de1be981c4d7b0b36c54226a2a051941-300x236.png" alt="ionic2-form" width="300" height="236" class="alignnone size-medium wp-image-22350" style="border:1px solid #c0c0c0" srcset="/wp-content/uploads/2017/02/de1be981c4d7b0b36c54226a2a051941-300x236.png 300w, /wp-content/uploads/2017/02/de1be981c4d7b0b36c54226a2a051941.png 640w, /wp-content/uploads/2017/02/de1be981c4d7b0b36c54226a2a051941-207x163.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<h3>見慣れないタグ。これって何？</h3>

<p><code>home/home.html</code>のタグをみると、<code>ion-header</code>や<code>ion-content</code>と見覚えのないタグが使われていることに気づくと思います。これは、Directiveを使って定義づけているカスタムタグで、Ionic 2オリジナルのものです。
例えば、&lt;button ion-button&gt;Login&lt;/button&gt;だと、これをJavaScriptが以下のように展開します。</p>

<p></p><pre class="crayon-plain-tag">&lt;button block="" ion-button="" class="button button-md button-default button-default-md button-block button-block-md"&gt;
    &lt;span class="button-inner"&gt;Login&lt;/span&gt;
    &lt;div class="button-effect" style="transform: translate3d(392px, -91px, 0px) scale(1); height: 240px; width: 240px; opacity: 0; transition: transform 552ms, opacity 386ms 166ms;"&gt;
    &lt;/div&gt;
&lt;/button&gt;</pre><p></p>

<p>複雑なHTMLであったり、多くのclass名であったりをいちいち書かなくてもいいようにIonic 2が処理してくれますので、開発コードがとても可読性の高いものとなります。
Ionic 2が用意しているComponentsは、<a href="http://ionicframework.com/docs/v2/components/#overview" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">公式のサイト</a>から一覧で確認できます。</p>

<p><a href="http://ionicframework.com/docs/v2/components/#overview" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2017/02/2e775995931fe381d9ce29df3b452eb6-300x184.png" alt="ionic2-components" width="300" height="184" class="alignnone size-medium wp-image-22361" style="border:1px solid #c0c0c0" srcset="/wp-content/uploads/2017/02/2e775995931fe381d9ce29df3b452eb6-300x184.png 300w, /wp-content/uploads/2017/02/2e775995931fe381d9ce29df3b452eb6.png 640w, /wp-content/uploads/2017/02/2e775995931fe381d9ce29df3b452eb6-207x127.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>Ionic 2を使っていると、最初は「ドキュメントにあるコンポーネントをコピペしていく」だけで大部分のUIデザインが完了します。ですので、ワイヤーフレーム段階からがしがし作っては捨てるタイプの<strong>小さく回す開発</strong>が可能です。</p>

<h2>Ionic 2のUI</h2>

<h3>Themeを書き換える</h3>

<p>Ionic 2は、CSSを拡張したSCSSを採用しています。変数などが使えるので、<code>!important</code>を使わずにThemeの変更をすることが可能です。
実際に、SCSSの変数機能を利用して、Themeを自作してみましょう。</p>

<p><code>src/theme/variables.scss</code>を開いてみてください。現在設定されているThemeの変数を入れ替えたり、上書きするための設定ファイルです。</p>

<p><img src="/wp-content/uploads/2017/02/b7120d716c16d8f1965294569cd704ea-300x137.png" alt="" width="300" height="137" class="alignnone size-medium wp-image-22480" style="border:1px solid #c0c0c0" srcset="/wp-content/uploads/2017/02/b7120d716c16d8f1965294569cd704ea-300x137.png 300w, /wp-content/uploads/2017/02/b7120d716c16d8f1965294569cd704ea.png 640w, /wp-content/uploads/2017/02/b7120d716c16d8f1965294569cd704ea-207x95.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>この$colorsで設定されているprimaryがdefaultの色となります。試しにこの色をredに変更して保存してみてください。正常にLiveReloadが動作していれば、自動的に以下のようにThemeが変更されます。</p>

<p><img src="/wp-content/uploads/2017/02/83ba668bf8978ceaa5c99c7298db6ddb-300x201.png" alt="" width="300" height="201" class="alignnone size-medium wp-image-22483" style="border:1px solid #c0c0c0" srcset="/wp-content/uploads/2017/02/83ba668bf8978ceaa5c99c7298db6ddb-300x201.png 300w, /wp-content/uploads/2017/02/83ba668bf8978ceaa5c99c7298db6ddb.png 640w, /wp-content/uploads/2017/02/83ba668bf8978ceaa5c99c7298db6ddb-207x139.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>他にも、様々な設定変数がIonic2には用意されています。試しにツールバーの背景色を変更してみましょう。 $colorsの下に、以下の値を入力してください。</p>

<p></p><pre class="crayon-plain-tag">$toolbar-background : yellow;</pre><p></p>

<p>そしてリロードすると、ツールバーの背景色が黄色になるのを確認できます。これらの設定変数は<a href="http://ionicframework.com/docs/v2/theming/overriding-ionic-variables/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Overriding Ionic Sass Variables</a>に書いてありますので、ここを見ながら変数を作っていくと、簡単にオリジナルThemeを作ることができます。</p>

<h3>プラットフォームチェック</h3>

<p>Ionic 2は、それぞれのモバイルOSの文化に寄り添ったデザインで表示されるようになっています。上記はChromeで表示しているのでマテリアルデザインとなっていますが、iOS SafariでみるとiOSのデザインに自動的に変更されます。</p>

<p>それぞれのモバイルブラウザでどのように表示されるかを見比べる機能があるので使ってみましょう。<code>http://localhost:8100/ionic-lab</code>にアクセスしてみてください。先程の表示画面がそれぞれのモバイルプラットフォーム毎にどのように表示されるのか見比べることができます。</p>

<p><img src="/wp-content/uploads/2017/02/a60eeff0d99ea74a437e9f542dd9aba5-640x409.png" alt="ionic-lab" width="640" height="409" class="alignnone size-large wp-image-22355" style="border:1px solid #c0c0c0" srcset="/wp-content/uploads/2017/02/a60eeff0d99ea74a437e9f542dd9aba5.png 640w, /wp-content/uploads/2017/02/a60eeff0d99ea74a437e9f542dd9aba5-300x192.png 300w, /wp-content/uploads/2017/02/a60eeff0d99ea74a437e9f542dd9aba5-207x132.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>UI,UXを考える上で、それぞれのユーザのプラットフォームの文化に寄り添うのはとても重要な要素ですので、とても重宝する機能です。</p>

<h2>Ionic 2をコンパイルする</h2>

<h3>iPhoneアプリとしてコンパイルする</h3>

<p>作ったWebアプリを、iOS/Android/Windows Phoneのアプリとしてコンパイルすることができ、それぞれのプラットフォーム上でのアプリストアで販売できます（このように作られたアプリをハイブリッドアプリといいます）</p>

<p>コンパイルは、とても簡単です。例えば、Xcodeをインストール済みのMacでしたら、以下のコマンドを入力するだけでコンパイルが行われ、iOSアプリとしてのプレビューが行われます。</p>

<p></p><pre class="crayon-plain-tag">ionic cordova emulate ios</pre><p></p>

<p><img src="/wp-content/uploads/2017/02/3bb7d0edd89d05a7b43f6f55851877c5-163x300.png" alt="" width="163" height="300" class="alignnone size-medium wp-image-22369" srcset="/wp-content/uploads/2017/02/3bb7d0edd89d05a7b43f6f55851877c5-163x300.png 163w, /wp-content/uploads/2017/02/3bb7d0edd89d05a7b43f6f55851877c5-113x207.png 113w, /wp-content/uploads/2017/02/3bb7d0edd89d05a7b43f6f55851877c5.png 322w" sizes="(max-width: 163px) 100vw, 163px" /></p>

<h3>Webがオフラインでも表示できるようにする</h3>

<p>Ionic 2は、Googleが提唱している<a href="https://developers.google.com/web/fundamentals/getting-started/primers/service-workers?hl=ja" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Service Worker</a>という<strong>Webサイトをアプリとして使うための技術</strong>を積極的にキャッチアップしています。Service Workerには様々な機能がありますが、Ionic 2はデフォルトでオフライン対応が実装されています。</p>

<p>オフライン対応を有効するのはとても簡単で、<code>src/index.html</code>の17-24行目のコメントアウトを外すだけです。</p>

<p></p><pre class="crayon-plain-tag">&lt;script&gt;
    if ('serviceWorker' in navigator) {
      navigator.serviceWorker.register('service-worker.js')
        .then(() =&gt; console.log('service worker installed'))
        .catch(err =&gt; console.log('Error', err));
    }
  &lt;/script&gt;</pre><p></p>

<p>ただ注意事項が2点ありまして、1つはServiceWorkerはSSLでしか動かないです。もうひとつは、現行ではiOS非対応ですので、iPhoneでの確認をすることはできません。ご注意ください。</p>

<h3>リリース版をコンパイルする</h3>

<p>Ionic 2のコンパイルは、<code>serve</code>/<code>cordova emulate</code>と<code>npm run build --prod</code>のに分かれます。簡単に違いをいうと、前者はLiveReloadをストレスなく行うために実環境のパフォーマンスを落としていて（Just in Time Compile）、後者はコンパイル時に時間こそがかかるものの、それ以降はとても高速に動作します（Ahead of Time Compile）。ですので、開発環境では前者を、本番環境では後者を使います。
Ahead of Time Compileのコマンドは以下ですので、お気をつけください。</p>

<p></p><pre class="crayon-plain-tag">npm run build --prod</pre><p> 
</p><pre class="crayon-plain-tag">ionic cordova build ios --prod</pre><p> 
</p><pre class="crayon-plain-tag">ionic cordova build android --prod --release</pre><p></p>

<p>なお、Compileの違いの詳細に興味がある方は、<a href="http://qiita.com/Quramy/items/a603ddb47d6e4b3497e1" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Angular AoTガイド</a>をご覧ください。</p>

<h2>終わりに</h2>

<p>ここまでは、入門的HowToをご紹介してきました。冒頭でもふれたとおり、近年のフロントエンドのキーワードをまとめてさわるにはとても優れたモバイルフレームワークです。しかしながら、実案件に入るとAngular 2ベースのComponents開発であったり、SPA文化であったり、開発に入る前にもっと触れておいた方がいい知識があります。そこで、次の入り口として、3つをご案内して結びにかえさせていただきます。</p>

<h3>公式のチュートリアルでもっと学ぶ</h3>

<p>Ionic 2では、初心者向けのチュートリアルを用意しています。英語なので少し大変かもしれませんが、大変わかりやすく書かれてありますのでおすすめです。Ionic 2を使う前提でしたら、Angular 2のチュートリアルをする前にぜひこちらを試してみてください。</p>

<p><a href="http://ionicframework.com/docs/v2/intro/tutorial/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Ionic 2 Tutorial</a></p>

<h3>日本語コミュニティあります</h3>

<p>今では随分改善されましたが、Ionic 2はリリース前（特にβ版時代）はとても日本語情報が少なかったので、知見を共有するためにslackのオープンチャンネルを開設しました。分かる方がいれば有志が回答する形ですのでレスポンス速度はあまり高くありませんが、ご活用いただけましたら幸いです。</p>

<p><a href="https://ionic2-ja.herokuapp.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Ionic 2 slackチーム</a></p>
]]></content:encoded>
		
		<series:name><![CDATA[React/Angular2時代のWeb開発]]></series:name>
	</item>
		<item>
		<title>Angular 2で10万行書いた人にナマの声を聞く─奥野賢太郎×白石俊平</title>
		<link>/shumpei-shiraishi/21837/</link>
		<pubDate>Fri, 16 Dec 2016 04:14:01 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Angular 2]]></category>
		<category><![CDATA[TypeScript]]></category>

		<guid isPermaLink="false">/?p=21837</guid>
		<description><![CDATA[2016年9月のAngular 2リリースは、2016年のWeb業界で、最も重要なトピックの一つだったと言っても過言ではないでしょう。 本稿では、Angular 2を正式リリース以前から仕事で使い倒していた奥野賢太郎さん...]]></description>
				<content:encoded><![CDATA[<p><style>
b.speaker {
  font-weight: bold;
}
b.speaker::after {
  content: ": ";
}
</style>
2016年9月のAngular 2リリースは、2016年のWeb業界で、最も重要なトピックの一つだったと言っても過言ではないでしょう。
本稿では、Angular 2を正式リリース以前から仕事で使い倒していた奥野賢太郎さん（<a href="http://qiita.com/armorik83" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">armorik83</a>）と、不肖白石が、Angular 2開発を実際にやってみている同士で語り合ってみました。
<strong>実際にAngular 2開発で苦労してきた二人のナマ声です。</strong>今後Angular 2を仕事で採用しようと考えている方々には必見の内容です（って、自分が出ている記事を紹介するのも微妙ですが…）。</p>

<p><img src="/wp-content/uploads/2016/12/DSC08393.jpg" alt="" width="640" height="405" class="alignnone size-full wp-image-21848" srcset="/wp-content/uploads/2016/12/DSC08393.jpg 640w, /wp-content/uploads/2016/12/DSC08393-300x190.jpg 300w, /wp-content/uploads/2016/12/DSC08393-207x131.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>編集部注: Angular 2の正式名称は「Angular」ですが、現状だと「AngularJS 1.x」のことを呼称していると誤解される可能性が高いと判断し、本稿では「Angular 2」で統一させていただきます</strong></p>

<h2>Angular 2のコードを10万行書いた</h2>

<p><b class="speaker siraisi">白石</b>奥野さん、今日はよろしくお願いします。奥野さんの、Angularとの関わりを教えていただけますか？</p>

<p><b class="speaker 83">奥野</b> 私はもともと関西で音楽の専門学校を出て、音楽関係の仕事をしていたんですが、それだけじゃ食っていけなくて、Web制作のバイトをしていたんです。
それでそのうちAngularJS 1を触るようになり、関西にAngular専門のコミュニティがなかったので、<a href="http://ng-kyoto.github.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ng-kyoto</a>ってコミュニティを立ち上げて…っていうのが馴れ初めです。</p>

<p><img src="/wp-content/uploads/2016/12/9676638e621cf5ea14b878651d20b7cd.jpg" alt="" width="640" height="449" class="alignnone size-full wp-image-21851" srcset="/wp-content/uploads/2016/12/9676638e621cf5ea14b878651d20b7cd.jpg 640w, /wp-content/uploads/2016/12/9676638e621cf5ea14b878651d20b7cd-300x210.jpg 300w, /wp-content/uploads/2016/12/9676638e621cf5ea14b878651d20b7cd-207x145.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b>最初は音楽の仕事をされてたんですか！むしろその話に興味があります(笑)。でもまあ、この場ではそこを聞くのは我慢して、Angularとの関わりの話を続けてください。</p>

<p><b class="speaker 83">奥野</b> で、東京に出てきて就職した企業で、そこは大規模なWebサービスを運営しているのですが、AngularJSを採り入れてみるというプロジェクト開発を行っていたんです。
ただ、サービスが巨大すぎたためパフォーマンスが全然出なくて困っていたところに、Angular 2がβバージョンに到達したというニュースが舞い込みまして。
もともとAngular 2も個人的には触っていたので、Angular 2でやってみたらどうかと提案したら通りまして、そこからAngular 2を仕事で書きまくる日々が始まりました。</p>

<p><b class="speaker siraisi">白石</b>βになったタイミングが良かったんですね。ちなみにぼくのAngularとの関わりを言うと、実はAngularJS 1.xはあまり触っていないんです。あんまり好きになれなくて。
でも、<a href="https://techfeed.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TechFeed</a>というエンジニア向けニュースアプリを自社開発している中で、次はモバイルアプリをWeb技術で使いたいと思った時に、Angular 2が選択肢に挙がりまして。</p>

<p>ぼくらはモバイルアプリのUXを重視したかったので、そのタイミングで「モバイルを想定して、パフォーマンスを重視した」というAngular 2が出てきたのは、タイミングが良かったんですね。
モバイルアプリ向けのUIフレームワークである<a href="http://ionicframework.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic</a>もAngular 2をベースに書き直され始めていましたし、AngularJS 1.xのちょっとごちゃごちゃした感じが綺麗に整理されてもいたので、
当時βバージョンではありましたが、全面的に採用することにしました。</p>

<p><img src="/wp-content/uploads/2016/12/70dd260c7333734760126270a0ae4125.jpg" alt="" width="640" height="432" class="alignnone size-full wp-image-21852" srcset="/wp-content/uploads/2016/12/70dd260c7333734760126270a0ae4125.jpg 640w, /wp-content/uploads/2016/12/70dd260c7333734760126270a0ae4125-300x203.jpg 300w, /wp-content/uploads/2016/12/70dd260c7333734760126270a0ae4125-207x140.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b>ちなみに奥野さん、Angular 2関連のコードはどれくらい書かれたんですか？</p>

<p><b class="speaker 83">奥野</b> そうですね、GitHub上のコードカウントから大雑把に言うと、<strong>だいたい10万行くらい</strong>です。</p>

<p><b class="speaker siraisi">白石</b>10万行！？すごいですね！</p>

<p><b class="speaker 83">奥野</b> はい、書きまくりました(笑)。私一人が書いたコードがそれくらい。最終的には6名くらいのチームで、かなりの量のコードを書きましたね。</p>

<h2>実際に使ってみて感じたAngular 2のメリット</h2>

<p><b class="speaker siraisi">白石</b>じゃあそろそろ、Angular 2開発をやってみたナマの声を読書の方々に届けるという、本題に入りますか。奥野さんは、Angular 2のメリットと言われてぱっと思いつくのはなんですか？</p>

<p><b class="speaker 83">奥野</b> そうですね、さっきも言いましたけど、<strong>やはりパフォーマンスの良さですね。</strong></p>

<p><b class="speaker siraisi">白石</b>ぼくは1をほとんど使っていないのですが、そこまで違いますか、やっぱり。</p>

<p><b class="speaker 83">奥野</b> はい、<strong>1に比べると段違いです。</strong> コンポーネントの状態が変更されたことを検知する、<code>ChangeDetector</code> という仕組みがやはり素晴らしい。
非同期処理や、ブラウザ上のイベントを検知して、<code>ChangeDetector</code>が状態をチェックします。Angular JS 1.xだと、($scopeの)変更検知はループ処理で行っていたのですが、ずいぶん効率が良くなりました。</p>

<p><em>（筆者注: 「非同期処理や、ブラウザ上のイベントを検知」する処理は、<a href="https://github.com/angular/zone.js/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Zone.js</a>というライブラリで行う。AngularはZoneのイベントを受けて、<code>ChangeDetector</code>がコンポーネントの変更検知を行う）</em></p>

<p><b class="speaker siraisi">白石</b><code>ChangeDetector</code>のコードを動的に生成するというのも、Angular 2のパフォーマンスを向上させていますよね。VMフレンドリーと言われている。</p>

<p><em>（筆者注: Angular 2は、コンポーネントの変更検知処理をライブラリとして一括で行うのではなく、コンポーネントごとに専用の<code>ChangeDetector</code>を自動的にコード生成する。
生成された<code>ChangeDetector</code>はほぼ静的なコードとなるため、JavaScript VMにとって最適化しやすいと言われている）</em></p>

<p>あと、先ほど「6名くらいのチームで」とおっしゃってましたが、<strong>TypeScriptはよく言われているように、チーム開発に向いていましたか？</strong></p>

<p><b class="speaker 83">奥野</b> <strong>はい、それは間違いなく。</strong>ミスも減らせますし、複数人で書いたコードの統合もしやすいです。また、一つの大きな機能を複数人で作る時に、インターフェースだけ先に決めておき、モックを活用して並行開発するというのもやりやすかったです。
こういう開発は、型がないJavaScriptよりもずっとうまくやれると思います。</p>

<p><img src="/wp-content/uploads/2016/12/DSC08424.jpg" alt="" width="640" height="431" class="alignnone size-full wp-image-21858" srcset="/wp-content/uploads/2016/12/DSC08424.jpg 640w, /wp-content/uploads/2016/12/DSC08424-300x202.jpg 300w, /wp-content/uploads/2016/12/DSC08424-207x139.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b>「インターフェースに対してプログラミングする」というやつですね。</p>

<p><b class="speaker 83">奥野</b> Angular 2のほかの大きなメリットとしては、やはり<strong>コンポーネント指向</strong>であることが挙げられるかと思います。
私のときは、コンポーネントのHTMLとコード（TypeScript）はエンジニアが、CSSはデザイナーがメンテナンスするという役割分担を行ったのですが、これもうまくいきました。
Angular 2が、コンポーネント同士だけではなく、コンポーネントのマークアップ、プログラミング、スタイリングを自然に分割できるよう設計されているおかげだと思います。</p>

<p><b class="speaker siraisi">白石</b>確かに、コンポーネント指向は一番のメリットですよね。再利用性も上がるし、何より「UIを分割して設計しよう」という空気が自然と生まれるのもいい点だと思います。
特にぼくは、コンポーネントごとにCSSがカプセル化されて、他のコンポーネントに影響を及ぼさない点が特に気に入ってます。<a href="http://getbem.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">BEM</a>とかの、長ったらしいクラス名が実は好きじゃないもので…</p>

<p><b class="speaker 83">奥野</b> わかります。ただ、私たちの場合はAngularJS 1.xからの移行からプロジェクトが始まってしまったので、Scoped CSSはうまく活かせなかったんですよね。そこはしょうがなくBEMを使い続けていました。</p>

<h2>Angular 2アプリ開発で苦労した／している点</h2>

<p><b class="speaker siraisi">白石</b>では、今回の目玉（？）である、Angular 2の「しんどい点」について話しましょうか(笑)。</p>

<p><b class="speaker 83">奥野</b> はい、ぜひ。ただ…実は私、Angular 2は結構気に入ってまして、<strong>すぐには欠点が思いつかない</strong>んですよね…白石さん、なんかあります？</p>

<p><b class="speaker siraisi">白石</b>確かに、ぼくも気に入っちゃってるので、あんまり思いつかないですね。</p>

<p><b class="speaker 83">奥野</b> ただ思い返してみると、<strong>AngularJS 1.xからAngular 2に移行するのはしんどかったですね</strong>。</p>

<p><b class="speaker siraisi">白石</b>そうか、それはぼくがわからない苦労だ。それは大変そう(笑) 規模が大きいと特に。</p>

<p><b class="speaker 83">奥野</b> 移行するときは、3〜4万行くらい(のAngularJS 1.xのコード)だったと思います。コンポーネント数とかはよく覚えていて180コンポーネント、90サービスです。
<strong>これを移行するのにだいたい3〜4人月かかった</strong>かな、という感じです。しかももともと私たちはTypeScriptでAngularJS 1.xを使っていたので、元がJavaScriptの場合は、もっと移行に時間がかかると思います。</p>

<p><b class="speaker siraisi">白石</b>それはしんどい。</p>

<p><b class="speaker 83">奥野</b> でも移行したときに最初に思ったのは、<strong>「あ、ほんとにできるんだ」</strong>っていう驚きでしたけどね(笑)。その時の移行パスについては、<a href="https://speakerdeck.com/armorik83/ngupgradetoyi-zhi-zhan-lue" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ng-japanのカンファレンス</a>で発表しました。Angular 2.0.0がリリースされるより前の資料なので少し古いですが、考え方は変わっていません。
あと、苦労した点で思い出したのですが、<strong>最初の学習コストが高い</strong>という問題はありますね。TypeScriptに慣れていない、JavaScriptしか触ったことのないエンジニアにとっては、型がある言語って最初は扱いにくかったみたいです。</p>

<p><img src="/wp-content/uploads/2016/12/64d9cac9588bf2951b5dd129a27e7efa.jpg" alt="" width="640" height="444" class="alignnone size-full wp-image-21855" srcset="/wp-content/uploads/2016/12/64d9cac9588bf2951b5dd129a27e7efa.jpg 640w, /wp-content/uploads/2016/12/64d9cac9588bf2951b5dd129a27e7efa-300x208.jpg 300w, /wp-content/uploads/2016/12/64d9cac9588bf2951b5dd129a27e7efa-207x144.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b>学習コストの面はよく言われてますよね。TypeScriptに加えて、Angular 2そのものの学習コストも高いですしね。</p>

<p><b class="speaker 83">奥野</b> 付属しているRxJSとかも学習コストはかなり高いですね。</p>

<p><b class="speaker siraisi">白石</b>あ、それで思い出した。<strong><a href="http://reactivex.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">RxJS</a>のドキュメントが腐ってる</strong>のはしんどい。</p>

<p><b class="speaker 83">奥野</b> 腐ってる(笑)。</p>

<p><b class="speaker siraisi">白石</b>腐ってますよ！ナビゲーションしにくいし、不完全だし。ぼくなんかまだRxJS初心者なので、ドキュメント見ないとRxJSのコード書けないんですが、ドキュメントが使いにくくていつもつらい想いをしてます。
ほかにも、Angular 2のツライ点で言うと、<strong>ビルドが遅い</strong>のにはいつも辟易してます。
うちなんか、コードを直して、自動的にwebpack 2がビルドし直して、ブラウザが自動リロードして、結果が確認できるまでいつも10秒くらいかかってます。</p>

<p><b class="speaker 83">奥野</b> <strong>10秒なんてまだ速い方です(笑) 私たちのチームなんて最初Browserify使ってたのですが、45秒かかってましたから(笑)。</strong>
この状況で、(ファイルの変更を) ウォッチ＆再ビルドしてたら、うかつにファイルをセーブすることもためらわれてしまうので、最後はウォッチを無効化して手動ビルドするようにしてました(笑)。</p>

<p>でもこれも、webpackに変えただけでビルド時間が20秒切るようになったんですよね。そういう、<strong>ビルド環境の進化とかにも追随していく必要がある。</strong></p>

<p><b class="speaker siraisi">白石</b>そう、それもけっこう大変なんですよね。うちなんて、 <a href="https://github.com/angular/angular-cli" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><code>angular-cli</code></a>とかができる前に自前でビルドスクリプト作っちゃってたので、ずっとそれを自分たちでメンテナンスしてます。
そのコストもバカにならない。</p>

<p><b class="speaker 83">奥野</b> そうそう。そういう、<strong>ぬか床をずっとメンテナンスする</strong>みたいな人が必要になっちゃいますよね。</p>

<p><b class="speaker siraisi">白石</b> <strong>ぬか床キーパー(笑)</strong> 。ちなみに、<code>angular-cli</code>は使ったほうがいいですか、やっぱり。</p>

<p><b class="speaker 83">奥野</b> 公式に推奨されてるので、使ったほうがいいでしょうね。</p>

<p><b class="speaker siraisi">白石</b>前に使おうかと思ったんですが、ビルドスクリプトがかなり複雑で、理解するのがしんどそうだな、と思って敬遠しちゃったんですよね。
ブラックボックスとして扱えばいいんでしょうけど、うちはCordovaも使ったりしているのでビルド時に求められることがかなり複雑なんです。
きっと手を入れないわけにいかない。</p>

<p><b class="speaker 83">奥野</b> プロジェクトを続けていくと、ビルドプロセスをいじりたくなることはきっとあるでしょうし、中身の理解は必要になってくるでしょうね。
ただ、最初はブラックボックスとして簡単に使い始められるのと、ビルドツールの進化に追随していってくれるのはありがたいです。</p>

<p><b class="speaker siraisi">白石</b>確かに、ビルドツールの進化に付いていくのも一苦労だしなあ…移行、考えようかなあ…</p>

<h2>Angular 2から探る、今後のWebアプリ開発の展望</h2>

<p><b class="speaker siraisi">白石</b>では対談の締めに、Angular 2から今後のWebアプリ開発の展望を探ってみたいと思います。
Angular 2のリリースは、Web業界にとっては間違いなく大ニュース。そこから、今後のWeb開発のヒントが得られるのではないかと思って、こういうトピックを最後に持ってきてみました。
まず、<strong>Angular 2は今後半年ごとにメジャーバージョンアップを行っていくそうですね？</strong></p>

<p><b class="speaker 83">奥野</b> そうですね。<a href="http://angularjs.blogspot.jp/2016/12/ok-let-me-explain-its-going-to-be.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">次のリリースは2017年の3月で、バージョンは4になる予定</a>です。
<a href="https://github.com/angular/angular/tree/master/modules/%40angular/router" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@angular/router</a>というパッケージだけ、バージョンが現在3になってしまっているので、次のバージョンアップでメジャーバージョン番号を合わせるために4になります。</p>

<p><img src="/wp-content/uploads/2016/12/b5e49ca28f28eb8832e871eddb02c47c.jpg" alt="" width="640" height="453" class="alignnone size-full wp-image-21856" srcset="/wp-content/uploads/2016/12/b5e49ca28f28eb8832e871eddb02c47c.jpg 640w, /wp-content/uploads/2016/12/b5e49ca28f28eb8832e871eddb02c47c-300x212.jpg 300w, /wp-content/uploads/2016/12/b5e49ca28f28eb8832e871eddb02c47c-207x147.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b>しかし、メジャーバージョンアップが半年ごとというのは普通じゃないですよね。何らかのメッセージを感じる。</p>

<p><b class="speaker 83">奥野</b> それは、<strong>メジャーバージョンアップに伴って「後方互換性を壊すかもしれない変更も、ためらうことなく行っていく」というメッセージの表れ</strong>です。</p>

<p><b class="speaker siraisi">白石</b>ほー、それ、ちょっと詳しく伺ってもいいですか？</p>

<p><b class="speaker 83">奥野</b> こういう方針になったのは、<strong>AngularJS 1.xの反省がある</strong>わけですね。
AngularJS 1.xは後方互換性を保ったまま、小幅な変更を繰り返しながら5年以上開発が続いていたわけですが、その間にWebの環境が大きく変わってしまい、追随できなくなってしまっていた。
そうしたツケを払ったのが、今回のAngular 2へのバージョンアップです。全てを1から作り直さなくてはいけなかった。
そのため、「<strong>後方互換性を損なってでも、Webの進化についていく</strong>」という方針を明確にしつつ、メジャーバージョン間の破壊的変更を最小化しようというわけです。</p>

<p><b class="speaker siraisi">白石</b>なるほど！そういう方針であれば、Webの進化に対して、フレームワークが置き去りにされることもなさそうですね。
例えば今は、コンポーネントのカプセル化にはShadow DOMのエミュレーションがデフォルトですが、Shadow DOMに対応したブラウザが広まった暁には、Shadow DOMをデフォルトにするという変更も行える。
普通はそういう変更は、かなり影響範囲が大きいのでフレームワークとしては慎重にならざるをえないですが、「メジャーバージョンアップだから」という理由で、そういう変更も大胆に行えるわけですね。</p>

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

<p><b class="speaker 83">奥野</b> そうですね。他にも例えばWeb Workersをデフォルトにするとかもあり得ますよね。それに実際には、ある機能が廃止されるとしても、まずは「非推奨」になってから、次のメジャーバージョンアップで削られる。
メジャーバージョンアップ2回分、つまり1年間の猶予があるので、実際には破壊的変更に対しても追随はそこまで難しくないと思います。</p>

<p><b class="speaker siraisi">白石</b>Webの進化に合わせて、どこまでも進化していくフレームワークということですね。ならば、正式名称からバージョン番号を外して「Angular」にしたというのも頷けます。
Angularを開発しているGoogleは、Webの標準化においても影響力は大きいですし、<strong>Webの進化とAngularの進化が両輪で進んでいく</strong>というわけですね。Webはこれからもエキサイティングな場であり続けそうです。</p>
]]></content:encoded>
			</item>
		<item>
		<title>React vs Angular 2ガチ対決！エキスパートたちによるハイレベル対談 (2 / 2) ー TechFeed Live#2レポート</title>
		<link>/shumpei-shiraishi/21754/</link>
		<pubDate>Tue, 13 Dec 2016 01:54:04 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[Angular 2]]></category>
		<category><![CDATA[React]]></category>

		<guid isPermaLink="false">/?p=21754</guid>
		<description><![CDATA[こんにちは、編集長の白石です。 本記事は、2016年9月に開催されたTechFeed Live#2 「React vs Angular 2」の模様をお伝えする記事の後編です（前編はこちら）。 TechFeed Live#...]]></description>
				<content:encoded><![CDATA[<p><style>
b.speaker {</p>

<p>}
b.speaker::after {
  content: ":";
}
</style>
こんにちは、編集長の白石です。</p>

<p>本記事は、2016年9月に開催された<a href="https://techfeed.connpass.com/event/38582/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TechFeed Live#2 「React vs Angular 2」</a>の模様をお伝えする記事の<strong>後編</strong>です（前編は<a href="https://html5experts.jp/shumpei-shiraishi/21731/" data-wpel-link="internal">こちら</a>）。
TechFeed Live#2とは、「<a href="https://techfeed.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TechFeed</a>を地上に出現させる」ことをコンセプトとした、テクノロジーの最新トレンドをエンジニア向けに紹介するというイベントです（TechFeedとは、「最先端が、ここにある。」をキャッチコピーとしたエンジニア向け情報収集アプリです）。本イベントは、ReactとAngularをより楽しく深く学ぶため、現代のWebアプリに求められる各種要件についてそれぞれを比較する…というアプローチを取りました。
（私は本イベントの企画と対談のモデレーターを務めました）</p>

<p>読み応えバッチリ、勉強になること間違いなし。今回はライブ感を重視し、あえてイベントでの（砕けた）口調も可能な限り再現してみました。
では皆様、どうぞお楽しみください！</p>

<div id="attachment_21783" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2016/12/IMG_2396.jpg" alt="TechFeed Live#2の模様" width="640" height="480" class="size-full wp-image-21783" srcset="/wp-content/uploads/2016/12/IMG_2396.jpg 640w, /wp-content/uploads/2016/12/IMG_2396-300x225.jpg 300w, /wp-content/uploads/2016/12/IMG_2396-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">かなりの熱気でした</p></div>

<h3>トークバトル参加者（順不同、敬称略）</h3>

<p>（編集部注: 本記事では登壇者の皆様の希望により、以下ハンドルネームで呼称させていただきます）</p>

<h4>React Side</h4>

<ul>
<li><b>koba04</b> (<a href="http://twitter.com/koba04" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">小林 徹</a>)</li>
<li><b>yosuke_furukawa</b> (<a href="http://twitter.com/yosuke_furukawa" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">古川 陽介</a>) (Node.js 日本ユーザグループ代表)</li>
</ul>

<div id="attachment_21758" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2016/12/IMG_2365.jpg" alt="Reactサイド" width="640" height="480" class="size-full wp-image-21758" srcset="/wp-content/uploads/2016/12/IMG_2365.jpg 640w, /wp-content/uploads/2016/12/IMG_2365-300x225.jpg 300w, /wp-content/uploads/2016/12/IMG_2365-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Reactサイド。左がkoba04、右がyosuke_furukawa。</p></div>

<h4>Angular2 Side</h4>

<ul>
<li><b>laco</b> (<a href="http://twitter.com/laco0416" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">稲富 駿</a>) </li>
<li><b>83</b> (<a href="http://twitter.com/armorik83" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">奥野 賢太郎</a>) (ng-kyoto代表)</li>
</ul>

<div id="attachment_21759" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2016/12/IMG_2371.jpg" alt="Angular2サイド" width="640" height="480" class="size-full wp-image-21759" srcset="/wp-content/uploads/2016/12/IMG_2371.jpg 640w, /wp-content/uploads/2016/12/IMG_2371-300x225.jpg 300w, /wp-content/uploads/2016/12/IMG_2371-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Angular2サイド。左がlaco、右が83</p></div>

<h4>モデレーター</h4>

<ul>
<li><b>shumpei</b> (<a href="http://twitter.com/Shumpei" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">白石 俊平</a>) (HTML5 Experts.jp編集長)</li>
</ul>

<p>また今回、フレームワークを比較するための項目を以下のように洗い出してみました。基本的にこの流れに沿って進めたいと思いますが、脱線は大歓迎ですので、皆様ご自由にご発言いただいて構いません。（編集部注: 後半は「スタイリング」から）</p>

<ul>
<li><s>開発⾔語</s></li>
<li><s>アーキテクチャ</s></li>
<li><s>ビルドツール</s></li>
<li><s>ルーティング</s></li>
<li><s>テンプレート</s></li>
<li>スタイリング</li>
<li>コンポーネント以外の処理</li>
<li>ツールサポート</li>
<li>テスト</li>
<li>パフォーマンス</li>
<li>サーバサイドレンダリング</li>
</ul>

<h2>スタイリング</h2>

<p><b class="speaker shumpei">shumpei</b> 次はスタイリングについてお話いただきたいと思います。コンポーネントにスタイルを当てる云々の話、ですね。
では、Reactサイドから伺いましょうか。ReactのCSSサポートの現状といったところからお聞かせ願えるとありがたいです。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> CSS in JSとかそういったあたりの話ですね。CSSをJSの中にimportして、JavaScriptのオブジェクトかのように、コンポーネントにスタイルを当てることができる機能があります。
厳密なCSS in JSは、style属性に直接値をぶち込みます。そうすると、上からのCSSの影響を相当受けにくくできる。
そこまでいかなくても、CSS Modulesというのがあって、クラス名をuglify（難読化）してかぶらないようにして、中ではそのuglifyされたクラス名を使ってスタイリングを行い、外からの変更を受けにくくするというやり方もあります。</p>

<p>そういう感じで、CSSとJSを一体化して扱うということは、React界隈ではわりとやられています。</p>

<p><b class="speaker shumpei">shumpei</b> React本体はスタイリングとかに関する機能とかは持っていなくて、外のライブラリを使って実現するという感じなんですね。</p>

<p><b class="speaker koba04">koba04</b> はい、React本体としては、CSSは属性の一つ(style属性)なので、特別なサポートはそれほどありません。オブジェクトで値を指定できたり、幅や高さの単位を省略して指定できたりするくらいです。
あとはwebpackとかの外部のエコシステム上で、それぞれ好きにやっているという感じです。</p>

<p><b class="speaker shumpei">shumpei</b> では、Angular 2サイドはいかがでしょうか？</p>

<p><b class="speaker laco">laco</b> Angular 2は、<code>@Component</code>デコレータの中に<code>styles</code>という属性があって、そこに書いたスタイルはコンポーネントの中にしか効かないようになっています。Shadow DOMと同じ動きをするようにエミュレートされています。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> どうやってエミュレートするんですか？</p>

<p><b class="speaker laco">laco</b> えーと、BEMみたいなのを自動的に生成します。それでかぶらないようにする。まあ、CSSをインポートすることはしないですが、文字列で指定してるので結局インポートしてるのとあまり変わらないというか…あんまり変わらないですね(笑)やりたいことは(Reactと)一緒です。</p>

<p>だけど違うのは、<strong>設定を一つ変えるとネイティブのShadow DOMを使えるように変えられます</strong>。現在のデフォルトはエミュレーションになってますが、将来的にShadow DOMに対応したブラウザが増えた時に、さくっと変えられるようにはなっていますね。</p>

<p><b class="speaker koba04">koba04</b> この辺 (スタイリング) は結構、開発メンバーの中にデザイナーさんがいるのかとか、JSがメインの人ばかりでやるのかとかで、どうCSS書くのかが変わってくると思うので、選択肢がいろいろあったほうがいいんじゃないかな、とは個人的には思っています。</p>

<h2>副作用を伴う処理</h2>

<p><b class="speaker shumpei">shumpei</b> では次に行きましょう。APIコールなど、副作用を伴う処理をどう扱うかは、フレームワークごとにかなりアプローチが異なってくるところだと思いますが、そこら辺の事情を伺わせてください。</p>

<p><b class="speaker laco">laco</b> まずAPIコールでいくと、Angular 2だとHttpというライブラリがあって、それを使うという話になります。</p>

<p><b class="speaker koba04">koba04</b> 今「ライブラリ」という言葉が出ましたが、(APIコールをするのに)外部のライブラリを使うという話なんですか？</p>

<p><b class="speaker laco">laco</b> npm的には別パッケージになってるんですが、Angular 2の一部という扱いです。サブパッケージと言ってもいいです。</p>

<p><b class="speaker koba04">koba04</b> そこをフレームワークが直接サポートする必要って何かあるんですか？</p>

<p><b class="speaker laco">laco</b> (Httpライブラリ内で) DIをガリガリ使っているというのと、Angularはフルスタックなフレームワークなので、アプリケーションを作るのに必要なものはとりあえず揃えておくというポリシーですね。</p>

<p><b class="speaker 83">83</b> あと、Angular 2のHttpをDIで使っておくとテストが楽、モックのAPI Callを自分でガリガリ書いたりする手間が省けるというのが利点かなと思います。</p>

<p><b class="speaker shumpei">shumpei</b> ちなみに個人的には、Reduxをちょっと調べた時にミドルウェアでAPIコールをしているのが「難しいな」と思ってしまったんですが、ああいうのは慣れれば全然問題なくなるもんなんでしょうか。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> そこで難しいな、と思っちゃうのは<strong>まだReduxに慣れてない証拠</strong>です。</p>

<p><b class="speaker shumpei">shumpei</b> ほう。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> Reduxっていうのは基本的に副作用をどんどん外していってるんです。APIからGETして取ってきたデータをステートに反映するというのは、これは副作用そのものなんです。
で、<strong>こういう副作用をどこでやるかと言ったらミドルウェアでやる、というのがReduxの基本的な考え方</strong>なんです。
そこに慣れると、みんなミドルウェアで書くっていうのがなんとなくわかる。そこに慣れてない人は、Reduxをフレームワークだと思って使っちゃうんです。</p>

<p><b class="speaker shumpei">shumpei</b> なるほど、基本的な思想がちゃんと理解できていなかったんですね、ぼくが。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> あとReduxミドルウェアと言ってもいろいろあって、<a href="https://github.com/acdlite/redux-promise" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">redux-promise</a>だ、<a href="https://github.com/gaearon/redux-thunk" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">redux-thunk</a>だ、<a href="https://github.com/redux-observable/redux-observable" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">redux-observable</a>だ、<a href="https://github.com/yelouafi/redux-saga" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">redux-saga</a>だと、ぼくは<a href="https://github.com/redux-effects/redux-effects" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">redux-effects</a>っていうのを使ってるんですけど。
要は、副作用が必要なときに副作用を発生させる方法っていうのはたくさんあるし、非同期の処理の仕方一つ取ってもたくさんあるわけです。
ES6のジェネレーターでやるっていうのがredux-sagaだし、そうじゃなくてPromiseでいいんじゃないの、っていう人はredux-thunkだとかredux-promiseだとかを使う。</p>

<p>そうじゃなくてもうちょっと高次元なことをしたい、複数のイベントを包括的に扱ったりしたいという場合はObservableが必要になってくる、と。
それはどこまでデカい規模のものを作るかによってミドルウェアの選定をしなくてはならなくて、そこをツライと言ってしまうとちょっと(Reduxを使うのは) 厳しいかもしれません。</p>

<p>フレームワークなのかライブラリなのかという話でいくと、昔あったAngularJSのMVWhateverだったりなんだったりっていうものをReduxの何かで置き換えられるかというと、あんまりそんなことやってくれないんですよね。
結構薄いライブラリなので。フレームワークじゃないとぼくがずっと言っているのはそういうことです。</p>

<p>何かおまかせできるわけじゃなくて、自分たちでシンプルなAPIをたくさん作って、やってくれるのは状態の管理とイベントの管理だけ、というのがReduxの思想というか。
で、副作用を徹底的に省いてくれる。</p>

<p>でもみんな気になってるのは、その副作用をどうやってやるの、というところで、フレームワークを使いたいと思っている人にとってはそこにミスマッチがあるんじゃないかと思っています。</p>

<h2>テスティング</h2>

<p><b class="speaker shumpei">shumpei</b> では、テスティングについてはいかがでしょう？</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> コンポーネントのテスト書くか書かないか、って話があるんですが。書くか書かないかをまずはお聞きしたい。
書くとすると、こちらは<a href="https://github.com/airbnb/enzyme" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">enzyme</a>っていうツールを使ってます。</p>

<p><b class="speaker laco">laco</b> こっちは<a href="https://karma-runner.github.io/1.0/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Karma</a>っていうのを使います。KarmaはAngularチームが作っているテストフレームワークです。なので、KarmaがAngularと一番相性のいいテストフレームワークとして使ってますね。</p>

<p>あと、Angularがテスティング用のAPIを内包しているおかげで、コンポーネント単位でのテストができるようになってます。
たぶんenzymeとそんなに変わらないと思います。</p>

<p><b class="speaker koba04">koba04</b> そうですね、enzymeはいろいろラップしていて、DOMにマウントしたコンポーネントに対するテストとか、<code>renderToString()</code>で書き出したHTML文字列に対するテストとか、対象のComponentだけを浅くrenderする<code>ShallowRenderer</code>などを提供しています。</p>

<p>そういうのを提供するために、ReactはTestUtilsというアドオンを提供しています。最近だとTestRendererっていう、ツリー構造をただのJSONで返してくれて、それに対してテストするみたいなのもあります。なので、テストは書きやすいかな。
あと、Reactのコンポーネントって多くはただの関数で、状態を持たない。入力を与えたら、React Elementのオブジェクトが返ってくるというただの関数なので、テストも簡単に書けるという感じです。</p>

<p>Reduxとか使うと、そのただの関数の部分がReducerだったりと増えてくるので、より簡単に書けるとは思います。
あとShallowRendererだったらDOMにも依存しないので、JSDOMなどを使う必要ないし、NodeとかでMochaとかPower Assertとか使って簡単にすぐかけるというのはいいところかなあと思います。</p>

<p><b class="speaker laco">laco</b> 書くか書かないか問題で行くと、<strong>Angular 2の場合は書かないとまずい</strong>んですよね。テンプレートが間違ってた時に本番でぶっ壊れるので、テンプレートがコンパイル可能かというのを、コード生成可能なテンプレートになっているかというのをテストしないとまずくて。JSXの場合はコンパイルエラーになってくれるけど、Angular 2のテンプレートはただの文字列なので、実行するまでわからないというのがあって。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> ただ、そもそもビューのところって変更が一番多いところだと思うんです。そこってテスト書いちゃうと、ROI (投資対効果) 的にというか、コストがペイしないんじゃないかとぼくは思っていて。なので、基本は「書かない」がいいんじゃないかと思ってます。</p>

<p><b class="speaker laco">laco</b> コンポーネントの中のプロパティのテストとかですか？</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> そう、それとか…。</p>

<p><b class="speaker laco">laco</b> だったら、基本やんないですね、あんまり。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> lacoさんの言っているテストっていうのは、テンプレートがコンパイル可能かどうかの(最低限の)テストってことですか。</p>

<p><b class="speaker laco">laco</b> そう、それは全コンポーネント通しておかないと夜も眠れない(笑)。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> それは、たしかに(Reactは)JSXはコンパイル時にわかる。</p>

<p><b class="speaker laco">laco</b> それに、一口でコンポーネントっていいますが、そっちは関数ですが、こっちはステートを持つやつなんで、性質が全く違います。</p>

<p><b class="speaker shumpei">shumpei</b> AngularのほうはDIでテスタビリティを向上させている。一方でReactにはDIとかそういうのはないけど、Reactのコンポーネントはただの関数なことが多いからテストしやすいと。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> Reactのコンポーネントは基本的にステートを持たないから、そこ（DIとか）に関心がない。性質の違いですね。</p>

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

<p><b class="speaker shumpei">shumpei</b> 次はパフォーマンスです。これって議論になるのかな？</p>

<p><b class="speaker laco">laco</b> 今はもう、あんまり(どちらのフレームワークのパフォーマンスも)変わらないですよね。Angularのほうが初期ロードはちょっと遅いかもしれないけど、動き始めてからはあんまり変わらない。</p>

<p><b class="speaker 83">83</b> これ、AngularJSでアプリ作ってて、Angular 2でもアプリ作ってて、って経験から言うと、AngularJSだから遅い、ってAngularのせいにできたんですよね。「ここ遅いのなんで？」って言われた時にAngularJSのせいです、って言っちゃえるという甘えがあったんですけど。</p>

<p>最近Angular 2とReactほとんど差がないんで、自分の書いてるコードが酷い可能性のほうが高い。自分の書いたコードを疑えって言う。最近パフォーマンスというか、自分がどれだけ最適化されたコードを書けるかとか、遅かった時にどう測定してどこを最適化していくか、っていうところにかかってるんじゃないかなと思います。</p>

<p><b class="speaker laco">laco</b> (Reactは)たぶん、ミドルウェア書けば書くほど遅くなりますよね。Angularも、いろいろやればやるほど遅くなる。DOMの書き換えパフォーマンスはどちらも変わらないと思います。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> ただ、DOMの書き換え周りって、仮想DOMとか変更検知のアルゴリズムとかも関わってくる話ですよね。変更検知については、Angular1の頃は、自分でイベントループみたいの持っててそこでダーティチェックしてたけど、2はどうなってるんですか？</p>

<p><b class="speaker laco">laco</b> Zone(.js)の話になるんですけど…Zoneの話長いんで(笑)。
ざっくりいうと、<strong>windowをモンキーパッチ</strong>して、</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> モンキーパッチ！？(笑)</p>

<p><b class="speaker laco">laco</b> setTimeout()とかXHRとか非同期イベントが起きた後は必ずAngularのイベント呼ぶようになってる。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> マジかよ…<strong>めちゃEvilじゃないか…！</strong>(笑)</p>

<p><b class="speaker laco">laco</b> でもそれがTC39にZoneとして提案されていて、すでに（ステージ）0にもなってるんですよ(笑)。 (編集部注: ECMAScriptの仕様策定は、アイデアレベルの提案がステージ0に始まり、成熟するに従ってステージを登っていく）</p>

<p>だから…あれ、何の話だっけ。ああそうか、変更検知のイベントループの話だ。(Angular)1の頃はループガンガン回してたけど、それはもうないです。何も起きてないときは何も動かない。何かしらクリックしたとかがあったら、イベントが走って、windowからAngularにお知らせが来る、というふうになってるんです。</p>

<p><b class="speaker koba04">koba04</b> パフォーマンスっていう意味で言うと、Reactは基本やることが少ないし、やることが明確なので、チューニングはしやすいのかなあと思います。
<a href="https://www.npmjs.com/package/react-addons-perf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">react-addons-perf</a>とか使って計測して、パフォーマンスチューニングのポイントも<code>shouldComponentUpdate</code>を実装するか、renderの中をちょっと見直すとかなので。</p>

<p><b class="speaker laco">laco</b> しかし、仮想DOMは速かったけど、Angularも追いついちゃいましたね。<strong>しかも仮想DOMなしで</strong>。結局仮想DOMってどうだったのかなあ…と。「ポイント、そこじゃなくない？」っていう(笑)。 (筆者注: ここ、lacoさんがイベントを盛り上げるため煽ってくれてます)</p>

<p><b class="speaker koba04">koba04</b> まあ、仮想DOMだからこそ、ただの関数みたいな形でコンポーネントを簡単に作れるようになったので…。</p>

<p><b class="speaker laco">laco</b> でも、最近<a href="https://facebook.github.io/react/docs/pure-render-mixin.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Pure Component</a>って入ったじゃないですか。Shallow Rendererとか。
あれってどうなんですか？この間ものすごく疑問に思って。Pure Componentにすると、オブジェクトの状態を自動で見て、自動で変更検知してくれるってやつですよね。
<strong>あれって、Reactがやりたかったことなんですか？</strong></p>

<p><b class="speaker koba04">koba04</b> あれは、オブジェクトツリーがでかくなると仮想DOM比較のコストもバカにならないので、その比較すらも飛ばしたい時に使うっていう感じです。</p>

<p><b class="speaker laco">laco</b> 仮想DOMのアルゴリズムが敗北したってことじゃないですか？(笑)</p>

<p><b class="speaker shumpei">shumpei</b> 煽る煽る(笑)。</p>

<p><b class="speaker koba04">koba04</b> 基本的にはそこまで必要とするものでもなくて、よっぽどパフォーマンスが求められる場面で使われるものかなと思っています。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> ぼくとしては、パフォーマンスのチューニングポイントが増えたって話だと思ってます。<strong>仮想DOMの敗北については、次のサーバーサイドレンダリングでぼくが話をする</strong>んで、まあここはこれくらいでいいんじゃないかなと(笑)。</p>

<p><b class="audience">会場</b> (笑)</p>

<h2>サーバーサイドレンダリング</h2>

<p><b class="speaker shumpei">shumpei</b> じゃあ、サーバーサイドレンダリング(SSR)について、yosuke_furukawaさんどうぞ(笑)。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> そうですね、実際にSSRでもコンポーネントのツリー構造を作って、そのツリーに対してReact DOMのIDを割り振るっていうような「仮想DOMを構築する処理」が入るわけなんですが、それって<strong>普通のテンプレートエンジンだとまずやらない処理</strong>なんですよね。普通のテンプレートエンジンはHTML生成すればいいだけだから。効率化されているんです。</p>

<p>そこをReactのrenderToString()とかでやると、まあ、そこまで効率化されていない。
もしかしたらキャッシュとか持って、効率化する余地はあるのかもしれないんだけど、今のReactだとそこまで効率化されていないので、やっぱりテンプレートエンジンとしてのスピードを見るとそこまで速くないんです。
そこがちょっとね、どうしたもんかね、と。</p>

<p>ぼくが今やってるやつだと、1レンダリングするのに50ミリ秒とかかかっちゃって、しかも50msecかかった時に、<strong>Node.jsなんでイベントループが止まっちゃってる</strong>んですよね。だから由々しき問題、由々しき事態なんです。
だからそこは、非同期処理にしてイベントループを止めないようにするか、キャッシュですごい速くするか、そもそもDOMツリーを構築するところをなんとかするかと言ったことが必要なんですけど。</p>

<p><b class="speaker koba04">koba04</b> そういう意味では、Reactってサーバーサイドレンダリングできるんですけど、正直あれなんで入ってるのかぼくはよくわかってなくて(笑)。Facebook自身も使ってないですしね。
中のアルゴリズムを見ると、クライアントのDOMを作るときと同じコードを使っているので、それは当然文字列作るのと比べれば効率悪い。
そこはもしかしたら新しいアルゴリズムが入ることで効率化するのかもしれないけど、たしかに今だとパフォーマンスが問題になるのは明白な感じの実装にはなってます。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> Netflixとか、いろんな企業が実際にサーバサイドレンダリングはやってるんですけど、初期表示のレンダリングするところだけサーバサイドレンダリングして、
あとはスクロールするたびにちょっとずつクライアントサイドレンダリングしてたりする。<strong>それって地獄じゃねえのか</strong>、と(笑)。
そういうことが簡単にできるライブラリとかが別途あればいいんだけど、今のところまだないから、そういう意味だと、仮想DOMは敗北に近いかなと。サーバサイドレンダリングするなら。</p>

<p><b class="speaker shumpei">shumpei</b> Angular 2のサーバサイドレンダリング事情はどうですか？</p>

<p><b class="speaker laco">laco</b> Angularのサーバサイドレンダリングは…たぶんあんまり変わらないですよ。基本的に遅い。ただ何がいいかって、ルーティングとかHttpとか、Node上でも動くように全部パックされてるという、フルスタックならではの安心感はありますね。</p>

<p>ルーティングが済んだ状態のSSRも簡単にできるし、SSRするときに最初にAjaxが必要だったら、Node上で動く@angular/httpみたいな、ユニバーサルなやつが提供されている。それを使えば、変更検知された状態のSSRがちゃんと出ます。全部レールに乗ってるっていう、そこらへんの安心感はありますね。</p>

<h2>ライブラリか、フレームワークか</h2>

<p><b class="speaker shumpei">shumpei</b> はいでは、お時間も迫ってまいりましたので、そろそろ終わりにしたいと思います。</p>

<p><b class="speaker 83">83</b> あ、一ついいですか？<strong>ちょっとこのイベント自体に苦言を呈したくて。</strong></p>

<p><b class="audience">会場</b> (笑)</p>

<p><b class="speaker shumpei">shumpei</b> え、なんでしょう？</p>

<p><b class="speaker 83">83</b> ReactとAngularっていうのを比べるのって、みんな大好きですよね。でも、ほんとはこれって比較できるもんじゃないんですよ。型が一致しないものは比較できないんですよ。</p>

<p><b class="audience">会場</b> (笑)</p>

<p><b class="speaker 83">83</b> で、比較できないものを比較しているというのは、こういう項目を挙げてやっているっていうのは、フレームワークの相互プレゼンテーションみたいな感じで、Reactはこうですよ、Angular 2はこうですよ、という感じでやってるんですけど、ほんとにそれがみんな聞きたい話なのか？って思うんです。</p>

<p>私はlacoのほうからオファーを受けて呼んでもらったんですけど、こんだけすごいパネラーが揃ってて、順番にフレームワーク・ライブラリ紹介合戦みたいになってて。これじゃないでしょ、って思ってるんですよね。
もっと、フロントエンドのエンジニアとして、Web APIがどういうものがあって、いつ何を使うか、どう組み合わせるかっていうのがやっていくべきことなのに、何年かしたらすぐ廃れるようなライブラリの議論なんてのに、似非プロレスなんてのをやっていても、これは違うんじゃないかなあ、と思うんですよね。</p>

<p><b class="speaker shumpei">shumpei</b> すいません、、反省します。</p>

<p><b class="speaker 83">83</b> いえいえ、これ、言っとかないと終わってしまうな、と。すいません。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> いえいえ…最高です(笑)。</p>

<p><strong><a href="https://html5experts.jp/shumpei-shiraishi/21754/" data-wpel-link="internal">前編もあります</a></strong></p>
]]></content:encoded>
			</item>
		<item>
		<title>React vs Angular 2ガチ対決！エキスパートたちによるハイレベル対談 (1 / 2) ー TechFeed Live#2レポート</title>
		<link>/shumpei-shiraishi/21731/</link>
		<pubDate>Tue, 13 Dec 2016 01:39:21 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[Angular 2]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[React]]></category>

		<guid isPermaLink="false">/?p=21731</guid>
		<description><![CDATA[こんにちは、編集長の白石です。 本記事は、2016年9月に開催されたTechFeed Live#2 「React vs Angular 2」の模様をお伝えする記事の前編です（後編はこちら）。 TechFeed Live#...]]></description>
				<content:encoded><![CDATA[<p><style>
b.speaker {</p>

<p>}
b.speaker::after {
  content: ":";
}
</style></p>

<p>こんにちは、編集長の白石です。</p>

<p>本記事は、2016年9月に開催された<a href="https://techfeed.connpass.com/event/38582/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TechFeed Live#2 「React vs Angular 2」</a>の模様をお伝えする記事の<strong>前編</strong>です（後編は<a href="https://html5experts.jp/shumpei-shiraishi/21754/" data-wpel-link="internal">こちら</a>）。
TechFeed Live#2とは、「<a href="https://techfeed.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TechFeed</a>を地上に出現させる」ことをコンセプトとした、テクノロジーの最新トレンドをエンジニア向けに紹介するというイベントです（TechFeedとは、「最先端が、ここにある。」をキャッチコピーとしたエンジニア向け情報収集アプリです）。本イベントは、ReactとAngularをより楽しく深く学ぶため、現代のWebアプリに求められる各種要件についてそれぞれを比較する…というアプローチを取りました。
（私は本イベントの企画と対談のモデレーターを務めました）</p>

<p>読み応えバッチリ、勉強になること間違いなし。今回はライブ感を重視し、あえてイベントでの（砕けた）口調も可能な限り再現してみました。
では皆様、どうぞお楽しみください！</p>

<div id="attachment_21762" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2016/12/IMG_2373.jpg" alt="TechFeed Live#2の模様" width="640" height="480" class="size-full wp-image-21762" srcset="/wp-content/uploads/2016/12/IMG_2373.jpg 640w, /wp-content/uploads/2016/12/IMG_2373-300x225.jpg 300w, /wp-content/uploads/2016/12/IMG_2373-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">当日のイベントは大盛り上がりでした。</p></div>

<h2>React vs Angular 2対決開始！</h2>

<p><b class="speaker shumpei">shumpei</b> 本日は、多くのお客様にご参加いただいて、大変うれしく思います。
今回のTechFeed Liveは、「React vs Angular 2」と題しまして、今をときめくコンポーネント指向のWebアプリケーション・フレームワーク2つを比較して学べる会を目指しています。</p>

<p>そのために、それぞれのフレームワークのエキスパートの方々にお集まりいただきました。</p>

<h3>トークバトル参加者（順不同、敬称略）</h3>

<p>（編集部注: 本記事では登壇者の皆様の希望により、以下ハンドルネームで呼称させていただきます）</p>

<h4>React Side</h4>

<ul>
<li><b>koba04</b> (<a href="http://twitter.com/koba04" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">小林 徹</a>)</li>
<li><b>yosuke_furukawa</b> (<a href="http://twitter.com/yosuke_furukawa" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">古川 陽介</a>) (Node.js 日本ユーザグループ代表)</li>
</ul>

<div id="attachment_21758" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2016/12/IMG_2365.jpg" alt="Reactサイド" width="640" height="480" class="size-full wp-image-21758" srcset="/wp-content/uploads/2016/12/IMG_2365.jpg 640w, /wp-content/uploads/2016/12/IMG_2365-300x225.jpg 300w, /wp-content/uploads/2016/12/IMG_2365-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Reactサイド。左がkoba04、右がyosuke_furukawa。</p></div>

<h4>Angular2 Side</h4>

<ul>
<li><b>laco</b> (<a href="http://twitter.com/laco0416" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">稲富 駿</a>) </li>
<li><b>83</b> (<a href="http://twitter.com/armorik83" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">奥野 賢太郎</a>) (ng-kyoto代表)</li>
</ul>

<div id="attachment_21759" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2016/12/IMG_2371.jpg" alt="Angular2サイド" width="640" height="480" class="size-full wp-image-21759" srcset="/wp-content/uploads/2016/12/IMG_2371.jpg 640w, /wp-content/uploads/2016/12/IMG_2371-300x225.jpg 300w, /wp-content/uploads/2016/12/IMG_2371-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Angular2サイド。左がlaco、右が83</p></div>

<h4>モデレーター</h4>

<ul>
<li><b>shumpei</b> (<a href="http://twitter.com/Shumpei" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">白石 俊平</a>) (HTML5 Experts.jp編集長)</li>
</ul>

<p>また今回、フレームワークを比較するための項目を以下のように洗い出してみました。基本的にこの流れに沿って進めたいと思いますが、脱線は大歓迎ですので、皆さんご自由にご発言いただいて構いません。（編集部注: 前半は「テンプレート」まで）</p>

<ul>
<li>開発⾔語</li>
<li>アーキテクチャ</li>
<li>ビルドツール</li>
<li>ルーティング</li>
<li>テンプレート</li>
<li>スタイリング</li>
<li>コンポーネント以外の処理</li>
<li>ツールサポート</li>
<li>テスト</li>
<li>パフォーマンス</li>
<li>サーバサイドレンダリング</li>
</ul>

<p>では早速始めましょう！</p>

<h2>開発言語</h2>

<p><b class="speaker shumpei">shumpei</b> まずは開発言語について語っていただければと思います。Reactから聞いてみたいと思いますが、Reactを使った開発は基本的にどんな言語を使うのでしょうか？</p>

<p><b class="speaker koba04">koba04</b> 基本的にはBabelを使って、ES6以降のコードをES5に変換しつつ開発しますね。でも、TypeScriptを使う人もいます。<strong>Babelの作者はFacebookにいたりする</strong>ので、基本的にはBabelだと楽ですね。</p>

<p><b class="speaker shumpei">shumpei</b> なるほど。Angular 2のほうはいかがですか？</p>

<p><b class="speaker laco">laco</b> 基本的には開発言語はJS, TypeScript, あとDartがあります。</p>

<p><b class="audience">会場</b> (笑)</p>

<p><b class="speaker laco">laco</b> いや、Dartは笑いどころじゃないでしょう(笑)。
公式に推奨されているのはTypeScriptです。ES6書いてBabelでもいいし、ES5でも書けることは書けますが、結構キツイんで、基本的にはTypeScriptで書くのがデファクトになってます。</p>

<p><b class="speaker 83">83</b> ちょっと待って下さい。結局なんの言語で書きますか、というのが重要で。Reactだったらどの言語、Angularだったらどの言語、っていう <strong>質問がおかしい</strong> 。</p>

<p><b class="speaker shumpei">shumpei</b> そうですか…すいません。</p>

<p><b class="speaker 83">83</b> 大きいものだったらTypeScriptのほうがいいし、小さいものだったらAngular 2でもES6とBabelのほうがサクサク作れます。Angular 2はTypeScript専用だよね、ということはよく言われますがそれは違うと思います。</p>

<p><b class="speaker shumpei">shumpei</b> ちなみに、BabelでAngular 2を書くというのは全然ありなんでしょうか？</p>

<p><b class="speaker laco">laco</b> 全然ありですよ。そのためのプラグインも、 <a href="https://github.com/shuhei/babel-angular2-app" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Shuhei Kagawaさんという方が作ってます</a> 。Flowの記法とか使って、型があるように書けます。</p>

<p>あ、一つReactサイドに聞きたかったんですが、JSXってみんながみんな使うもんなんでしょうか？</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> そうだと思います。ぼくもJSXなしでやってみようと思ったこともあるんですけど… <strong>結論としては、(JSXが) ないとダメだなと (笑)。</strong> 結局HTMLっぽく書きたくなるんですよ。</p>

<p>ちなみにさっきの言語の話を少し深掘りしたいんですけど、言語は規模で決まるというのは確かにそのとおりだと思うんですが、一方でエコシステムとかを見ると、BabelをES6じゃない言語で書いてエクスポートしてる例ってあんまりないんですよね。</p>

<p>例えばTypeScriptでライブラリ書いてエクスポートしてるなんてあんまりない。なので、エコシステム全体としては、どっちの言語がより慣れているかという度合いはあるのかなと。そういう意味では、ReactはBabelでAngular 2はTypeScript、というのはあるんじゃないかと思います。</p>

<p><b class="speaker 83">83</b> そうですね、そういう意味で言うと、(Angular 2も)公式サイトのチュートリアルとかも全部TypeScriptで書かれていたりするので、そういう住み分けとかは色がはっきりしているかなと思います。
ちなみにReact陣営に聞きたいんですけど、TypeScriptは「GoogleがMicrosoftと手を組んだ」なんてよく言われてますが、(React開発元のFacebookが開発している) Flowってどうなんですか？</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> 実際、React自身はあんまりFlowでっていう話はないです。(Reactコンポーネントの) propTypesを、Flowで書けるようにしよう、って話は進んでるみたいですが。</p>

<p>「propTypesで型チェックをしていく」というのがあんまり綺麗じゃないというか、書き方として洗練されている気がしない。なのであれをFlow側に寄せていこうという活動はあるみたいです。</p>

<p><b class="speaker koba04">koba04</b> FacebookがFlowを強制してくるってことは全然ないですね。propTypeを置き換えるときも、FlowかTypeScriptか、好きなのを使えばいいという感じです。
そこは、フレームワークが特定の型システムに依存する必要はないので、好きに使っていけばという感じです。</p>

<p><b class="speaker shumpei">shumpei</b> ちなみに、ご存じない方もいらっしゃるかもしれないので、<strong>Flowってなんでしょうか？</strong></p>

<p><b class="speaker koba04">koba04</b> Flowは、静的な型チェックをするためのライブラリです。まあ、思想としてはもっと踏み込んでいて、JavaScriptでハマりがちなコードとかを静的解析して、静的な型付け以外のチェックをやっていこうと。</p>

<p>そういう意味では、ESLintとかもカブる部分がありますね。例えばnullチェックをしているかどうかとかも確認できたりとか。静的型付け以上に、JavaScriptでハマりがちなエラーをチェックするためのツールという面が大きいかなと思います。</p>

<p><b class="speaker shumpei">shumpei</b> コードそのものは、JavaScriptで書くということですね。</p>

<h2>アーキテクチャ</h2>

<p><b class="speaker shumpei">shumpei</b> 次の話題はアーキテクチャについてですが、アーキテクチャというとぼんやりしてますね…。これぼくなんでこのお題を出したんだっけな。えーと…、あ、思い出した。Fluxとかの話をしようと思ったんだった。FluxやReduxなど、アーキテクチャに関してちょっとご説明をお願いしてもいいですか？</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> 基本的にReactだけだと、イベントや状態を管理する仕組みがないんです。ReactってViewのライブラリなので。Webアプリって、APIサーバを叩いてデータをもらってきてそれをレンダリングするとか、そういうのが普通ですよね。そういうことをしようと思ったら、Reactだけじゃ厳しいんです。そういう時に、イベントを管理する仕組み、あと状態を管理する仕組みっていうのが必要になってくる。そういう時に必要になってくるのがFluxであったり、Reduxであったりというライブラリです。</p>

<p>Fluxはライブラリというよりは「思想」というか、デザインパターンに近いですね。イベントを管理するための、Observerパターンを言い換えたというか。あれねえ、何がすごいかって、名前を付けたのがすごいですよね。カッコいいですよね。<strong>名前の勝利</strong>です(笑)</p>

<p>そういう (Fluxという) 考え方が浸透してきたところにReduxっていうのが出てきて、今一番流行っているライブラリです。</p>

<p>ただひとつ間違えちゃいけないのは、ReactとFlux、ReactとReduxを組み合わせたからといって、Angularほどの「フレームワーク」といえるかというとそこまでいってない。
ただライブラリを組み合わせただけのものでしかなくて。<strong>さらに、その上で自分のレールを作っていく必要があるんじゃないかなとは思います。</strong></p>

<p><b class="speaker shumpei">shumpei</b> なるほど、ReactはReactだけで完結しないと。一方Angular 2のほうは「One Framework」だそうですね。</p>

<p><b class="speaker 83">83</b> Angular 2の話をする前に、AngularJS(AngularJS 1)のほうに一旦戻ろうかなと思うんですが。そもそも1のころは、エコシステムが「Angular World」だったと。</p>

<p>まだ今あるようなES6のモジュールとかがなかった時に、それでもモジュールの仕組みが欲しいとか、そういう要望があったと。なので、<code>angular.module()</code>の中に書いていくというのがあったんですね。</p>

<p>で、それがあったからAngularはエコシステムに乗っていない、一方でReactは乗っているというような分断が起きはじめました。
それ自体は2年前くらいは正しかったのですが、そのイメージをAngular 2になっても引きずっている方がまだおられるんじゃないかというのが気になっています。</p>

<p><b class="speaker 83">83</b> 私はAngular 2を「フレームワーク」と言われることは好きじゃなくて、<strong>Angular 2は「ライブラリ」だと思っている</strong>んですよね。なんでかっていうと、Angular 2にデータを保存しておくものだったり、データのやり取りをするためのものっていうのが、別にAngular 2にはないんです。</p>

<p>Angular 2の特徴ってテンプレートとDIとかあると思うんですけど、実際にはAngular 2だけで全て事足りるかというとそうでもないし、そこは結構割り切ってAngular 2は好きなフレームワークと組み合わせられるようにもなっている。</p>

<p>その上で、Angular 2をどうやって使うかというと、RxJSがよく出てくると思います。RxJSはストリームやイベントを扱うためのライブラリで、FluxのObservableパターンと同じく、何か変化があるまでは動かない。
何か変化がemitされたときにsubscribeしてる側で値を書き換える。それでテンプレートの描画が変わると。そういう意味では、今時代の変化が、Observableパターンに来てるんじゃないかなと思います。</p>

<p><b class="speaker shumpei">shumpei</b> ちなみにこれ、ご存知だったらでいいんですけど、Angular 2とReduxを組み合わせてみた、みたいな話もあるんですけど、そうしたことをする利点とかってなんなのでしょうか？</p>

<p><b class="speaker 83">83</b> 私は実際それをやってみて、別のイベントで発表したこともあるのですが、ぶっちゃけそのときは相当disりまして(笑)。
Reduxをdisったわけじゃないんです。Angular 2とReduxという組み合わせをdisったんです。Reduxは中立なライブラリとは謳われているのですが、実際にはReactを前提として作られたライブラリなので、まあそうなるわな、という感じでした。</p>

<p><strong>Angular 2とReduxの組み合わせがなぜいけてないかというと、DIとの相性が悪い</strong>んです。
ReactにはDIという考え方が全くないし、ReduxもDIを全く無視している設計になっている。</p>

<p>なので、Angular 2はDIできるのに、Reduxと組み合わせると、ReduxのReducerの中では一切DIできない。
何のためにDIができるAngular 2の中でReduxを使うのか。そこだけ別世界に飛ばされるような感じでした。</p>

<p><b class="speaker laco">laco</b> ざっくり言うとReduxにしてもFluxにしても、シングルトンなステートがあって、ステートの変更を検知してコンポーネントがデータを受け取って、コンポーネントがデータを書き換えて…っていうのをくるくるやるわけじゃないですか。</p>

<p>で、シングルトンってAngular 2だとDIで実現するんですよ。なので、Reduxいらないんですよね。仕組み、レールがすでにあって、あとはステートを持つやつを書くだけで、あとはDIでどうとでもなる。
だから、Angular 2は結局、DIでどうとでもなります。</p>

<p><b class="speaker shumpei">shumpei</b> Reduxと組み合わせたみたいな記事をたまに見かけるんですが、それはAngular 2に足りないものがあって、Reduxがそれを補うのかなとかって勝手に想像していたんですが、別にそんなことないよ、って感じでしょうか。</p>

<p><b class="speaker laco">laco</b> たぶん<strong>バズワード組み合わせただけ</strong>じゃないかな、と(笑)</p>

<p><b class="speaker shumpei">shumpei</b> なるほど(笑)。ちなみに例えば、ReactとRxJSを組み合わせる、みたいなバズワードの組み合わせ方とかはないんでしょうか。</p>

<p><b class="speaker koba04">koba04</b> もちろんそこは自由にできて、ReduxとRxJSを組み合わせるための<a href="https://github.com/redux-observable/redux-observable" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">redux-observable</a>というのをRxJSの作者が作ってたりします。RxJSを使いたい場合はそういう選択肢もある。</p>

<p>ただ、APIからデータ取ってくるだけだったら<code>Observable</code> (RxJS) 使う必要もなくて<code>EventEmitter</code>で事足りるかもしれないし、そこは自由に選んでくださいという感じですね。</p>

<h2>ビルドツール</h2>

<p><b class="speaker shumpei">shumpei</b> 次はビルドツールですね。ここは意見を戦わせるところでもなくて、ただ紹介するだけでいいのかなとも思いますが、暴走や脱線は大歓迎です。
まずReactでは、ビルドツールには主に何を使いますか？</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> 主にwebpackやBrowserifyですね。エコシステム全体がBrowserifyやwebpackを前提として作られたりしますので、それを使うのが普通です。コンポーネント志向なんで、コンポーネントを作ってexport/importするのが当たり前の世界になってます。</p>

<p><b class="speaker shumpei">shumpei</b> Angular 2サイドはいかがですか？</p>

<p><b class="speaker laco">laco</b> ここは何も変わらないですね。webpack使えますし、バンドル (編集部注: 複数のJavaScriptモジュールを1ファイルにまとめること) しないとブラウザでは使えないし。
そういえば、最近npmリポジトリから落ちてくる（npm installでインストールされる）のが、ESモジュールになったんですよ。(requireではなく) import / exportがそのまま書かれている。
なので、webpack2やRollupを使うとTree shaking (編集部注: 不要なコードを「振り落とし」、バンドルサイズを小さくすること) できるというのはありますね。</p>

<p><b class="speaker shumpei">shumpei</b> <a href="https://github.com/systemjs/systemjs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SystemJS</a>っていうツールの存在も聞きますが。</p>

<p><b class="speaker laco">laco</b> (笑)</p>

<p><b class="speaker shumpei">shumpei</b> 笑っちゃうんですかw</p>

<p><b class="speaker laco">laco</b> ごめんなさい、ちょっと失笑です。あれはまだちょっと人類には早いって思ってます(笑)。</p>

<p><b class="audience">会場</b> (笑)</p>

<p><b class="speaker shumpei">shumpei</b> どこらへんが人類には早いんでしょう？</p>

<p><b class="speaker laco">laco</b> あれは世界がHTTP/2になるのを待って、出直してきてほしいツールです。importごとにリクエスト飛んだら、(HTTP/1だと)遅すぎて話にならないです。残念ながら。</p>

<p><b class="speaker shumpei">shumpei</b> 1ファイルにバンドルする機能とかはないんでしょうか？</p>

<p><b class="speaker laco">laco</b> ありますけど、それならwebpackのほうがエコシステムが育っているので、そちらでいいんじゃないかな。プラグインとか、Loaderとか。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> SystemJS待つくらいなら、ES Loader待ったほうがいい(笑)。</p>

<p><b class="speaker shumpei">shumpei</b> <a href="http://jspm.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">JSPM</a>っていうのがあるみたいですが…、JavaScript Package Managerでしたっけ。</p>

<p><b class="speaker laco">laco</b> あー。あれ、いつまで存在してるんですか？</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> その質問誰に聞いてるんですか(笑)。</p>

<p><b class="speaker shumpei">shumpei</b> なるほど、その程度の扱いということで(笑)。では、SystemJSは人類には早すぎるということで、Angular 2やってる方もwebpackやBrowserifyがいいんじゃないかなということですね。</p>

<p><b class="speaker laco">laco</b> Plunkerみたいなオンラインエディタ上でやるぶんには、SystemJS割と便利なんですけどね。ブラウザ上ではバンドルできないので。ただ、プロダクションでは使う用途ないですよね。</p>

<h2>ルーティング</h2>

<p><b class="speaker shumpei">shumpei</b> では次は、細かい話が混じって申し訳ないですが、ルーティングとかに関して言いたいことがあればお聞きしたいのですが。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> これは…<strong>Angularサイド圧勝</strong>じゃないですか？</p>

<p><b class="speaker shumpei">shumpei</b> そうなんですか？</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> React完敗ですね。</p>

<p><b class="speaker laco">laco</b> ほんとか？？(笑)</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> そもそもルーティングって、React本体には機能がないんです。で、デファクトスタンダード的に使われている<a href="https://github.com/ReactTraining/react-router" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">React Router</a>っていうのがあるんですが、これみんなdisってる(笑) 。
とりあえず使ってみて、「これクソ使えねえな」みたいな話になるんですけど(笑)。</p>

<p>何が使えないかって言うと、ルーティングの時に最初にやってほしいことって「アクションを発火してほしい」んです。
APIを呼び出してデータを取ってくる、ということをしたいとみんな思うと思うんですが、そういうことをやってくれるような感じになってなくて、まず最初にコンポーネントをマウントしちゃうんです。コンポーネント指向なんで。</p>

<p>でも普通みんながやりたいのって、アクションだと思うんですが、それを書くための記法は今のところない。
なのでしょうがないから、真っ白なコンポーネント出してそこでイベント発火させて(データを)取りに行く…みたいなことをみんなやってるんじゃないかな。あんまりよくないです。</p>

<p>なので、ぼくの頭のなかではReact Routerは決定版にはなっていない。決定版になってないがゆえに、デファクトスタンダードとはさっき言ったけど、みんな野良ルーターみたいの作っちゃって、結果今あんまりよくない状態になっている。
…というところが「<strong>圧敗</strong>」ですね(笑)。</p>

<p><b class="speaker shumpei">shumpei</b> 圧敗(笑) では、圧勝側のご意見も聞きたいです。Angularサイドはいかがですか？</p>

<p><b class="speaker laco">laco</b> 今の話をすると、Angular 2もパスとコンポーネントを結びつけるものだという考え方は変わらないです。
ただ、コンポーネントがマウントされるときに呼び出されるフックポイントがあって、そこでリクエストを飛ばして、その結果を持ってマウントができるという仕組みがある。
あと、「ルーティングしてもよいかどうか」というcanActivateみたいな仕組みもあって、出ていくときの仕組みもあって。
そうしたイベントが全部RxJSに乗っていて、ルーティングが起きるときにはまずイベントが発火するので、使いやすくはなっています。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> そういう意味でいくと一応onEnterみたいなのはあるんだけど、そこでデータを拾いに行くのは、推奨しないってことになってまして…(笑)。</p>

<p><b class="speaker laco">laco</b> <strong>今のAngular 2のルーターはとてもよくできているので、今のところは言うことない、っていうくらいの完成度になりました</strong>。</p>

<p><b class="speaker koba04">koba04</b> ぼくは個人的にルーティングにこだわりはないんですが、基本的にはここもライブラリに依存しなくてもいいんじゃないかな、とはずっと思っています。汎用的ないいルーターが出てこないのかな、とは思ってるんですが、あんまり出てこないですね。</p>

<p><b class="speaker laco">laco</b> 確かに。イベントだけ発火してくれればそれでいいですからね。</p>

<p><b class="speaker koba04">koba04</b> そう。ライブラリと関連しているところではないので。誰か作るチャンスだと思います。</p>

<p><b class="speaker shumpei">shumpei</b> ReactやAngularに関係ないルーティングのライブラリがあればいいのに、ということですね。</p>

<h2>テンプレート</h2>

<p><b class="speaker shumpei">shumpei</b> 前半最後のトピックになりそうですが、次は「テンプレート」です。これ盛り上がるのかな…お互いの記法がキモい、とかってdisりあっていただいてもかまわないんです(笑)。</p>

<p><b class="speaker 83">83</b> <strong>JSXもキモい、Angular 2テンプレートもキモい、気に入ったキモいほう使え</strong>、って感じですね(笑)。</p>

<p><b class="speaker laco">laco</b> でもまあ、Angular 2のテンプレートはギリギリHTMLなので、既存のHTMLツールチェインには乗れるわけです。ちなみにJSXってファイル分けられるんですか？「.jsx」みたいなファイルあるんですか？</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> 一応あります。Angular 2は分けられるんですか？</p>

<p><b class="speaker 83">83</b> テンプレートの文字列を直接ソースコード中に書くのも、URLで外部ファイルを指定するのも、どちらも可能です。URLを指定した場合はAjaxで取ってきます。</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> そこの通信（コスト）はいいんだ？</p>

<p><b class="speaker laco">laco</b> それはwebpackのプラグインで、URLをrequire()に変換してくれるやつがある（<a href="https://github.com/TheLarkInn/angular2-template-loader" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">angular2-template-loader</a>）ので、ありがたく使わせてもらってます。
あとひとつ気になるのは、<strong>JSXってXSSのサニタイズとかやってくれるんですか？</strong></p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> …えっとですね。…<strong>Angularの圧勝です。</strong></p>

<p><b class="audience">会場</b> (笑)</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> 普通にpタグやdivタグの中に入れる文字列はサニタイズしてくれるんだけど、例えばaタグのhref属性とかに対しては、別に何もしてくれません。なので、(属性値に)<code>javascript:〜</code>とかやろうと思えばできちゃう。</p>

<p><b class="speaker laco">laco</b> <code>innerHTML</code>ぶち込みとかも？</p>

<p><b class="speaker yosuke_furukawa">yosuke_furukawa</b> そうです。だから、<code>innerHTML</code>使うときとか、URLをセットする場合とかは、注意しなくちゃいけない。 (URLから)<code>javascript:</code>を省いてやる必要とか、XSS対策についてはケアが必要です。</p>

<p><b class="speaker shumpei">shumpei</b> React本体でそこら辺を対応しようという動きはないんですか？</p>

<p><b class="speaker koba04">koba04</b> JSXって結局ただのオブジェクトに展開されるんですけど、<code>Symbol</code>とかを使って、外から知らないタグを差し込まれたりはしないようになってます。なので、渡された文字列をそのままReact Elementsとして展開するということは出来ないようになっていますけどね。</p>

<p><b class="speaker laco">laco</b> あ、あともう一つ。Web Components対応ってどうなってるんですか？</p>

<p><b class="speaker koba04">koba04</b> 一応Custom Elementは書けるようになっています。あとは、DOMComponentに不正な属性を渡すと警告が出るようになっていて、それはCustom Elementをサポートするための布石です。なので、この後何らかの対応が入ってくるとは思います。</p>

<p><b class="speaker shumpei">shumpei</b> そろそろお時間ですので、これで前半を終わりにしたいと思います。後半も、引き続きよろしくお願いします。</p>

<p><strong><a href="https://html5experts.jp/shumpei-shiraishi/21754/" data-wpel-link="internal">後編に続きます</a></strong></p>
]]></content:encoded>
			</item>
	</channel>
</rss>
