<?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.js &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/react-js/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>ニュースタブ新設で月間アクティブユーザー数が5900万人を突破した「LINE NEWS」の開発技術と体制を聞いてきた！</title>
		<link>/miyuki-baba/24053/</link>
		<pubDate>Fri, 22 Sep 2017 01:00:29 +0000</pubDate>
		<dc:creator><![CDATA[馬場 美由紀]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[Assault]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[LINE]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[React.js]]></category>

		<guid isPermaLink="false">/?p=24053</guid>
		<description><![CDATA[2017年2月に新設されたニュースタブによって、ユーザー層をより広く拡大し、2017年3月時点で月間アクティブユーザー数5900万人を突破した「LINE NEWS」。そのニュースタブは、WebViewで実装されているのを...]]></description>
				<content:encoded><![CDATA[<p>2017年2月に新設されたニュースタブによって、ユーザー層をより広く拡大し、2017年3月時点で月間アクティブユーザー数5900万人を突破した「LINE NEWS」。そのニュースタブは、WebViewで実装されているのをご存じでしたか？</p>

<p>LINEのニュースタブをReact.jsで開発しているフロントエンド、JavaとPerlで開発しているサーバーサイドのエンジニアの方々に、どんな開発技術や体制で開発しているのか、HTML5 Experts.jp白石俊平編集長が直撃インタビューしてきました！</p>

<h4>今回お話を聞いた「LINE NEWS」開発チームの皆さん</h4>

<p><img src="/wp-content/uploads/2017/09/maezawa.jpg" alt="" width="90" height="90" class="alignnone size-full wp-image-24089" /><br><span style="font-size: 90%;"><strong>LINE株式会社 前澤 春樹さん</strong><br>Javaのサーバーサイド担当。200以上の媒体社様向け管理画面のコンテンツ入稿システム開発や、公式アカウントから発信されるメッセージ配信システムが主な担当。</span></p>

<p><img src="/wp-content/uploads/2017/09/morifuji.jpg" alt="" width="90" height="90" class="alignnone size-full wp-image-24092" /><br><span style="font-size: 90%;"><strong>LINE株式会社 森藤 賢司さん</strong><br>Perlで作られている一般ユーザーから見えるニュースタブ、記事ページのバックエンドや社内向けの管理画面を担当。</span></p>

<p><img src="/wp-content/uploads/2017/09/otsuki.jpg" alt="" width="90" height="90" class="alignnone size-full wp-image-24095" /><br><span style="font-size: 90%;"><strong>LINE株式会社 大槻 友諒さん</strong><br>フロントエンドエンジニア。WebViewでつくられているニュースタブの実装を担当している。React.jsなどの最新技術に触れることも多い。</span></p>

<p><img src="/wp-content/uploads/2017/09/tomita.jpg" alt="" width="90" height="90" class="alignnone size-full wp-image-24097" /><br><span style="font-size: 90%;"><strong>LINE株式会社 富田 梓さん</strong><br>マークアップエンジニア。デザイナーの作成したPSDをもとにしたCSSの設計と実装を行う。ニュースタブの他、PC/SPのWeb、キャンペーンページなどニュース関連全般を担当。</span></p>

<h2>なぜ、ニュースタブはWebViewなの？</h2>

<p><strong>白石</strong>：今日は主にニュースタブにフォーカスしてお話を聞いていきますね。LINEのニュースタブは、なぜWebViewを使ったのでしょうか。</p>

<p><strong>大槻</strong>：もともと記事ページはWebViewで作っていました。ニュースタブを作ろうという話になったときに、記事ページと同じ技術で作るほうが開発スピードも早いし、やりやすい。バージョンアップなども、そろえたほうがリリースしやすいということでWebViewで作ることになりました。</p>

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

<p><strong>白石</strong>：じゃあ、ニュースタブ以外はネイティブでできているんですね。</p>

<p><strong>大槻</strong>：そうです。トークやタイムラインなど、メインの機能はネイティブで実装されています。並んでるタブの中だと、ニュースタブだけがWebViewです。</p>

<p><strong>白石</strong>：WebViewとネイティブといった複数の技術を混ぜるのって、大変だったんじゃないでしょうか。</p>

<p><strong>大槻</strong>：ネイティブとWebView間でデータやイベントをやり取りする必要があって、そのための仕組みをアプリエンジニアと協力して実現しました。ユーザーにはLINEアプリの一部として見えるので、挙動やパフォーマンスに違和感が出ないようにするのが大変でした。</p>

<p><img src="/wp-content/uploads/2017/09/714103152f1f91a24b71227d63f2b089.jpg" alt="" width="640" height="421" class="alignnone size-full wp-image-24137" srcset="/wp-content/uploads/2017/09/714103152f1f91a24b71227d63f2b089.jpg 640w, /wp-content/uploads/2017/09/714103152f1f91a24b71227d63f2b089-300x197.jpg 300w, /wp-content/uploads/2017/09/714103152f1f91a24b71227d63f2b089-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>白石</strong>：WebViewだと、読み込みや表示が遅かったりしません？</p>

<p><strong>大槻</strong>：いえ、結果的にそこまで遅いということはなかったです。Webだからの限界はありましたけど、WebViewだから特別つらいことはありませんでした。</p>

<p>LINEバイトやLINEギフトといったファミリーアプリにはすでにWebViewの技術が使われていて、知見があったことも役立ったんだと思います。</p>

<p><strong>白石</strong>：React.jsを使っているとのことですが、SPA的な開発だとマークアップはそんなに必要じゃないと思うんですが、両方必要なのはどうしてなんでしょう。</p>

<p><strong>富田</strong>：うちは分業体制をとっていて、僕と大槻さんが所属しているチームはフロントエンドを担当しています。案件によってJSとマークアップの両方を一人が担当することもありますが、newsでは規模の大きさもあって担当が分かれています。</p>

<p>デザインからHTMLを起こして、それを渡しているので、一般的に言われているReactを使うイメージとはちょっと違うかもしれません。</p>

<p><strong>大槻</strong>：セマンティックなHTMLを書くとか、CSSを設計するといったところは完全にお任せしてします。一回組んだものを、パーツとして分解してJSXに落とし込んでいます。</p>

<p><strong>白石</strong>：PCでも記事ページそのものは見られるんでしたっけ？</p>

<p><strong>富田</strong>：記事ページは見られます。</p>

<p><strong>白石</strong>：あ、レスポンシブ対応しているんですね。</p>

<p><strong>富田</strong>：いえ、レスポンシブとかではなくて、PC専用に作っています。SNSなどでシェアされたURLはPCからでもアクセスできるため、PC用の記事ページを用意しています。</p>

<p><img src="/wp-content/uploads/2017/09/a62e25023750308dc74bc0daa58c6104.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24139" srcset="/wp-content/uploads/2017/09/a62e25023750308dc74bc0daa58c6104.jpg 640w, /wp-content/uploads/2017/09/a62e25023750308dc74bc0daa58c6104-300x200.jpg 300w, /wp-content/uploads/2017/09/a62e25023750308dc74bc0daa58c6104-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>JavaとPerlでサーバー管理</h2>

<p><strong>白石</strong>：サーバーサイドでJavaとPerlという複数言語を使っているのはなぜですか？</p>

<p><strong>森藤</strong>：もともとPerlで全体が作られていたのですが、社内の方針で最近はJavaで作ろうという流れになってきています。なので、最近のレポジトリとかはJavaで作ってます。まあ、歴史的背景です(笑)。</p>

<p>Perlはニュースタブと記事ページ、あと社内向けのCMSもPerlで作られています。</p>

<p><strong>白石</strong>：へえ！CMSは自作なんですね。ちなみに、ReactはAPIを出すのに使ってるんですか？</p>

<p><strong>森藤</strong>：はい、ニュースタブの部分は、全てAPIで実装されています。</p>

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

<p><strong>白石</strong>：Reactでサーバーサイドレンダリングしているのでしょうか。</p>

<p><strong>大槻</strong>：いえ、クライアント側でレンダリングしています。</p>

<p>APIでとってきたデータをローカルストレージにのせておいて、ネットワークがないところでも画面が真っ白にならないように工夫しています。</p>

<p><strong>白石</strong>：JavaとPerlで分かれていますけど、システム間連携しているんですか？</p>

<p><strong>森藤</strong>：データベースで連携しています。データベースはMySQLを使っています。</p>

<p><strong>白石</strong>：MySQLをクラウド上で？</p>

<p><strong>森藤</strong>：いえ、オンプレです。本番環境は、現在ほとんどオンプレのサーバーで動いていますが、最近構築したサーバーや開発環境はプライベートクラウドの「Verda」というサービスを使っています。</p>

<p><strong>白石</strong>：えっ、どこかの製品を買うのではなく、自分たちで作ってるんですか。かっこいいですね。</p>

<p><strong>森藤</strong>：DB周りはDBA（データベース管理者）のチームが運用しています。DBサーバーの構成は、マスター1台に参照やバックアップに使うスレーブが数台ある感じです。テキストで入稿するデータなので、データ容量が一気に増えて困ったとか、容量が足りなくなったという話も聞いたことがないですね。</p>

<p><strong>白石</strong>：Javaで入稿システムを作っていらっしゃるんですよね。ScalaやKotlinなんかも使っているんでしょうか？</p>

<p><strong>前澤</strong>：Javaだけです。最近のモダンな言語に比べると、やっぱりJavaは冗長というかすごいコード量を書かないといけないのは大変なんですが…。</p>

<p><img src="/wp-content/uploads/2017/09/7e28640bea28ad295c056205fe2d3ed1.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24142" srcset="/wp-content/uploads/2017/09/7e28640bea28ad295c056205fe2d3ed1.jpg 640w, /wp-content/uploads/2017/09/7e28640bea28ad295c056205fe2d3ed1-300x200.jpg 300w, /wp-content/uploads/2017/09/7e28640bea28ad295c056205fe2d3ed1-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>白石</strong>：ぼくは昔Javaエンジニアだったのですごく気になるんですが、Javaのバージョンは何ですか？</p>

<p><strong>前澤</strong>：Java 8です。</p>

<p><strong>大槻</strong>：僕も前職では、エンタープライズ系のサービスをJavaで書いていました。その時はバージョンが古くて4でした。あと8をちょっと触ったくらい。当時はジェネリクスもアノテーションもなくて(笑)。</p>

<p><strong>白石</strong>：僕はXML地獄でしたね(笑)。EclipseみたいなIDEとかは使ってますか？</p>

<p><strong>前澤</strong>：Eclipseは使ってなくて、IntelliJ IDEAを使ってます。</p>

<h2>React.jsを選択した背景は？</h2>

<p><strong>白石</strong>：フロントエンドのReact.jsはいつから使ってるんですか？</p>

<p><strong>大槻</strong>：ニュースタブができてからなので、2017年2月からですね。</p>

<p><strong>白石</strong>：苦労したこととかありますか？</p>

<p><strong>大槻</strong>：React.jsだから苦労したことは特になかったんですが、どのライブラリにするかは結構検証しました。Vue.jsやRiot.jsなんかもいろいろ試してみたのですが、結局React.jsにしました。</p>

<p>Create React Appでベースを立ち上げた経緯もあって、最初の環境を整えるのはすごくスムーズでした。React.jsは結構書きやすくて、世の中で使われているアプリも多く、バージョンアップも早いし、安定していて信頼できました。</p>

<p><strong>白石</strong>：なるほど。stateの管理とか、Reduxは使ってますか？</p>

<p><strong>大槻</strong>：Reduxは最初は使おうと思ったのですが、意外と過剰なスペックがあってやめました。代わりにFlux Utilsを使っています。</p>

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

<h2>足りない開発ツールはどんどん作る</h2>

<p><strong>白石</strong>：ほかにLINEさん独自の開発手法があれば教えてください。</p>

<p><strong>大槻</strong>：フロントのアクセス解析はGoogle アナリティクスを使っているんですが、そのほかに社内で開発した「LINE Analytics」という解析ツールを使っています。JavaScriptのエラー部分もリアルタイムに収集できるので、リリース直後に増減を確認したりしています。</p>

<p><strong>白石</strong>：LINEさんは結構社内で作る文化があるんですね。自分たちでも作るというのは、意思決定が必要だと思うんですが、どんなかんじで決めているんですか？</p>

<p><strong>富田</strong>：その辺は結構自由にやらせてもらえる風土ですね。プロジェクトで使うツールだけでなく、たとえばメーラーやスケジュール管理といった社内システムについて内製する部署があります。既製品でもの足りなかったら、自分たちで作っちゃおうみたいな。</p>

<p><strong>大槻</strong>：分業しているのでサーバーに触れること自体は少ないんですが、JSやCSSの配信ツールをフロントエンドチーム内で開発したりと、役割内で足りないものは作って配布させたりする人が多いですね。</p>

<p>サーバー側はCIも自前で作ってると聞きました。社内の承認フローがそれほどかたくないので、わりと気軽に自前で作ってます。</p>

<p><strong>白石</strong>：CIもですか！Jenkinsとかを使わずに？</p>

<p><strong>前澤</strong>：Perlでは内製のCIを使っていますが、JavaではJenkinsを使ってビルドしていて、ビルドした成果物をサーバーに配布するシステムは内製です。CDNのオリジンサーバーも自作してますね。</p>

<p><img src="/wp-content/uploads/2017/09/602ad76d16be61a37571ec369267e1b3.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24145" srcset="/wp-content/uploads/2017/09/602ad76d16be61a37571ec369267e1b3.jpg 640w, /wp-content/uploads/2017/09/602ad76d16be61a37571ec369267e1b3-300x200.jpg 300w, /wp-content/uploads/2017/09/602ad76d16be61a37571ec369267e1b3-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>秒間2万のアクセスを捌くパフォーマンス</h2>

<p><strong>白石</strong>：パフォーマンスなんかもかなり気をつかっているんじゃないでしょうか。</p>

<p><strong>森藤</strong>：はい。APIアクセスが秒間2万くらいのアクセスがあるので試行錯誤しています。APPサーバーの台数は約30台くらいなんですが。</p>

<p><strong>森藤</strong>：去年の6月に高速化プロジェクトがあって、CDNを追加しました。CDNはAkamaiを使っています。クエリーをちゃんと書いてなかったりするとサービスが止まるので、SQLには気をつけてキャッシュに貯めるようにしていますね。</p>

<p><strong>白石</strong>：フロントエンドのパフォーマンスで工夫した点はどうですか？</p>

<p><strong>大槻</strong>：ニュースタブは縦に長いんですけど、DOMが増え過ぎるとメモリを食ってアプリがクラッシュしてしまう問題がありました。</p>

<p>iPhoneでは横スワイプでタブ移動できるので、左右のタブを予め描画している分よりDOMが多く、見えないDOMをいかに削除していくかなどの工夫をしています。</p>

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

<h2>タスク管理・チーム間の共有ツールは？</h2>

<p><strong>白石</strong>：皆さんは所属する組織は違うとのことですが、「LINE NEWS」プロジェクトのタスク管理やチーム間の共有ツールはどうしていますか。</p>

<p><strong>富田</strong>：ニュースチームのプロジェクトとして定例ミーティングをして、進捗管理しています。管理に使っているツールはJIRAですね。</p>

<p><strong>白石</strong>：進め方はアジャイルですか？</p>

<p><strong>富田</strong>：そんなにアジャイルぽくはないです。企画チームが20人くらいいて、案件ベースを作ってくれるので、早い段階で開発からもフィードバックしたり、企画と一緒に練ったりします。1週間のスプリント制でやっています。</p>

<p><img src="/wp-content/uploads/2017/09/a93d802f163a1d84f00d15d6fa46a45b.jpg" alt="" width="640" height="419" class="alignnone size-full wp-image-24150" srcset="/wp-content/uploads/2017/09/a93d802f163a1d84f00d15d6fa46a45b.jpg 640w, /wp-content/uploads/2017/09/a93d802f163a1d84f00d15d6fa46a45b-300x196.jpg 300w, /wp-content/uploads/2017/09/a93d802f163a1d84f00d15d6fa46a45b-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>白石</strong>：ニュースチームは全体で何人くらいいらっしゃるんですか？</p>

<p><strong>前澤</strong>：企画や開発、制作、編集、アライアンス、モニタリング、PR・マーケティングなどを含めると、プロジェクトに関わっている人は100人を超えています。エンジニアは現在、バックエンドが8人、フロントエンドが4人です。</p>

<p><strong>白石</strong>：大型プロジェクトですね。CIは自作されてるとのことでしたけど、DevOpsみたいな工夫ポイントはありますか？</p>

<p><strong>前澤</strong>：これまでは五月雨で流動的だったけど、人が増えてきたので週1回のサイクルを整えたり、模索しているところです。</p>

<p><strong>白石</strong>：ソースコードの管理やリリースのルールとかはどうでしょう。</p>

<p><strong>森藤</strong>：ソースコードの管理はGitHubです。Perl側は最低2人レビュアーがいないとリリースやマージしちゃいけないことになっています。</p>

<p><img src="/wp-content/uploads/2017/09/39bde474619f03cb353ff513ca4ae7b9.jpg" alt="" width="640" height="421" class="alignnone size-full wp-image-24149" srcset="/wp-content/uploads/2017/09/39bde474619f03cb353ff513ca4ae7b9.jpg 640w, /wp-content/uploads/2017/09/39bde474619f03cb353ff513ca4ae7b9-300x197.jpg 300w, /wp-content/uploads/2017/09/39bde474619f03cb353ff513ca4ae7b9-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>急成長するサービスと開発体制に合った環境を構築</h2>

<p><strong>白石</strong>：最後に今後こうしたいという抱負や、チャレンジしたい目標を教えてください。</p>

<p><strong>前澤</strong>：LINEのサービスが急速に成長して、エンジニアも増えているので、開発時期によってリポジトリやフレームワークの使い方も違ってきています。それを統一したいと思っているんですけど、結構大変そうです(笑)。</p>

<p><strong>森藤</strong>：これまでのサーバーサイドはほとんどPerlだったんですけど、ここ数年みんなJavaを書くようになって、Perlを書くエンジニアが減ってきているんです。サーバー側をもっとJavaに置き換えていけたらと思ってます。</p>

<p><strong>大槻</strong>：TypeScriptを導入も検討していきたいです。依存するライブラリの都合もあって、簡単ではないかもしれませんが。</p>

<p><strong>富田</strong>：ニュースのプロジェクトが始まったのが2013年で、最近では更新が滞っているruby-sassやgrunt、compassといった古い環境に依存しており、日々の更新に忙しくてそういった根幹部分はなかなか手を入れることが難しかったんですが、最近のリリースで、タスクランナーに依存したコンパイルをやめたり、node-sassへの移行したりしました。</p>

<p>それに伴ってチームで使っている社内用のツールやsassのライブラリを更新しているので、今後も新しい技術についてそれらに生かせるか検証しつつ対応できればと思っています。</p>

<p><strong>白石</strong>：LINEさんは独自の開発ツールをどんどんつくっていく行動力と技術力が素晴らしいですね。今日はいろいろ面白い話をありがとうございました！</p>

<p>LINEさんでは、9月28日(木) にエンジニア向け技術カンファレンス「<a href="http://linedevday.linecorp.com/jp/2017/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">LINE DEVELOPER DAY 2017</a>」を開催するそうです。LINEの様々なサービスにおける技術領域でのチャレンジや開発体制などについて語られるとのことなので、興味のある方はぜひ参加してみてください。</p>

<p><img src="/wp-content/uploads/2017/09/DSC02651-2.jpg" alt="" width="640" height="415" class="alignnone size-full wp-image-24057" srcset="/wp-content/uploads/2017/09/DSC02651-2.jpg 640w, /wp-content/uploads/2017/09/DSC02651-2-300x195.jpg 300w, /wp-content/uploads/2017/09/DSC02651-2-207x134.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>
]]></content:encoded>
			</item>
		<item>
		<title>React及びその周辺技術、事例から見るReact最新情報！──HTML5とか勉強会イベントレポート</title>
		<link>/albatrosary/19288/</link>
		<pubDate>Mon, 13 Jun 2016 06:07:16 +0000</pubDate>
		<dc:creator><![CDATA[佐川 夫美雄]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Flux]]></category>
		<category><![CDATA[React.js]]></category>
		<category><![CDATA[Redux]]></category>
		<category><![CDATA[Relay]]></category>

		<guid isPermaLink="false">/?p=19288</guid>
		<description><![CDATA[5月31日、イベント＆コミュニティスペース dots.にて「第65回HTML5とか勉強会──React最新情報」が開催されました。React及びその周辺技術、事例からReactの最新情報をキャッチアップします。 Reac...]]></description>
				<content:encoded><![CDATA[<p>5月31日、イベント＆コミュニティスペース dots.にて「第65回HTML5とか勉強会──React最新情報」が開催されました。React及びその周辺技術、事例からReactの最新情報をキャッチアップします。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0120.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0120.jpg" alt="IMG_0120" width="600" height="400" class="alignnone size-full wp-image-19291" srcset="/wp-content/uploads/2016/06/IMG_0120.jpg 600w, /wp-content/uploads/2016/06/IMG_0120-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0120-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<h2>React現状確認</h2>

<p>＠koba04氏は「React現状確認」というタイトルで、現在、Reactの取り巻く状況を様々まとめて語りました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0141.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0141.jpg" alt="IMG_0141" width="600" height="400" class="alignnone size-full wp-image-19290" srcset="/wp-content/uploads/2016/06/IMG_0141.jpg 600w, /wp-content/uploads/2016/06/IMG_0141-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0141-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>皆さんご存知の通り、React.jsはFacebookが開発しているJavaScriptライブラリです。まず、Reactはどのようなアプリで利用されているかということからお話します。具体的な例として、まず挙げられるのが<a href="https://ja-jp.facebook.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Facebook</a>です。ここではバリバリに利用されていますし、<a href="https://www.instagram.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Instagram</a>では、アプリケーション全体がすべてReact.jsで作られていますので、<a href="https://facebook.github.io/react/blog/2015/09/02/new-react-developer-tools.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Reactのdevtool</a>を使って中身を見てみるとなかなか面白いかもしれません。</p>

<p><a href="https://www.netflix.com/jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Netflix</a>ではヘビーに利用されていて、テレビのレンダリング部分でも使われています。Twitter(mobile)も、React+Redux+React Routerの構成で利用されています。<a href="https://www.uber.com/ja/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">uber</a>では最近サイトをリニューアルし、そこでは先の構成にサーバサイドレンダリングなども利用しています。</p>

<p>どのような人がReact.jsを利用しているかというと、パフォーマンスが速いから使っているという人はあまりいない。それよりも宣言的なコンポーネント、ピュアなコンポーネントを定義するためといったことや、メンテナブルなUIを作るために使っている人が多いです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0150.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0150.jpg" alt="IMG_0150" width="600" height="400" class="alignnone size-full wp-image-19299" srcset="/wp-content/uploads/2016/06/IMG_0150.jpg 600w, /wp-content/uploads/2016/06/IMG_0150-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0150-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>その他、新しく実装された機能、現状議論されている多くの機能についてコメント。盛りだくさんなので具体的な内容については省略します。詳細な話については、当日の資料をご参照ください。</p>

<ul>
<li>Stateless Function Component</li>
<li>ES2015 Classes &amp; ES2015 Classes Components</li>
<li>React.createClass</li>
<li>React.PureComponent</li>
<li>A pitfall of shouldComponentUpdate</li>
<li>react-addons-perf</li>
<li>why-did-you-update</li>
<li>unstable_batchedUpdates</li>
<li>ReactElement</li>
</ul>

<p>最後に、ミーティングが毎週行われていて、ミーティングノートが１週間ごとに出しています。今後のReact.jsはライブラリとしてもっと小さくしていくことや、レンダラー部分についてどう改善していくかなど議論しています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0146.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0146.jpg" alt="IMG_0146" width="600" height="400" class="alignnone size-full wp-image-19300" srcset="/wp-content/uploads/2016/06/IMG_0146.jpg 600w, /wp-content/uploads/2016/06/IMG_0146-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0146-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p><a href="https://speakerdeck.com/koba04/the-state-of-react-dot-js-2016" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">the-state-of-react-dot-js-2016</a></p>

<h2>なぜReduxを使うのか</h2>

<p>＠kuy氏から、最近人気上昇中の<a href="https://github.com/reactjs/redux" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Redux</a>について、Reduxとはどういったものかを語りました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0174.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0174.jpg" alt="IMG_0174" width="600" height="400" class="alignnone size-full wp-image-19293" srcset="/wp-content/uploads/2016/06/IMG_0174.jpg 600w, /wp-content/uploads/2016/06/IMG_0174-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0174-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>Reduxが最近注目されている理由は、事例が多くなってきているのと、コミュニティが活発になってきているということが挙げられます。特に開発するための周辺ライブラリが充実し、機運が高まり、Reduxが注目され始めています。</p>

<p>反面、Twitter等でよく見かける投稿は、Reduxがつらい、Redux難しい、Reduxの良さがわからないという意見もあり、結果としてRedux大丈夫なのかと思わせてしまうようなことも起きています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0159.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0159.jpg" alt="IMG_0159" width="600" height="400" class="alignnone size-full wp-image-19305" srcset="/wp-content/uploads/2016/06/IMG_0159.jpg 600w, /wp-content/uploads/2016/06/IMG_0159-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0159-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>そこで、なぜReduxを使うのかということを整理してみます。特に、作者の<a href="https://twitter.com/dan_abramov" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Dan Abramov</a>さんいわく、「ライブラリの使い方に時間を費やすよりも背景にあるアイデアを学んで、他所に活用していこう」ということを訴えています。</p>

<h3>Fluxは何を解決したのか</h3>

<p>Fluxの考え方はご存知の方も多いとは思いますが、順番としてはまず、ViewからActionが投げられます。Dispatherはこの投げられたActionをStoreに投げるルーティングの役割をしています。StoreはActionを受け取ってStateを変更します。このStateの変更をViewが受け取って、Viewはその情報に従ってレンダリングを行うという流れです。</p>

<p>Fluxで解決したかったことは、基本的にはReact単体で構築したときに困ることを解決したかった、具体的には、バケツリレーという問題がありました。バケツリレーというのはコンポーネント階層が深くなったとき、例えば深い階層のコンポーネントへイベントを伝搬するときに、途中のコンポーネントには無関係にも関わらず、通過していくという問題がありました。</p>

<p>Stateをコンポーネントで持っている場合、他のコンポーネントへそのStateを渡したい場合、このコンポーネントの上位の親コンポーネントを作ねばならないという問題があった。何かするときに必ず親コンポーネントを作らないといけない。</p>

<h3>Reduxの何がいいのか</h3>

<p>FluxにはDispatcherが存在していましたが、ReduxではDispatcherがStoreの中に組み込まれていました。FluxでもStoreがあるが、ReduxではそのStoreを役割ごとに名前を変え、利便性を向上させたところがポイントです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_01681.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_01681.jpg" alt="IMG_0168" width="600" height="400" class="alignnone size-full wp-image-19306" srcset="/wp-content/uploads/2016/06/IMG_01681.jpg 600w, /wp-content/uploads/2016/06/IMG_01681-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_01681-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>では、より具体的にReduxのどこがいいのかというと、1つの大きなStateツリーを複数のReducerで構築しています。そして、状態管理だけに特化したところです。反面、それ以外は開発者に丸投げということになりますが、よく言えば開発者の状況に応じて開発できるということを意味します。</p>

<p>そして、状態管理に特化したということがあるので、Reduxを素の状態で利用するのはお勧めできないし、無理してReact, Action, Creator, Reducerで実装すると後で大変な思いをするということです。専用のMiddlewareを入れるといいとのことです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0172.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0172.jpg" alt="IMG_0172" width="600" height="400" class="alignnone size-full wp-image-19302" srcset="/wp-content/uploads/2016/06/IMG_0172.jpg 600w, /wp-content/uploads/2016/06/IMG_0172-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0172-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>※当日の資料は以下にアップされていますので、こちらも参照してください。</p>

<p><a href="https://speakerdeck.com/kuy/nazereduxwoshi-ufalseka" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">nazereduxwoshi-ufalseka</a></p>

<h2>Relay</h2>

<p>＠hokaccha氏による<a href="https://facebook.github.io/relay/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Relay</a>のお話です。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0190.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0190.jpg" alt="IMG_0190" width="600" height="400" class="alignnone size-full wp-image-19294" srcset="/wp-content/uploads/2016/06/IMG_0190.jpg 600w, /wp-content/uploads/2016/06/IMG_0190-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0190-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>RelayはクライアントにReactを利用し、サーバにGraphQLを使ったものです。仕様としてまとめたものがGraphQL Relayで実装としては、react-relayとgraphgl-relayがあります。Relayをひと言で言えば、フルスタックなフレームワークです。Angularがよくフルスタックといわれますが、Angularはクライアントだけなので、Relayはサーバまでやっていますので、本当のフルスタックということになると思います。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0188.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0188.jpg" alt="IMG_0188" width="600" height="400" class="alignnone size-full wp-image-19307" srcset="/wp-content/uploads/2016/06/IMG_0188.jpg 600w, /wp-content/uploads/2016/06/IMG_0188-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0188-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>GraphQLとは、Facebookが開発したクエリ言語で、クライアント/サーバ間でデータのやり取りに利用されます。レイヤーとしてはREST/RPCと同じ位置付けになります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0204.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0204.jpg" alt="IMG_0204" width="600" height="400" class="alignnone size-full wp-image-19310" srcset="/wp-content/uploads/2016/06/IMG_0204.jpg 600w, /wp-content/uploads/2016/06/IMG_0204-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0204-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>RESTと違って、リクエストに対するレスポンスのフィールドが1:1対応しているところです。そうすると、必要なフィールドだけを選択可能となり、ネスとしたデータを一発で抽出できることや、型定義が存在するなどメリットがあります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0207.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0207.jpg" alt="IMG_0207" width="600" height="400" class="alignnone size-full wp-image-19308" srcset="/wp-content/uploads/2016/06/IMG_0207.jpg 600w, /wp-content/uploads/2016/06/IMG_0207-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0207-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>Relayの特徴は、そのサイトにも書いてある通り3つあります。</p>

<ul>
<li>DECLARATIVE</li>
<li>COLOCATION</li>
<li>MUTATIONS</li>
</ul>

<p>しかし、Relayは敷居が高いと思います。例えば、GraphQLを覚えて、ちょっとしたアプリを作るにもGraphQLのサーバが必要になりいろいろと大変になる。そしてやっている人もあまりいないので、資料を探すとちょっと大変な思いをします。Relayの期待として、真のフルスタックなフレームワークになり、次世代のRailsになれる可能性があるかもしれないかもしれないです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0222.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0222.jpg" alt="IMG_0222" width="600" height="400" class="alignnone size-full wp-image-19309" srcset="/wp-content/uploads/2016/06/IMG_0222.jpg 600w, /wp-content/uploads/2016/06/IMG_0222-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0222-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>※当日の資料は以下にアップされていますので、こちらも参照してください。</p>

<p><a href="https://speakerdeck.com/hokaccha/relay-1" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">relay-1</a></p>

<h2>How to style React components</h2>

<p>＠Quramy氏からは、コンポーネント内にあるCSSの話がありました。同氏はメインサービスとしてはAngularを使っているが、社内系ツールではReactを使っています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0229.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0229.jpg" alt="IMG_0229" width="600" height="400" class="alignnone size-full wp-image-19295" srcset="/wp-content/uploads/2016/06/IMG_0229.jpg 600w, /wp-content/uploads/2016/06/IMG_0229-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0229-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>UI Componentと呼ばれるものの特徴は、見た目と振る舞いがまとめて提供されていて、適度にカプセル化されているものです。そうなると再利用性が高くなり、保守しやすくなるところに期待があります。このコンポーネントは多くのJSフレームワークでサポートされています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0238.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0238.jpg" alt="IMG_0238" width="600" height="400" class="alignnone size-full wp-image-19311" srcset="/wp-content/uploads/2016/06/IMG_0238.jpg 600w, /wp-content/uploads/2016/06/IMG_0238-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0238-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>Style定義は、とても壊れやすいです。コンポーネントの外部から、CSSを破壊することが簡単にできるからです。つまり、React.Componentを使っただけでは、CSSが適切にカプセル化されているわけではないのです。この問題は、CSSセレクタがGlobalであることが最大の問題だと言えます。この問題解決のために、</p>

<ul>
<li>CSS命名規約</li>
<li>Web Component(Shadow DOM)</li>
<li>CSS in JS</li>
<li>CSS Modules</li>
</ul>

<p>ということが挙げられます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0244.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0244.jpg" alt="IMG_0244" width="600" height="400" class="alignnone size-full wp-image-19312" srcset="/wp-content/uploads/2016/06/IMG_0244.jpg 600w, /wp-content/uploads/2016/06/IMG_0244-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0244-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<h3>CSS in JS</h3>

<p>CSS in JSは、Christopher Chedeauが2014年に発表しました。ReactはJSXでテンプレートをJavaScriptに取り込むことに成功したので、CSSもJavaScriptに取り込めばいいのではということから始まりました。CSS class名を利用しないでinline-styleを利用することで、Styleをコンポーネントに閉じ込めることが可能になり、問題の発生がなくなります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0252.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0252.jpg" alt="IMG_0252" width="600" height="400" class="alignnone size-full wp-image-19314" srcset="/wp-content/uploads/2016/06/IMG_0252.jpg 600w, /wp-content/uploads/2016/06/IMG_0252-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0252-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>こうした考えは、他にもいくつかメリットがあります。デメリットとしては、擬似要素セレクタや擬似クラスセレクタなど、インラインスタイルで定義できないようなものは利用できません。</p>

<h3>CSS Modules</h3>

<p>Glen Maddernが2015年に定評しました。CSS in JSはJavaScriptでStyleを生成したのに対し、CSS ModulesはCSSをJavaScriptから利用するというアプローチを取っています。CSSでできることは、CSSでやろうと言ったところです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0257.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0257.jpg" alt="IMG_0257" width="600" height="400" class="alignnone size-full wp-image-19313" srcset="/wp-content/uploads/2016/06/IMG_0257.jpg 600w, /wp-content/uploads/2016/06/IMG_0257-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0257-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>CSSで定義された名前を論理名として扱い、JavaScriptでimportし、その定義を読み込みます。JavaScriptが実行されるときに内部的に付与した名前に書き換え、容易に破壊できないようにしています。</p>

<p>※当日の資料は以下にアップされていますので、こちらも参照してください。</p>

<p><a href="https://quramy.github.io/react-css-note/#/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">react-css-note</a></p>

<h2>Atomic Design powered by React @AbemaTV</h2>

<p>五藤佑典氏による＠AbemaTVの事例紹介です。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0280.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0280.jpg" alt="IMG_0280" width="600" height="400" class="alignnone size-full wp-image-19296" srcset="/wp-content/uploads/2016/06/IMG_0280.jpg 600w, /wp-content/uploads/2016/06/IMG_0280-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0280-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>＠AbemaTVはサイバーエージントとテレビ朝日が共同で展開していて、多様なコンテンツがあります。AbemaTVでは、開発の初めスマホアプリで開発は進んでいましたが、Web版はなく仕様が決まっていませんでした。しかし、リリース日は決まっているという状態でした。</p>

<p>このような状況では、作っていくうちに画面変更が多々入るのがわかっていたので、わかるところから作るという方針でせめて行きました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0273.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0273.jpg" alt="IMG_0273" width="600" height="400" class="alignnone size-full wp-image-19315" srcset="/wp-content/uploads/2016/06/IMG_0273.jpg 600w, /wp-content/uploads/2016/06/IMG_0273-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0273-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>画面仕様の変更に強いコンポーネントの粒度を、チームで明確化したいという欲求が出てきました。ATOMIC DESIGNを参考にしました。ATOMIC DESIGNとは、UIコンポーネントの要素を化学の原子論的な要素に見立て、小さいシンプルなコンポーネントを組み合わせより大きなコンポーネントを構成するデザインシステムのことです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0282.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0282.jpg" alt="IMG_0282" width="600" height="400" class="alignnone size-full wp-image-19316" srcset="/wp-content/uploads/2016/06/IMG_0282.jpg 600w, /wp-content/uploads/2016/06/IMG_0282-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0282-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>ATOMIC DESIGNの考え方を適用しグローバルナビ、リモコン、スライダー、アイコンなどを作っていきました。こうして作ったAbemaTVの細かな画面変更に関し粒度がある程度細かったため、変更は割とスムーズにできたというところがこのシステムを採用した良い結果だったと考えています。チーム開発において個人の感覚に依存しない形で行えたことは、プロジェクトがうまくいった要素であります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0286.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0286.jpg" alt="IMG_0286" width="600" height="400" class="alignnone size-full wp-image-19317" srcset="/wp-content/uploads/2016/06/IMG_0286.jpg 600w, /wp-content/uploads/2016/06/IMG_0286-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0286-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>@AbemaTVはReact+Flux+Atomic Designですが、ViewでReactとAtomic Designを利用し、StoreでImmutable.js、DespatcherでRxJSを使っています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0287.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0287.jpg" alt="IMG_0287" width="600" height="400" class="alignnone size-full wp-image-19318" srcset="/wp-content/uploads/2016/06/IMG_0287.jpg 600w, /wp-content/uploads/2016/06/IMG_0287-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0287-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>

<p>当日の資料は以下にアップされていますので、こちらも参照してください。</p>

<p><a href="http://www.slideshare.net/ygoto3q/atomic-desigin-powered-by-react-abematv" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">atomic-desigin-powered-by-react-abematv</a></p>

<h2>最後に</h2>

<p>このレポートではイベントが盛りだくさんだったため、内容の細かなところまでは記載できませんでした。各登壇者の資料もアップされていますので、合わせて見ていただけると幸いです。また、<a href="https://www.youtube.com/watch?v=C8bMahvTkHA" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">html5j配信班による動画</a>もありますので、参照してください。</p>

<p>本イベントとは関係ありませんが、2016年のHTML5カンファレンスが9月3日（土）東京電気大学に決まりました！乞うご期待！！</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_0118.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_0118.jpg" alt="IMG_0118" width="600" height="400" class="alignnone size-full wp-image-19297" srcset="/wp-content/uploads/2016/06/IMG_0118.jpg 600w, /wp-content/uploads/2016/06/IMG_0118-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_0118-207x138.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></a></p>
]]></content:encoded>
			</item>
		<item>
		<title>フレームワーク対決！Angular VS React仮想パネルディスカッション</title>
		<link>/yoshikawa_t/14459/</link>
		<pubDate>Mon, 11 May 2015 00:00:30 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[React.js]]></category>
		<category><![CDATA[アーキテクチャ]]></category>

		<guid isPermaLink="false">/?p=14459</guid>
		<description><![CDATA[連載： アプリケーションアーキテクチャ最前線 (2)特集企画「アプリケーションアーキテクチャ最前線」では、さまざまな視点からアプリケーションアーキテクチャをエキスパートたちに語っていただきます。今回は、今話題のAngul...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/arch/" class="series-287" title="アプリケーションアーキテクチャ最前線" data-wpel-link="internal">アプリケーションアーキテクチャ最前線</a> (2)</div><p>特集企画「アプリケーションアーキテクチャ最前線」では、さまざまな視点からアプリケーションアーキテクチャをエキスパートたちに語っていただきます。今回は、今話題のAngularJSなどのJavaScript MVCフレームワークの台頭と進化、そして新しいアーキテクチャであるFluxとそのフレームワークであるReactなどについて、既に先行して学んでいるエキスパートたちにその知見を聞いてみました。</p>

<p>今回はフレームワーク対決ということで、エキスパートたちがAngularとReactという陣営に分かれ、それぞれのフレームワークについて疑問点をぶつけたり、議論したりする仮想パネルディスカッションという形式でお伝えします。単なるパネルディスカッションとは違って、<strong>キーワードは「プロレス」</strong>です。まさかりの投げ合い、disり合いOKという形で、<strong>NGワードは「適材適所」「ケースバイケース」</strong>などです。白熱した議論をお楽しみください！</p>

<p><img src="/wp-content/uploads/2015/04/avr-9.jpg" alt="" width="640" height="415" class="alignnone size-full wp-image-14521" srcset="/wp-content/uploads/2015/04/avr-9.jpg 640w, /wp-content/uploads/2015/04/avr-9-300x195.jpg 300w, /wp-content/uploads/2015/04/avr-9-207x134.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />　<span style="font-size: 80%;">　▲議論が白熱する選手たち。左から、久保田光則さん、金井健一さん、増井雄一郎さん、小林徹さん</span></p>

<h2>選手入場（自己紹介）</h2>

<p><br>
<b>白石：</b>さて、それではプロレスを始めていきましょうか（笑）。まずは、皆さんの簡単なプロフィールと一押しのフレームワークなどを教えてください。
<br><br>
<strong>（React陣営）</strong><br>
<img src="/wp-content/uploads/2015/04/avr-17.jpg" alt="" width="120" height="134" class="alignleft size-full wp-image-14550" /><b>小林：</b>小林徹（@koba04）と申します。前職でソーシャルゲームを作っていました。そのときはBackboneとかAngularとかを使っていて、今はReact.jsに興味があって、業務でも使っていこうかと思っています。　　　　　　　　
<br><br>
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
<br>
<img src="/wp-content/uploads/2015/04/avr-16.jpg" alt="" width="120" height="149" class="alignleft size-full wp-image-14549" /><b>増井：</b>増井雄一郎（@masuidrive）です。一押しのフレームワークは、ReactとFluxなんですが、ReactはViewのライブラリなので、Fluxになるのかなと。複雑なことをやるのは嫌いなので、なるべくシンプルに書けるということでReactとFluxの組み合わせは気に入っています。あとは自由度が高いという点も気に入っています。</p>

<p><br><br>
<strong>（Angular陣営）</strong><br>
<img src="/wp-content/uploads/2015/04/avr-14.jpg" alt="" width="120" height="136" class="alignleft size-full wp-image-14545" /><b>金井：</b>金井健一と申します。フリーランスで、AngularJS Japanユーザーグループの管理人をしています。一押しはAngularですね。Angularは何がいいかというと、フルスタックなところで、悪い面もありますが良い面のほうが多いんじゃないかと思います。学習コストが高いというのもよく言われますが、それだけ機能が多岐に渡っているということなので、いったん使いこなせればすごくいいフレームワークだと思います。
<br><br>
<img src="/wp-content/uploads/2015/04/avr-152.jpg" alt="" width="120" height="145" class="alignleft size-full wp-image-14548" /><b>久保田：</b>久保田光則と申します。アシアルという会社でエンジニアをやっています。会社ではOnsenUIというフレームワークを作っています。3年か4年くらい前からずっとJSとかフロントエンドばっかりやってきていて、ちょっと前はKnockoutJSがいいなと思っていたんですけど、気がついたらずっとAngularJSばっかり書いていました（笑）。Angular2は野心的な方針で、いろんなものを取り込んで最高のものにしていこうという気概が感じられるので注目していかないとなと思っています。
<br></p>

<h2>お互いのフレームワークへの疑問点など</h2>

<p><br>
<b>白石：</b>このパネルディスカッションの今後の流れとしては、僕のほうからは何かコントロールするということはないので、レフェリーみたいなものだと思ってください（笑）。自由にやっていただければと思います。それでは、今回の本題ということで、お互いのフレームワークについて疑問点だったり、disったりということをお願いします。
<br><br>
<b>小林：</b>Angularは、1.04ぐらいのときに使っていて、実際にプロダクトに使ったんですが、結構情報がなくて辛かった思い出があります。DirectiveってよくわからないのでシンプルにControllerとかScopeとかで頑張ってやったという印象がありますね。
<br><br>
<b>金井：</b>当時は、結構そうかも。ただ今は、ドキュメントも充実してきているので今はさほど辛くはないかなと思いますね。Reactはルーティングとかバインディングとかその辺はどこまでできるんですか？</p>

<p><img src="/wp-content/uploads/2015/04/avr-41.jpg" alt="" width="640" height="395" class="alignnone size-full wp-image-14530" srcset="/wp-content/uploads/2015/04/avr-41.jpg 640w, /wp-content/uploads/2015/04/avr-41-300x185.jpg 300w, /wp-content/uploads/2015/04/avr-41-207x128.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>増井：</b>React自体はほんとにViewだけなので、まったくそこはケアしないですね。Fluxは考え方なので、実はすごい小さいんですよ。Dispatcherだけなので数百行ぐらいしかない。あとそこにどうやってルーティングをやるかというのは、React Routerとか外部のコンポーネントを組み合わせて使うので、標準では持っていないです。そこは大きく違いところだと思います。
<br><br>
僕はAngular使っていないんですが、会社（トレタ）のほうでは、PC向けの機能は全部Angularで作ってるんです。でもそこの中の人に聞くと、CRUDみたいなよくあるアプリケーションは結構楽にできて、Angularがなかったら短期間では作れなかったと思うと言われました。ただ、そういうパターンからはずれてしまうとすごい書きにくいかもしれなくて、拡張していくとき、パターンが複雑化してきたときに本当に耐えうるのかが不安と聞きました。そういう傾向ってどうなんですかね？</p>

<p><img src="/wp-content/uploads/2015/04/avr-6.jpg" alt="" width="640" height="421" class="alignnone size-full wp-image-14522" srcset="/wp-content/uploads/2015/04/avr-6.jpg 640w, /wp-content/uploads/2015/04/avr-6-300x197.jpg 300w, /wp-content/uploads/2015/04/avr-6-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>久保田：</b>何もかもScopeとかで管理しようとすると結構はまりどころ多いなというイメージがありますね。細かいインタラクションとか、例えばドラッグ＆ドロップを直接使いたいときって、結局DOMを触るしかなくて、DOM触るにはDirectiveっていうものが用意されています。Directiveは、ある程度DOMに対してのいろんな機能を追加するとか、細かいDOMの操作を担当するものなんですよ。全部Controllerで管理しようとするとすごいぐちゃぐちゃになったりするんですけど、ちゃんと自分でDirectiveを作って管理すると扱いやすいと思います。
<br><br>
<b>増井：</b>なるほど。あと、Angular1系と2系ってはたから見てると、2系が年末だか来年だかに出て、結構互換性がないっていう話で、1系は捨てちゃうっていうことを聞いてそこはちょっと怖いかなっていう印象はありますね。
<br><br>
<b>金井：</b>2系が主流になって、1系が減ってこない限りはサポートするという話ですね。なので、そこは早いうちにアップデートしないといけないかもしれません。
<br><br>
<b>増井：</b>でもアップデートってまるまる書き直しなんですよね？
<br><br>
<b>久保田：</b>ng-japanでもアナウンスされてましたが、Angular2とAngular1を共存する方法はあって、1系のコードと2系のコードを混在させることができるようですね。</p>

<h2>今からフレームワークを採用するとしたらどちらを使う？</h2>

<p><br>
<b>増井：</b>今から新しくプロジェクト始めるときにどのフレームワークで作ろうかみたいなときに、実際に作る人は悩むんですかね。
<br><br>
<b>白石：</b>実際、今作ろうと思っているものがあるんですが、悩みますね。
<br><br>
<b>金井：</b>なんでそこはAngularじゃないんですか（笑）。</p>

<p><img src="/wp-content/uploads/2015/04/avr-11.jpg" alt="" width="640" height="399" class="alignnone size-full wp-image-14528" srcset="/wp-content/uploads/2015/04/avr-11.jpg 640w, /wp-content/uploads/2015/04/avr-11-300x187.jpg 300w, /wp-content/uploads/2015/04/avr-11-207x129.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>白石：</b>Angularはでかくて複雑すぎて怖いんですよね。しかもAngular2が迫っているという。この今のタイミングで採用するのはちょっと怖い。
<br><br>
<b>増井：</b>そういう意味では、僕はReact.jsがなくなっても、React.jsと同じものを書ける自信があるんですよ。FluxとReact.jsをまるっとFacebookがやめました、明日からReactはありませんと言われたときに、僕はReact全体をメンテナンスできる。まるっと同じものを作れっていわれたら、まあ頑張って作れる。Angularは作れる気がしない。
<br><br>
<b>金井：</b>作れる気はしないですね（笑）。
<br><br>
<b>増井：</b>僕は結構そこが怖くて。なので、大きいフレームワークは採用しにくいっていう面があります。あと、MVCの上にMVCを乗っけるというのは、その考え方はすごくToo Muchかなと。サーバーサイドは、サーバーサイドでMVCを作っていて、さらにクライアントサイドでMVCを作るわけじゃないですか。MVCの2階建てはアーキテクチャとして本当にいいのかっていうのはすごく思っていますね。
<br><br>
そもそもモデルをデータベースから作って、ちゃんとAPIにしているはずなのに、それをさらにもう一回モデルとして扱う、あんまり効率的じゃないんじゃないかっていう。Reactだけに限ると、MVCのVしかないので、そもそも書いて読んだJSONをそのままViewで表示するってことをやったりするんです。だけど、実はAPIが揃ってると結構なWebアプリケーションで、そもそもモデルまでおこさなくてもいいんじゃないかっていう気がするんですよ。</p>

<p><img src="/wp-content/uploads/2015/04/avr-5.jpg" alt="" width="640" height="388" class="alignnone size-full wp-image-14523" srcset="/wp-content/uploads/2015/04/avr-5.jpg 640w, /wp-content/uploads/2015/04/avr-5-300x182.jpg 300w, /wp-content/uploads/2015/04/avr-5-207x125.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>金井：</b>JSONをとってきて出すっていうのはAngularでもできるので、それはアプリの設計によるのかなという気がしています。Angularの場合は、さらにそこから変更もできるという利点があります。
<br><br>
<b>増井：</b>それにしてはToo Muchすぎるんじゃないかと。
<br><br>
<b>金井：</b>それだけしたい場合には確かにそうですね。
<br><br>
<b>増井：</b>結構なケースがそれで済むんじゃないかっていう気はしていて。実はクライアント側でMVCが必要なほど複雑な処理するケースってそんなに多いのかなと。
<br><br>
<b>久保田：</b>まあでも実際には、もちろんアプリの要件によると思います。ハイブリッドアプリって結局JSでなんでもやるので、API叩けばそれで終わりというわけじゃなくて、むしろJSのほうでいろんなことを書かなきゃいけないって感じになるので、API叩けばそれで終わりっていう感じにはならないですよね。
<br><br>
APIってネットワーク越しにやるんでそれってすごく重たいし、あんまりやりたくないっていうのはモバイルアプリだと多いです。そもそもモバイルアプリだとネットワーク繋がらないってこともあるので、それを解決するにはローカルのほうでデータを保持して、繋がったら同期をとるっていう感じになるので、モデルがないとちょっと辛いという感じになりますね。</p>

<h2>JSXは気持ち悪い？</h2>

<p><br>
<b>白石：</b>JSXがキモいんですけど…。
<br><br>
<b>増井：</b>あれは気持ち悪いんですよ実際（笑）。キモいっていうのはまったく異論ないんですけど、あれはあれで理にかなっていると思っています。DOM操作がなんで難しいかっていうとそもそもこのDOMをみたときに、これがいつどこで書き換わるかわからないし、さらにこのボタンを押したときにどこで何が起こるかわからない、イベントは1個じゃなくて100個でも張れるので。っていうのに対してJSXの場合はそういうのを一応ビューとロジックを同じところに書くことで、さらにイベントリスナーを1対1にすることによって、そういう複雑性を省きましょうという考え方なので、気持ち悪いことは認めつつ、理にはかなっているかなと。
<br><br>
1番の問題は、HTMLしか書けない人がこれを触れないっていう。コーダーと分離ができないっていう点ですよね。ただこれはもっと根本的な問題で、Reactは画面の一部をコンポーネントとしてスコープを作りましょうっていう考え方で、HTMLを切ってるんじゃなくて、プログラミングスコープを切ってるんですよ。それって見た目のデザインとはちょっと違って、アーキテクチャのデザインの話なので、見た目とロジックを切り離すっていうところに、そもそも無理があるじゃないかっていうことですね。</p>

<p><img src="/wp-content/uploads/2015/04/avr-8.jpg" alt="" width="640" height="400" class="alignnone size-full wp-image-14534" srcset="/wp-content/uploads/2015/04/avr-8.jpg 640w, /wp-content/uploads/2015/04/avr-8-300x188.jpg 300w, /wp-content/uploads/2015/04/avr-8-207x129.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>金井：</b>そこらへん（画面の一部をコンポーネントとしてスコープを作る）は、Angularも目指すところは同じかもしれないですね。
<br><br>
<b>増井：</b>そのやり方が違うってだけなんでしょうね。
<br><br>
<b>久保田：</b>ちょっといいですか。別にJSXって気持ち悪くなくないですか。
<br><br>
<b>小林：</b>私も全然違和感ない（笑）。
<br><br>
<b>白石：</b>人によるんだ。
<br><br>
<b>増井：</b>僕も去年からReactを知ってたのに触ってなかったのは、JSXです（笑）。あれで毛嫌いして触らなくて、でもあんまり話題になってるので去年の年末年始から本格的に触ってみたというのがあります。あれは僕個人も気持ち悪いです（笑）。
<br><br>
<b>小林：</b>ぱっと見たときに、あれ（JSX）がやりたいフレームワークなのかなと思っちゃうんですよね。
<br><br>
<b>増井：</b>日本でのReactの評価は、Virtual DOMっていう技術キーワードとJSXという見た目にすごく左右されている印象がありますね。</p>

<h2>Virtual DOMって本当に早いんですか？</h2>

<p><br>
<b>白石：</b>Virtual DOMって本当にそんなに早かったりするんですか。ぱっと考えると差分をComputeとする計算処理も必要だし、フロントのDOMと仮想DOMって2つ持っているメモリも喰いそうだなと思うんですけど、実際はどうなんですか？</p>

<p><img src="/wp-content/uploads/2015/04/avr-10.jpg" alt="" width="640" height="412" class="alignnone size-full wp-image-14524" srcset="/wp-content/uploads/2015/04/avr-10.jpg 640w, /wp-content/uploads/2015/04/avr-10-300x193.jpg 300w, /wp-content/uploads/2015/04/avr-10-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>小林：</b>実際は何が一番早いかっていうのはやっぱりDOMを直接触るのが一番早いっていうのは間違いなくて、でもそれってコードとしても複雑になるじゃないですか。モデルのデータの変更された部分だけをどういう風に反映するのかっていうところが煩雑になる。Virtual DOMだと、ひとつの状態をもっておいて、パっと更新すると差分だけを綺麗に反映してくれるので、DOMを直接触るよりは遅いですが、該当部分のDOMを全部入れ替えるよりは早いという感じです。最速ではない。
<br><br>
<b>白石：</b>最速ではないと。わりとプログラマーがいい加減な処理をしてもいいってことですね。
<br><br>
<b>増井：</b>Reactはとりあえずざっくり書けば、そこそこ速いっていうような考えですね。
<br><br>
<b>久保田：</b>最近、Atomで内部でReact使ってたけどパフォーマンスのために削除したっていう話がありましたね。
<br><br>
<b>白石：</b>え、そうなんですか。もう使わなくなっちゃったんだ。
<br><br>
<b>小林：</b>最初のやつがちゃんと構造化されていなくて遅かったのをReactにして、ちょっと速くなって。そこをベースにDOM職人が頑張ってやったらさらに早くなったっていう感じですね。</p>

<h2>Angularは謎のルールが多い</h2>

<p><br>
<b>白石：</b>Angularを触ったり調べたりしたときに僕的には謎のルールがすごい多くてとっつきにくかった。例えば、$変数が多すぎ。何々のときは$なんとかが多くて、なんだこれはっていう（笑）。
<br><br>
<b>金井：</b>あれ何なんでしょうね。$$とかあるしね（笑）。</p>

<p><img src="/wp-content/uploads/2015/04/avr-7.jpg" alt="" width="640" height="397" class="alignnone size-full wp-image-14535" srcset="/wp-content/uploads/2015/04/avr-7.jpg 640w, /wp-content/uploads/2015/04/avr-7-300x186.jpg 300w, /wp-content/uploads/2015/04/avr-7-207x128.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>白石：</b>Dependency Injectionを実装したのはいいんだけど、まず引数の名前で当てるからminifyしないでねとか、minifyしてもいいように別の書き方も発明したよとか配列で指定できるようになったりとか。なんかもう歴史上の問題かもしれないんですけど、謎ルールが多すぎる感があるんですけど。そこらへんはどうなんでしょう？
<br><br>
<b>久保田：</b>やっぱりそこは気持ち悪いなと思います。でも昔からずっと実務上の必要からそういうのが増えてきたのかなと思いますね。あとから来た方がどうしたもの洗練されたものになっていくので…。
<br><br>
<b>増井：</b>Angularっていつできたんでしたっけ？
<br><br>
<b>金井：</b>結構前で、2009年ですね。
<br><br>
<b>増井：</b>そんなに前なんだ！
<br><br>
<b>金井：</b>Angular1が2012年ぐらいなので、そこで注目された感じですね。2009年にできたフレームワークが5年くらい経って実用になりつつも、辛くなってきたということでAngular2を開発しているということだと思います。Angularのいいところっていうのは、その時々で結構先のことを見据えてやろうとしていて、1系だとWeb Componentsを実装したくてDirective作ったりしてるし、Object.observe()欲しいよねっていって2way bindingを実装してみたりとか。どんどん攻めてるんですよね。
<br><br>
<b>増井：</b>そういうイメージはありますね。</p>

<h2>実はReactは大きい</h2>

<p><br>
<b>白石：</b>ちなみにフレームワークの大きさでいうとどうなんでしょう。
<br><br>
<b>増井：</b>ReactってViewのライブラリだけのくせにすごいでかいんですよ。へたしたらjQueryよりでかい。
<br><br>
<b>金井：</b>フレームワークのサイズが大きいと、モバイルのユースケースで叩かれませんか、重いとか。Angularは相当叩かれた覚えがあります（笑）。
<br><br>
<b>増井：</b>とはいっても画像ひとつ分ぐらいですからね。Reactも実際よくあるReactのダメなところに「でかい」っていうのはいろいろ言われていて、でも現実ユーザーからそういう話があがってるわけではなく、数字で見てっていう部分があります。あと、Reactはサーバーサイドレンダリングを持っているので、ファーストビューはサーバーサイドで出しちゃって、その後にJS読み込むっていうことができるので、そういう意味では十分早いですね。面倒くさいですけど、やろうと思えばできます。
<br><br>
<b>白石：</b>今、ダウンロードしてみたんですけど、Angularがminify時で126KBで、Reactが121KBという結果に。</p>

<p><img src="/wp-content/uploads/2015/04/avr-13.jpg" alt="" width="640" height="394" class="alignnone size-full wp-image-14538" srcset="/wp-content/uploads/2015/04/avr-13.jpg 640w, /wp-content/uploads/2015/04/avr-13-300x185.jpg 300w, /wp-content/uploads/2015/04/avr-13-207x127.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>増井：</b>しかも、AngularはMVCで、ReactはVだけで、ですからね（笑）。
<br><br>
<b>金井：</b>やれること全然違う。（Angularは）ルーティングからバインディングからすべてできるのに（笑）。</p>

<h2>検索可能にするサーバーサイドレンダリング</h2>

<p><br>
<b>増井：</b>Reactのひとついいところは、サーバーサイド生成ができるのでぐぐったときに引っかかるんですよね。クローラーは基本的にはJSを実行しないので、みんなテンプレートにはじめから引っかかりそうなキーワードを入れたりとかして頑張るんですけど。でもReactはサーバーサイド（Node.js）でReactエンジンを実行してHTMLを生成することができるんですよ。そうすると例えば、基本的な部分をファーストビューで表示すると、JSが実行されなくてもHTMLで画面が見えて、JSが実行されると残りの部分が表示されるという段階的にできるですよ。
<br><br>
そうすれば、検索エンジンに引っかかるし、JSがもし（ブラウザで）動作しなくても本文はちゃんと読めるというメリットがあります。といってもそれをやるには、それなりに考えて書かなきゃならなきゃいけなかったり、その実行エンジンをいろいろセットアップしなきゃいけないので、手放しでできるっていうわけでもないんですが。</p>

<p><img src="/wp-content/uploads/2015/04/avr-12.jpg" alt="" width="640" height="384" class="alignnone size-full wp-image-14537" srcset="/wp-content/uploads/2015/04/avr-12.jpg 640w, /wp-content/uploads/2015/04/avr-12-300x180.jpg 300w, /wp-content/uploads/2015/04/avr-12-207x124.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>小林：</b>海外はやっぱりReact導入してるところは、サーバーサイドレンダリングもやっているところが多いですね。海外のほうがサーバーにNode.jsを使うのは結構一般的で、日本だとあんまりないから意外なんですけど。サーバーサイドレンダリングできるからReact採用してるっていうとこも結構ありますね。BBCとか。
<br><br>
<b>増井：</b>ぐぐれるっていうのはでかいですからね。
<br><br>
<b>白石：</b>なるほど。じゃあAngularのほうは、どうですか？
<br><br>
<b>久保田：</b>まあAngular2に期待ですね。Angular2のレンダリングのアーキテクチャについて設計文書が公開されていて、その中でVirtual DOMを使いますと言っています。
<br><br>
<b>小林：</b>Ember.jsも次のバージョンでHTMLbarsとsimple-domを組み合わせてサーバーサイドレンダリングできるようになる予定で、これからのフレームワークはサーバーサイドレンダリングはついてきそうな気がしますね。
<br><br>
<b>久保田：</b>あと、ちょっと面白いと思ったのがサーバーサイドレンダリングだけでなく、Viewの処理をWeb Workerでやりたいっていう点ですね。
<br><br>
<b>増井：</b>Web WorkerはReactでもやるっていってますね。そんなに進んでないですが。
<br><br>
<b>白石：</b>確かに仮想DOMは、本物のDOMじゃないからWorkerでいじれるし、間のメッセージングにコストがかからなければ割と早そうですね。
<br><br>
<b>増井：</b>そこ（Reactの仮想DOM）の差分の計算までWorkerでやってしまうので、それなりの速度がでるはずですね。ChromeもServiceWorkerとか機能を強化してるのでたぶんそういうのに合わせてるんだろうなと思います。</p>

<h2>開発速度・生産性の比較</h2>

<p><br>
<b>小林：</b>たぶんReact使っても開発速度って上がらない。書く量も結構増えますね。</p>

<p><img src="/wp-content/uploads/2015/04/avr-18.jpg" alt="" width="640" height="406" class="alignleft size-full wp-image-14553" srcset="/wp-content/uploads/2015/04/avr-18.jpg 640w, /wp-content/uploads/2015/04/avr-18-300x190.jpg 300w, /wp-content/uploads/2015/04/avr-18-207x131.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<br><br>
<b>増井：</b>むしろ下がります（笑）。プログラムでひとつ大事なところは、1年後に触れるかどうかだと思っていて、よくプログラムは書くより読む時間、回数のほうが多いので読むことを考えて書くべきだって言う考えがありますよね。時間がかかっても読みやすく書いて、それによってコード量が増えるのはプログラムとしてしょうがないんじゃないかっていう考えがあって、Reactはそういう考えに近いですね。なので記述量は減らないし、同じの書いたら5〜10倍ぐらいになっちゃっていう話もあって、あきらかにめんどくさいです。
<br><br>
<b>金井：</b>AngularJSは、預ける部分が大きいので、勝手にやってくれる。コード量は圧倒的に減りますね。なのでCRUD系作るときはすごく早いです。</p>

<h2>おわりに</h2>

<p>このように議論はすごく白熱して、興味深いトピックスが目白押しでした。楽しんでいただけましたでしょうか。今回は「議論は平行線だった」ということで終わりたいと思います。</p>

<p><img src="/wp-content/uploads/2015/04/avr-1.jpg" alt="" width="640" height="385" class="alignnone size-full wp-image-14515" srcset="/wp-content/uploads/2015/04/avr-1.jpg 640w, /wp-content/uploads/2015/04/avr-1-300x180.jpg 300w, /wp-content/uploads/2015/04/avr-1-207x125.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>
]]></content:encoded>
		
		<series:name><![CDATA[アプリケーションアーキテクチャ最前線]]></series:name>
	</item>
		<item>
		<title>今話題のReact.jsはどのようなWebアプリケーションに適しているか？ Introduction To React─ Frontrend Conference</title>
		<link>/hokaccha/13301/</link>
		<pubDate>Wed, 04 Mar 2015 00:00:55 +0000</pubDate>
		<dc:creator><![CDATA[外村 和仁]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[React.js]]></category>

		<guid isPermaLink="false">/?p=13301</guid>
		<description><![CDATA[連載： Frontrend Conference 特集 (3)本記事は、2015/2/21に行われたFrontrend Conferenceの「Introduction To React」の内容を紹介します。 当日の資料...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/frontrend/" class="series-251" title="Frontrend Conference 特集" data-wpel-link="internal">Frontrend Conference 特集</a> (3)</div><p>本記事は、2015/2/21に行われた<a href="http://frontrend.github.io/conference/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Frontrend Conference</a>の「Introduction To React」の内容を紹介します。</p>

<p>当日の資料は以下にアップされていますので、こちらも参照してください。</p>

<p><a href="https://speakerdeck.com/hokaccha/introduction-to-react" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Introduction To React // Speaker Deck</a></p>

<h2>React.jsとは何か</h2>

<p>React.jsはFacebook製のJavaScriptライブラリです。</p>

<p><a href="http://facebook.github.io/react/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://facebook.github.io/react/</a></p>

<p>公式サイトに、「A JavaScript library for building user interfaces」とあるように、React.jsはUIを構築するためのライブラリです。フレームワークでなくあくまでUIを構築するだけのライブラリで、MVCでいうところのVのみの機能を提供します。</p>

<p>開発を行っているFacebookやInstagramはもちろん、YahooやAirbnbなど多くの採用事例があり、現在注目を集めているライブラリの一つです。</p>

<h2>React.jsの特徴</h2>

<p>React.jsの特徴を知るために、まずは他のライブラリやフレームワークの問題点について見ていきましょう。例えば<a href="http://todomvc.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Todo MVC</a>のような、フォームを送信したらリストに項目が追加されるようなUIの実装を考えてみましょう。</p>

<h3>jQuery</h3>

<p>単純にjQueryだけで実装すると次のようになるでしょう。</p>

<p></p><pre class="crayon-plain-tag">// Submitされたら
$('form').on('submit', functino() {
  // 要素作って
  var $li = $('&lt;li&gt;');
  // ...

  // リストに追加
  $('ul').append($li);
});</pre><p></p>

<p>しかし、これだとデータがDOMにしかないので、何か機能を追加しようとしたときに非常にやりづらいですし、テストも書きにくいコードになります。</p>

<h3>Backbone.js</h3>

<p>Backbone.jsを使うとこの問題をある程度解決することができます。Backbone.jsはデータは管理するModelと、表示を管理するViewに分け、さらにViewをコンポーネントごとに分けるという設計を提案します。例えば次のようになります。</p>

<p></p><pre class="crayon-plain-tag">var FormView = Backbone.View.extend({
  onSubmit: function() {
    // dataを作ってモデルに追加するだけ
    this.collection.add(data)
  }
});

var ListView = Backbone.View.extend({
  initialize: function() {
    // モデルが更新されたらリストを更新
    this.collection.on('add', this.render);
  }
});</pre><p></p>

<p>FormViewやListViewといった、UIの部品ごとに機能を分けていますが、このようなものをここではコンポーネントと呼ぶことにします。</p>

<p>Backbone.jsでデータやコンポーネントを分けて管理できるようになるとある程度の規模ではうまくいきますが、Viewの更新処理を手動で書かないといけない面倒さがあったり、ModelとView間のイベント管理が煩雑になるなど、規模が大きくなった時にスケールしづらいという問題があります。（Backbone.jsのラッパーライブラリである<a href="http://marionettejs.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Marionette</a>や<a href="http://chaplinjs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chaplin</a>といったものもありますが、本質的な問題は同じです）</p>

<h3>Angular.js、Vue.js</h3>

<p>Angular.js、Vue.jsなどに代表される、いわゆるMVVM系のライブラリの特徴はデータが変更されたら自動的に表示が変わる、という考え方です。</p>

<p></p><pre class="crayon-plain-tag">&lt;form ng-submit="onSubmit()"&gt;
  &lt;input type="text" ng-model="text"&gt;
&lt;/form&gt;

&lt;ul&gt;
  &lt;li ng-repeat="item in list"&gt;
    {{item.text}}
  &lt;/li&gt;
&lt;/ul&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">// Controller
$scope.onSubmit = function() {
  // データを更新したら勝手にViewが変わる
  $scope.list.push(newItem);
};</pre><p></p>

<p>このように、HTMLに描画されるデータを記述し、JavaScript側ではデータを更新するだけで自動的に表示が更新されます。しかし、これらのライブラリも、規模が大きくなってきた時に状態を管理するのが難しくなってきます。</p>

<h3>React.js</h3>

<p>jQueryやBackbone.js、Angular.jsは規模が大きくなったときに管理するのが難しくなる、と述べましたが、きちんと設計すれば管理しやすいアプリケーションにすることは可能でしょう。しかし、それらは元々そのような目的のためのライブラリではないので、規模が大きくなっても管理可能に設計するというのは簡単なことではありません。</p>

<p>React.jsは、規模が大きくなっても管理できるような仕組みを提供してくれるライブラリです。逆に言えば、小さいアプリケーションを高速に開発するためのライブラリではないので、そういった場合はBackbone.jsやVue.jsを使ったほうがいいケースが多いと思います。</p>

<p>React.jsの特徴として、コンポーネントを極力ステートレスにすることで、コンポーネントを管理しやすくするというものがあります。</p>

<p></p><pre class="crayon-plain-tag">var Form = React.createClass({
  onSubmit: function() {
    // 親にデータの更新を通知
  },
  render: function() {
    return &lt;form onSubmit={this.onSubmit}&gt;...&lt;/form&gt;;
  }
});

var List = React.createClass({
  render: function() {
    // 親からもらったデータを元に構築するだけ
    return &lt;ul&gt;{this.props.list.map(...)&lt;/ul&gt;;
  }
});</pre><p></p>

<p>各コンポーネントは親からデータをもらい、それを元にViewを構築します。ここで重要なのは、コンポーネント自身は状態を持たないということです。常に外部（多くの場合は親コンポーネント）からの入力によって一意な表示を出力することでテストしやすく、管理可能で再利用性の高いコンポーネントにすることができます。</p>

<p>もちろん、全てのコンポーネントが状態を持たないと単なる静的なHTMLと同じですので、状態を持つコンポーネントも必要になりますが、そのようなコンポーネントを最小限にし、基本的にはステートレスなコンポーネントを作って組み合わせていくのがReact.jsにおけるプログラミングの考え方です。</p>

<p>普通はツリーのルートのコンポーネントだけに状態を持たせ、その状態を子のコンポーネントに伝え、ツリーを構築します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.03.29-PM.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.03.29-PM-640x442.png" alt="ツリーのルートだけがStatefullで子コンポーネントは全てStateless" width="480" height="331" class="alignnone size-large wp-image-13315" srcset="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.03.29-PM.png 640w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.03.29-PM-300x207.png 300w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.03.29-PM-207x143.png 207w" sizes="(max-width: 480px) 100vw, 480px" /></a></p>

<p>また、コンポーネントの状態が変更すると自動的にツリーは再構築されるので、表示の更新を手動でやる必要がありません。これはAngular.jsなどのような、データが変わったら自動的に表示が変わるという考え方と同じです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.58.25-PM.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.58.25-PM-640x482.png" alt="1.末端のコンポーネントでユーザーアクションが起きる、2.ルートコンポーネントに変更を通知、3.子のコンポーネントを再構築する" width="480" height="361" class="alignnone size-large wp-image-13311" srcset="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.58.25-PM.png 640w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.58.25-PM-300x226.png 300w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.58.25-PM-207x156.png 207w" sizes="(max-width: 480px) 100vw, 480px" /></a></p>

<p>基本的にはルートのコンポーネント以外は状態を持たないようにするのがよいですが、input要素などはユーザーアクションによって自身のデータを変更する必要があるので状態を持ちます。</p>

<h2>Virtual DOM</h2>

<p>ルートのコンポーネントだけで状態を持ち、その状態が変更したらツリーを再構築するというのは、非常に設計を単純にしますが、一部分の変更だけで毎回全てのDOMツリーを再構築するのは速度的な面で問題になります。そこでReact.jsはVirtual DOMという仕組みを導入しました。</p>

<p>Virtual DOMはざっくり言うと、JavaScriptのオブジェクトとしてDOMツリーのようなものを持っておき、データに変更があった場合にそのオブジェクトの差分を計算し、実際のDOMへの再レンダリングを最小限にするという仕組みです。</p>

<p>React.jsでは<code>React.createClass</code>でコンポーネントを作成し、renderメソッドの返り値にVirtual DOMの定義を返します。Virtual DOMは<code>React.createElement</code>によって作成します。</p>

<p></p><pre class="crayon-plain-tag">var MyComponent = React.createClass({
  render: function() {
    return React.createElement("div", {className: "foo"}, 
      React.createElement("div", {className: "bar"},
        "Hello ", this.props.name
      )
    );
});</pre><p></p>

<p>また、JSXという独自シンタックスを使うことで、XMLのようなシンタックスでVirtual DOMを表現することができます。</p>

<p></p><pre class="crayon-plain-tag">var MyComponent = React.createClass({
  render: function() {
    return (
      &lt;div className="foo"&gt;
        &lt;div className="bar"&gt;
          Hello {this.props.name}
        &lt;/div&gt;
      &lt;/div&gt;
    );
  }
});</pre><p></p>

<p>これは<a href="https://www.npmjs.com/package/react-tools" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">react-tools</a>や<a href="https://www.npmjs.com/package/babel" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">babel</a>のようなツールで実行可能なJavaScriptのコードに変換することができます。</p>

<h2>React.jsの速度について</h2>

<p>React.jsは速い、と聞いたことがある人もいるかもしれませんが、はたして本当でしょうか。Virtual DOMという仕組みを導入し、ルートのデータを変更してもDOMへの変更が最小限になるので、高速になりますが、それはあくまでも全てのDOMを再構築する場合と比べた場合の話です。ここでは以下の3つのケースについて速度を計測しました。</p>

<ol>
<li>Backbone.jsで変更があった部分だけDOMを再構築</li>
<li>Backbone.jsで何か変更があった場合全てのDOMを再構築</li>
<li>React.jsで何か変更があった場合Virtual DOMの仕組みを通して差分のみDOMを再構築</li>
</ol>

<p>結果は次のようになります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.49.24-PM.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.49.24-PM-640x402.png" alt="Screen Shot 2015-02-28 at 3.49.24 PM" width="640" height="402" class="alignnone size-large wp-image-13307" srcset="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.49.24-PM.png 640w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.49.24-PM-300x188.png 300w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-3.49.24-PM-207x130.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>※ <a href="http://hokaccha.github.io/todomvc-perf-comparison/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TodoMVC Benchmark</a></p>

<p>このように、React.jsは、Backbone.jsで部分的に再構築するよりは遅いが、全てのDOMを再構築するよりははるかに速いことがわかります。</p>

<p>前述したように、状態をルートのコンポーネントだけに持つというのは非常に設計を単純にできます。そのような設計と速度を両立できるのがReact.jsの一番の特徴といえるでしょう。</p>

<h2>Flux</h2>

<p>Fluxはアプリケーションの設計手法の一つとしてFacebookが提唱しているものです。よくMVCと比較され、MVCと比べてデータの流れが一方通行であるという特徴があります。</p>

<div id="attachment_13317" style="width: 650px" class="wp-caption right"><a href="https://html5experts.jp/wp-content/uploads/2015/02/flux-simple-f8-diagram-with-client-action-1300w.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/flux-simple-f8-diagram-with-client-action-1300w-640x193.png" alt="Action→Dispacher→Store→View→Action→（繰り返し）" width="640" height="193" class="size-large wp-image-13317" srcset="/wp-content/uploads/2015/02/flux-simple-f8-diagram-with-client-action-1300w.png 640w, /wp-content/uploads/2015/02/flux-simple-f8-diagram-with-client-action-1300w-300x90.png 300w, /wp-content/uploads/2015/02/flux-simple-f8-diagram-with-client-action-1300w-207x62.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">引用元：<a href="http://facebook.github.io/flux/docs/overview.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://facebook.github.io/flux/docs/overview.html</a></p></div>

<p>ここまでで、React.jsの基本的な設計として、状態をルートコンポーネントに持ち、何か変更があったらその状態を変更すると述べてきましたが、どのようにその変更を通知するかについては触れませんでした。</p>

<p>例えば、ツリーの末端のコンポーネントで何かユーザーのアクションを検知し、状態の変更が必要になったとします。このとき、React.jsではこの末端のコンポーネントはステートレスなので、変更を外に通知する必要があります。このとき、変更があった場合のイベントを公開しておき、直接の親のコンポーネントにイベントハンドラを通して通知する方法があります。</p>

<p></p><pre class="crayon-plain-tag">var Parent = React.createClass({
  handleChange: function(changedData) {
    // 子で何か変更があった時の処理
  },
  render: function() {
    // 子のコンポーネントのイベントにハンドラを設定
    return &lt;Child onChange={this.handleChange}&gt;a&lt;/Child&gt;;
  }
});

var Child = React.createClass({
  handleSubmit: function() {
    // 親から受け取ったイベントハンドラを実行
    this.props.onChange(changedData);
  },
  render: function() {
    // formのDOMイベントにハンドラを設定
    return &lt;form onSubmit={this.handleSubmit}&gt;...&lt;/form&gt;;
  }
});</pre><p></p>

<p>しかし、この方法だと、ネストが深いところのコンポーネントの変更を状態を持っているルートコンポーネントに伝えるのは非常に面倒です。そこで、FluxではViewで起こった変更を一括でActionに通知し、Dispatcherを通じてStoreに変更を通知します。</p>

<p>Storeというのはデータを管理する層で、MVCでいうMにあたる部分です。ViewのルートコンポーネントはこのStoreの変更を購読しており、Storeが変更されると自動的に状態が変更されます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.12.38-PM.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.12.38-PM-640x479.png" alt="View（ツリー）→Action→Disptacher→Store→View" width="480" height="359" class="alignnone size-large wp-image-13319" srcset="/wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.12.38-PM.png 640w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.12.38-PM-300x225.png 300w, /wp-content/uploads/2015/02/Screen-Shot-2015-02-28-at-4.12.38-PM-207x155.png 207w" sizes="(max-width: 480px) 100vw, 480px" /></a></p>

<p>Flux自体は、設計の考え方なので、色々な実装があります。Fluxの考案元であるFacebookにも<a href="https://github.com/facebook/flux" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">facebook/flux</a>という実装がありますが、これはDispacherのみを提供するかなりミニマムな実装です。他には、例えば次のようなものがあります。</p>

<ul>
<li><a href="https://github.com/spoike/refluxjs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">spoike/refluxjs</a></li>
<li><a href="https://github.com/jmreidy/fluxy" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">jmreidy/fluxy</a></li>
<li><a href="https://github.com/yoshuawuyts/barracks" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">yoshuawuyts/barracks</a></li>
<li><a href="https://github.com/BinaryMuse/fluxxor/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">BinaryMuse/fluxxor</a></li>
<li><a href="https://github.com/deloreanjs/delorean" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">deloreanjs/delorean</a></li>
</ul>

<h2>まとめ</h2>

<p>React.jsやFluxの思想・特徴について説明しました。文中でも述べたように、React.jsが提供するのは規模が大きくなってもスケールできるような仕組みで、小さいアプリケーションを高速に開発するためのライブラリではありません。そのようなアプリケーションはAngular.jsやVue.jsのほうが向いている場合も多いですし、静的なページにちょっとしたUIをつけるだけならjQueryだけで十分なケースもあります。</p>

<p>実際にReact.jsとFluxでアプリケーションを書いてみるとわかりますが、ステートレスなコンポネートを組み合わせていくというのは面倒だと感じることも多いです。しかし、その面倒な制限と引き換えに得られるのが堅牢でメンテナンス可能なアプリケーションです。</p>

<p>もしそのような仕組みがほしいと思っている方がいればReact.jsも採用の候補に考えてみてはいかがでしょうか。</p>

<h2>イベント動画</h2>

<p>イベントの模様はYoutubeで公開されています。よろしければ、ご覧ください。</p>

<div class="aligncenter">
<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/Biam884qSjg" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>
</div>
]]></content:encoded>
		
		<series:name><![CDATA[Frontrend Conference 特集]]></series:name>
	</item>
	</channel>
</rss>
