<?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>AngularJS &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/angularjs/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>React 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>
		<item>
		<title>Angular2を書くためのAngularJSの書き方</title>
		<link>/teyosh/18806/</link>
		<pubDate>Fri, 27 May 2016 06:00:05 +0000</pubDate>
		<dc:creator><![CDATA[吉田 徹生]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Angular2]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ng-japan]]></category>

		<guid isPermaLink="false">/?p=18806</guid>
		<description><![CDATA[Angular2のリリースが刻一刻と近づいてきました。しかし世の中のプロダクトは、まだまだ大半がAngular1.xで開発されています。Angular2はコンポーネント指向が徹底されていたり、TypeScriptが推奨の...]]></description>
				<content:encoded><![CDATA[<p>Angular2のリリースが刻一刻と近づいてきました。しかし世の中のプロダクトは、まだまだ大半がAngular1.xで開発されています。Angular2はコンポーネント指向が徹底されていたり、TypeScriptが推奨の開発言語であるなど、Angular1から大きく変わっており、一見すると移行は容易ではありません。</p>

<p>しかしAngular1.xの最新バージョンである1.5では、Angular1から2への移行をスムーズに行うために、Angular2を見据えたコーディングが行えるようになっています。この記事ではAngular2への移行をスムーズにするための、Angular1の書き方を紹介していきます。</p>

<p><img src="/wp-content/uploads/2016/05/DSC02661.jpg" alt="" width="500" height="319" class="aligncenter size-full wp-image-19230" srcset="/wp-content/uploads/2016/05/DSC02661.jpg 500w, /wp-content/uploads/2016/05/DSC02661-300x191.jpg 300w, /wp-content/uploads/2016/05/DSC02661-207x132.jpg 207w" sizes="(max-width: 500px) 100vw, 500px" /></p>

<p><strong>【編集部注】</strong><br>
<span style="font-size: 90%">※この記事は、2016年3月21日に開催された「ng-japan 2016」のセッション「Angular2を書くためのAngularJSの書き方」についての、講演者自身によるレポートです。講演内容に加えて、講演者自身による解説や追記によって、よりわかりやすく詳細な記事に仕上げていただきました。<br>※本記事では、AngularJSをAngular1、 AngularJSの2系をAngularと表記しています。</span></p>

<p>セッションの講演資料と動画はこちらになります。</p>

<h3>講演資料</h3>


<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe class="embedly-embed" src="//cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fspeakerdeck.com%2Fplayer%2Ff7f27043b8884f71822b4fe709864990&amp;url=https%3A%2F%2Fspeakerdeck.com%2Fteyosh%2Fangular2woshu-kutamefalseangularjsfalseshu-kifang&amp;image=https%3A%2F%2Fspeakerd.s3.amazonaws.com%2Fpresentations%2Ff7f27043b8884f71822b4fe709864990%2Fslide_0.jpg&amp;key=internal&amp;type=text%2Fhtml&amp;schema=speakerdeck" width="500" height="344" scrolling="no" frameborder="0" 0="allowfullscreen"></iframe>


<h3>講演動画（2:03:46付近から始まります）</h3>


<!-- iframe plugin v.4.3 wordpress.org/plugins/iframe/ -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/yQX1Y3MAIWQ" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>


<h2>Angular1の歴史と背景</h2>

<p>Angular1は、今から4年前の2012年6月に、バージョン1.0.0がリリースされました。この4年間に、Windowsなら8-&gt;10、Macで10.8-&gt;10.11、Androidで4-&gt;6、iOSで6-&gt;9という変化がありました。バージョンアップが比較的遅いとされるOSでも、4年の間にこれほど大きなバージョンアップが行われているのです。</p>

<p>現在のIT業界では、4年とはこれほど長い期間です。また4年前のWebを振り返ってみますと、当時はBackbone.jsなどのMVCフレームワークが全盛期でした。Angularはリリースされてから大きな人気を博し、世界中の数多くのプロジェクトで採用されました。</p>

<p>しかし月日は流れ、2014年にReactが発表されてからは、Angular1の人気にも陰りが訪れます。コンポーネント指向を採用したReactの優れた設計が広く支持されたこと、Angular1はパフォーマンスがあまりよくないということもあり、Reactを採用するプロジェクトも増えてきました。</p>

<p>そこでパフォーマンスを大きく改善し、アーキテクチャが刷新されたAngular2が今年中にリリースが予定されています。しかしAngular2は変更点が多く、普及には時間がかかることが予想されます。そのため、Angular1.xは当分サポートされることが決定しています。</p>

<h2>Angular1とAngular2の違い</h2>

<p>Angular1とAngular2の違いは多岐にわたります。その中でも代表的な違いを以下に挙げます。</p>

<ul>
<li>主な開発言語がJavaScriptからTypeScriptへ</li>
<li>Two-wayデータバインディングを廃し、One-wayデータバインディングへ</li>
<li>従来のスコープに代わり、コンポーネントがUIの状態を保持する（コンポーネント指向）</li>
<li>テンプレートの文法が変更</li>
<li>従来のng-routerからコンポーネントルーターに</li>
<li>従来の文字列ベースのDI (Dependency Injection)から、型によるDIに</li>
</ul>

<h2>対象ブラウザに関して</h2>

<p>Angular1.5は、残念ながらIE8以前では動作しません。IE8以前を対象とする場合は、Angular1.2を利用する必要があります。もしIE8を対象にしなくてよいのであれば、Angular1.5へのアップデートが強く推奨されます。</p>

<h2>JavaScriptからTypeScriptへ</h2>

<p>Angular2では、メインの開発言語がTypeScriptに変更されました。</p>

<p>簡単に経緯を説明しますと、もともとAngular2を開発する際、JavaScriptのスーパーセットであるAtScriptという言語を同時に開発していました。</p>

<p>AtScriptの実体は、アノテーション付きのTypeScriptと言ってよいものでしたが、開発は難航。2015年3月にTypeScriptが（アノテーションに近い機能である）デコレーターの実装を表明すると、Angular2はTypeScriptへと移行したという流れがあります。</p>

<p>実際には、Angular2にとってTypeScriptは必須ではなく、JavaScriptやDartでも開発は可能です。しかしTypeScriptを利用すると多くのメリットがあるので、TypeScriptの使用が推奨されています。</p>

<p>ちなみに、TypeScriptというのは以下のような特徴を持った言語です。</p>

<h3>TypeScriptの特徴</h3>

<ul>
<li>型がある</li>
<li>インターフェースがある</li>
<li>モジュールインポートがある</li>
<li>仕様がしっかりしている</li>
<li>JavaScriptのスーパーセットである</li>
<li>TypeScriptはそのままではブラウザでは利用できないのでコンパイル（JavaScriptへの変換）が必要</li>
</ul>

<h2>BrowserifyやWebpackを使おう</h2>

<p>皆さん、GruntやGulpと言ったタスクランナーを既に使われている方は多いと思います。Angular1.5 / 2の開発では、TypeScriptのimport文を使用してモジュール間の依存性を記述していくため、こうした依存関係を解決して実行可能なプログラムを生成できるツールが必要です。</p>

<p>そうしたツールにはBrowserifyやWebpack、System.jsなどがあり、import文やCommonJSのrequire()関数などを解釈し、依存関係を解決した上で、ファイルを一つにまとめる機能を持ちます。</p>

<p>TypeScriptからのコンパイルなどもプラグインとして提供されており、今後のAngular開発には必須のツールとなっています。</p>

<h2>Angular1.5のコードを眺める</h2>

<p>Angular2とAngular1の違いや開発に必要な情報が一通り揃ったところで、実際にAngular1.5のコードを眺めてみましょう。
以下は、画面に「Hello」と表示するだけのプログラムです。</p>

<p></p><pre class="crayon-plain-tag">import * as angular from 'angular';

angular.module('app')
.component('app', {
  template: `&lt;div&gt;Hello {{ $ctrl.text }}&lt;/div&gt;`,
  controller: class App {
    public text: string;
    constructor() {}
  },
  bindings: {
    text: '@'
  }
});</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;!doctype html&gt;
&lt;html&gt;
&lt;body&gt;
  &lt;app text="ng-japan"&gt;
    Loading...
  &lt;/app&gt;
  &lt;script src="./bundle.js"&gt;&lt;/script&gt;
  &lt;script&gt;
    angular.bootstrap(document, ['app']);
  &lt;/script&gt;
&lt;body&gt;
&lt;/html&gt;</pre><p></p>

<p>Angular1のコードには違いないように見えますが、これまでとは何かが違いますね。</p>

<p>実際上のコードはTypeScriptで書かれており、<code>import</code>や<code>class</code>、<code>public</code>などのアクセス指定子など、素のJavaScriptでは使えない文法が多く使われています。</p>

<h2>DirectiveからComponentへ</h2>

<p>Angular2から、コンポーネントという概念が登場します。それに合わせて、Angular1.5でもコンポーネントが利用できるようになりました。Angular1のディレクティブに比べて、簡単に作ることができます。</p>

<h1>DirectiveとComponentでの設定値の違い</h1>

<p>Directiveには先述したComponentと呼ばれるDOMの生成と他にAttributeに設定する処理ng-repeatやng-showなども同じ方法で作成しています。</p>

<p>そのため、Componentを作るには設定が過多気味であり、Angular2へ移行する場合に必要なものと不必要なものをより分けた作成メソッドを新たに追加されました。</p>

<p>以下の表が元々のDirectiveメソッドと追加されたComponentメソッドとの設定の違いとなります。</p>

<table>
<thead>
<tr>
  <th align="left"></th>
  <th align="right">Directive</th>
  <th align="center">Component</th>
</tr>
</thead>
<tbody>
<tr>
  <td align="left">bindings</td>
  <td align="right">No</td>
  <td align="center">Yes (binds to controller)</td>
</tr>
<tr>
  <td align="left">bindToController</td>
  <td align="right">Yes (default: false)</td>
  <td align="center">No (use bindings instead)</td>
</tr>
<tr>
  <td align="left">compile function</td>
  <td align="right">Yes</td>
  <td align="center">No</td>
</tr>
<tr>
  <td align="left">controller</td>
  <td align="right">Yes</td>
  <td align="center">Yes (default function() {})</td>
</tr>
<tr>
  <td align="left">controllerAs</td>
  <td align="right">Yes (default: false)</td>
  <td align="center">Yes (default: $ctrl)</td>
</tr>
<tr>
  <td align="left">link functions</td>
  <td align="right">Yes</td>
  <td align="center">No</td>
</tr>
<tr>
  <td align="left">multiElement</td>
  <td align="right">Yes</td>
  <td align="center">No</td>
</tr>
<tr>
  <td align="left">priority</td>
  <td align="right">Yes</td>
  <td align="center">No</td>
</tr>
<tr>
  <td align="left">require</td>
  <td align="right">Yes</td>
  <td align="center">Yes</td>
</tr>
<tr>
  <td align="left">restrict</td>
  <td align="right">Yes</td>
  <td align="center">No (restricted to elements only)</td>
</tr>
<tr>
  <td align="left">scope</td>
  <td align="right">Yes (default: false)</td>
  <td align="center">No (scope is always isolate)</td>
</tr>
<tr>
  <td align="left">template</td>
  <td align="right">Yes</td>
  <td align="center">Yes, injectable</td>
</tr>
<tr>
  <td align="left">templateNamespace</td>
  <td align="right">Yes</td>
  <td align="center">No</td>
</tr>
<tr>
  <td align="left">templateUrl</td>
  <td align="right">Yes</td>
  <td align="center">Yes, injectable</td>
</tr>
<tr>
  <td align="left">terminal</td>
  <td align="right">Yes</td>
  <td align="center">No</td>
</tr>
<tr>
  <td align="left">transclude</td>
  <td align="right">Yes (default: false)</td>
  <td align="center">Yes (default: false)</td>
</tr>
</tbody>
</table>

<p>引用：<a href="https://docs.angularjs.org/guide/component" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://docs.angularjs.org/guide/component</a></p>

<h2>Angular1のパフォーマンス問題</h2>

<p>Angular1のパフォーマンスが良くない理由ですが、その原因を挙げてみましょう。</p>

<ul>
<li>Two-wayデータバインディングが重い</li>
<li>状態の監視に伴うオーバーヘッド</li>
<li>dirty check</li>
<li>$digest loop</li>
</ul>

<p>では、どうしたらよいのでしょうか？以下の様なアーキテクチャが推奨されていますが、Fluxアーキテクチャによく似ています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/05/one-way.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/05/one-way-300x275.png" alt="one-way" width="300" height="275" class="alignnone size-medium wp-image-18871" srcset="/wp-content/uploads/2016/05/one-way-300x275.png 300w, /wp-content/uploads/2016/05/one-way.png 640w, /wp-content/uploads/2016/05/one-way-207x190.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>では、このアーキテクチャに従ったコードのサンプルを紹介します。</p>

<p>まずはアプリケーションのエントリーポイントとなるHTML（<code>index.html</code>）です。これは、<code>angular.bootstrap()</code>を呼び出しているだけで、特に変わったことはしていません。ただし、<code>list-cmp</code>というタグを使用していることは覚えておいてください。</p>

<p></p><pre class="crayon-plain-tag">&lt;!doctype html&gt;
&lt;html&gt;
&lt;body&gt;
  &lt;list-cmp&gt;
    Loading...
  &lt;/list-cmp&gt;
  &lt;script src="./bundle.js"&gt;&lt;/script&gt;
  &lt;script&gt;
    angular.bootstrap(document, ['app']);
  &lt;/script&gt;
&lt;/body&gt;</pre><p></p>

<p>以下がサービスのコードです。このサービスは、アプリケーションのデータを保持しており、データの操作を行うことが可能です。</p>

<p></p><pre class="crayon-plain-tag">import * as angular from 'angular';

angular.module('app')
.service('StoreService', class Store{
  private datas: Array&lt;string&gt; = [];
  constructor(){
    this.datas = ['angular', 'javascript', 'typescript', 'angular2'];
  }
  getList() {
    return this.datas;
  }
  addData(data:string) {
    this.datas.push(data);
  }
  changeData(index:number, data:string){
    this.datas[index] = data;
  }
  deleteData(index:number){
    this.datas.splice(index, 1);
  }
})</pre><p></p>

<p>以下は、<code>index.html</code>で使用されていた<code>list-cmp</code>タグ（コンポーネント）の実装です。内部で、さらに<code>lang-cmp</code>というタグ（コンポーネント）を使用しています。</p>

<p>また、Angular1で多用されていた<code>$scope</code>はもう使われておらず、代わりにコンポーネントのコントローラーの参照である<code>$ctrl</code>が使用されています。基本的には、$scopeはもう使用してはならないものとして考えましょう。</p>

<p></p><pre class="crayon-plain-tag">import * as angular from 'angular';

angular.module('app')
.component('listCmp', {
  template: `&lt;ul&gt;&lt;li ng-repeat="data in $ctrl.datas"&gt;
    &lt;lang-cmp index="$index" lang-data="data"
     lang-change="$ctrl.change(index, data)"
     lang-delete="$ctrl.delete($index)"&gt;&lt;/lang-cmp&gt;
  &lt;/li&gt;&lt;/ul&gt;`,
  controller: class List {
    private store;
    private datas: Array&lt;string&gt; = [];
    constructor(StoreService) {
      this.store = StoreService;
      this.datas = StoreService.getList();
    }
    change(index: number, data: string) {
      this.store.changeData(index, data);
    }
    delete(index: number){
      this.store.deleteData(index);
    }
  }
});</pre><p></p>

<p>最後に、<code>lang-cmp</code>タグの実装です。上のコードで指定されていた<code>lang-change</code>や<code>lang-delete</code>と言った属性が、<code>langChange</code>や<code>langDelete</code>といったプロパティに対応しています。</p>

<p></p><pre class="crayon-plain-tag">import * as angular from 'angular';

angular.module('app')
.component('langCmp', {
  template: `&lt;input ng-model='$ctrl.langData'&gt;
  &lt;button ng-click="$ctrl.change()"&gt;変更&lt;/button&gt;
  &lt;button ng-click="$ctrl.delete()"&gt;削除&lt;/button&gt;`,
  controller: class Data {
    private langData:string;
    private index:number;
    private langChange;
    private langDelete;
    constructor() {}
    change() {
      console.log(this.index, this.langData);
      console.log(this.langChange);
      this.langChange({index: this.index, data: this.langData});
    }
    delete() {
      this.langDelete({index: this.index});
    }
  },
  bindings: {
    'langData': '&lt;',
    'index': '&lt;',
    'langChange': '&amp;',
    'langDelete': '&amp;'
  }
})</pre><p></p>

<h2>コンポーネント指向のディレクトリ構造</h2>

<p>コンポーネント指向になったことから、コンポーネント単位にまとめると見通しがよくなります。</p>

<p></p><pre class="crayon-plain-tag">├─about
│  └─components
│          about.component.e2e.ts
│          about.component.html
│          about.component.scss
│          about.component.spec.ts
│          about.component.ts
│
├─app
│  └─components
│          app.component.e2e.ts
│          app.component.html
│          app.component.spec.ts
│          app.component.ts
│          navbar.component.html
│          navbar.component.scss
│          navbar.component.ts
│          toolbar.component.html
│          toolbar.component.scss
│          toolbar.component.ts
│
├─assets
│  │  main.scss
│  │  _colors.scss
│  │  _variables.scss
│  │
│  └─svg
│          more.svg
│
├─home
│  └─components
│          home.component.e2e.ts
│          home.component.html
│          home.component.scss
│          home.component.spec.ts
│          home.component.ts
│
└─shared
    └─services
            name-list.service.spec.ts
            name-list.service.ts</pre><p></p>

<h2>テストについて</h2>

<p>Angular2ではテストの基本セットがJasmineとなっていますので、Jasmineだと学習コストは少なくなります。</p>

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

<p>Angular1ではngRouteよりもui-routerがよく使われていると思いますが、Angular2では性能と管理が簡単なComponentRouterが登場します。
Angular1.5用のComponent Routerが用意されています。</p>

<h2>まとめ</h2>

<p>このセッションで学んだことを最後にまとめます。</p>

<ul>
<li>Angular1のプロジェクトでもTypeScriptを使おう</li>
<li>タスクランナーを利用しましょう</li>
<li>Webpackやbrowserifyを利用しましょう</li>
<li>DirectiveからComponentに変更しよう</li>
<li>controllerの廃止</li>
<li>Scopeは原則利用しないように</li>
<li>Two-way data-bindingよりOne-way data-binding</li>
<li>コンポーネント単位でファイルを整理しよう</li>
</ul>
]]></content:encoded>
			</item>
		<item>
		<title>Angular2は「モダンJavaScriptの学習セット」！エキスパートによるディスカッションが熱かった（詳細な注釈付き！）</title>
		<link>/shumpei-shiraishi/18659/</link>
		<pubDate>Mon, 04 Apr 2016 00:15:30 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[Angular2]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[TypeScript]]></category>

		<guid isPermaLink="false">/?p=18659</guid>
		<description><![CDATA[こんにちは、編集長の白石です。 去る3月9日、AngularJSのエキスパートによる座談会におじゃまさせていただきました。この座談会はAngularJS Japan User Groupの佐川 夫美雄さんの呼びかけによる...]]></description>
				<content:encoded><![CDATA[<p><style>
.post-detail-contents p {
  text-indent: 0;
  clear: both;
  overflow: hidden;
} #contents #post-detail .block-contents p {
  overflow: hidden;
} #contents #post-detail .block-contents img.profile-img {
  width: auto;
  float: left;
  margin: 0 8px 4px 0;
}
b.speaker {
  background-size: 48px;
  display: inline-block;
  width: 48px;
  height: 18px;
  float: left;
  padding-right: 8px;
  padding-top: 48px;
  text-align: center;
  margin-bottom: 4px;
  font-weight: normal;
  font-size: small;
}
b.speaker.kanai {
  background: url('/wp-content/uploads/2016/04/48_kanai.jpg') no-repeat;
}
b.speaker.sagawa {
  background: url('/wp-content/uploads/2016/04/48_sagawa.jpg') no-repeat;
}
b.speaker.hayasi {
  background: url('/wp-content/uploads/2016/04/48_hayasi.jpg') no-repeat;
}
b.speaker.yosida {
  background: url('/wp-content/uploads/2016/04/48_yoshida.jpg') no-repeat;
}
b.speaker.siraisi {
  background: url('wp-content/uploads/2016/04/48_shiraishi.jpg') no-repeat;
}
</style></p>

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

<p>去る3月9日、AngularJSのエキスパートによる座談会におじゃまさせていただきました。この座談会はAngularJS Japan User Groupの佐川 夫美雄さんの呼びかけによるもので、お題はもちろん、現在β版として公開中のAngular2。「ハードル高い」「Angular1と違いすぎる」など、いろんな情報も飛び交う中で、Angular2の魅力と課題について存分に語っていただきました。</p>

<p><img src="/wp-content/uploads/2016/03/ng-1.jpg" alt="" width="640" height="480" class="aligncenter size-full wp-image-18695" srcset="/wp-content/uploads/2016/03/ng-1.jpg 640w, /wp-content/uploads/2016/03/ng-1-300x225.jpg 300w, /wp-content/uploads/2016/03/ng-1-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>Angular2に関心のある方にはもちろんのこと、Angular1しか触ったことのない方、そもそもAngularJSは初めてという方にとっても貴重なご意見が満載！エキスパート同士の会話とあって、さすがにハイコンテキストだったので、注釈も多めに入れてみました。Angularを知り尽くしたエキスパートたちによる会話を、どうぞお楽しみください。</p>

<h2>座談会メンバー紹介（50音順）</h2>

<p><img src="/wp-content/uploads/2016/03/ng-2_kanai.jpg" alt="" width="100" height="100" class="alignleft  wp-image-18714" style="width:100%;height:auto;max-width:100px;" />金井 健一<br>SIer、Web制作会社を経てフリーランスに。もともとはサーバサイドでJavaメインのエンジニアだったが、サーバサイドからフロントエンドに転向。html5j Web先端技術味見部部長。また、 AngularJS Japan User Group管理人も務め、主催するイベントを通して AngularJSの普及活動を行っている。</p>

<p><img src="/wp-content/uploads/2016/03/ng-2_sagawa.jpg" alt="" width="100" height="100" class="alignleft  wp-image-18713"  style="width:100%;height:auto;max-width:100px;" />佐川 夫美雄<br>現在、Angularを使ったアプリケーション開発やSIerへのAngular教育など、Angular一色の生活を送っているエンタープライズ系Webエンジニア。COBOLでの生産管理システムの開発を経験後、Javaエンジニア/Oracleデータベースエンジニア/プロジェクトマネージャとしてJavaフレームワーク、品質管理・物流システムの構築を行ってきた。</p>

<p><img src="/wp-content/uploads/2016/04/ng-2_hayasi.jpg" alt="" width="100" height="100" class="alignleft  wp-image-18718"  style="width:100%;height:auto;max-width:100px;" />林 優一<br><span style="font-size: 90%;">株式会社LIG CTO。ソーシャルゲーム開発会社にてUI/UX開発本部本部長としてフロントエンド設計・開発及びマネジメント業務に従事。その後、LIGに入社。フロントエンド開発・フロントエンドエンジニア育成を担当。デザインからサーバーサイドまで幅広く対応。AngularJSコミュニティに所属。ng-mtgやDevelopers Summitでのスピーカーを務める。得意言語はJavaScript。</span></p>

<p><img src="/wp-content/uploads/2016/03/ng-2_yoshida.jpg" alt="" width="100" height="100" class="alignleft wp-image-18715"  style="width:100%;height:auto;max-width:100px;" />吉田 徹生<br>株式会社トレタにてWebアプリケーションを開発。メインでAngularJSを利用し、どこかでAngular2が使えないかと虎視眈々と狙っている。</p>

<p><img src="/wp-content/uploads/2016/03/ng-2_shiraishi.jpg" alt="" width="100" height="100" class="alignleft wp-image-18697 profile-img" style="width:100%;height:auto;max-width:100px;" />モデレーター白石俊平<br>HTML5 Experts.jp編集長。株式会社オープンウェブ・テクノロジー代表取締役として、Web標準技術に関するコンサルティングや開発に従事。Google社公認Developer Expert (HTML5)、Microsoft社公認Most Valuable Professional (IE) 。著書に「HTML5&amp;API入門」「Google Gearsスタートガイド」など。</p>

<h2>Angular2って、ざっくり言うと、なに？</h2>

<p><b class="speaker siraisi">白石</b> 佐川さん、今日はこういう場にお誘いいただいてありがとうございました。今日はAngularJSのエキスパートの方々に、Angular2の魅力や導入にあたっての注意点など、詳しくお聞きしたいと思います。</p>

<p>ではまず最初の質問ですが、まず基本的な事柄から。AngularJS、そしてAngular2とは何ですか？</p>

<p><b class="speaker kanai">金井</b> AngularJSはそもそも、シングル・ページ・アプリケーション（SPA）を構築するためのフレームワークです。そしてその最新版であるAngular2をひと言で表すなら、<strong>Angular1のパワーアップ版</strong> と言えるでしょう。Angular1でできたことがほぼ全てできるだけではなく、Angular1の欠点も改善しています。</p>

<p><b class="speaker yosida">吉田</b> Angular1から引き継いだ良い点としては、「フルスタック」であることが挙げられると思います。Protractorなどのテストフレームワークも含め、SPAを開発するために必要なものがだいたい入っている。Angular2になってもそれは変わらない。この「フルスタックである」という点は、他のフレームワーク（例えばReact）と比べても特徴的じゃないかと思いますね。</p>

<p><img src="/wp-content/uploads/2016/04/33ea72f6f80a12e2ef49177e13fac4b5.jpg" alt="" width="600" height="392" class="aligncenter size-full wp-image-18734" srcset="/wp-content/uploads/2016/04/33ea72f6f80a12e2ef49177e13fac4b5.jpg 600w, /wp-content/uploads/2016/04/33ea72f6f80a12e2ef49177e13fac4b5-300x196.jpg 300w, /wp-content/uploads/2016/04/33ea72f6f80a12e2ef49177e13fac4b5-207x135.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p><b class="speaker siraisi">白石</b> Angular2になって改善した、Angular1の問題点というのは、具体的には何でしょうか？</p>

<p><b class="speaker kanai">金井</b> まずは処理速度が向上したことですね。一説には、<strong>8〜10倍も速度が向上した</strong>と言われています。</p>

<p><b class="speaker siraisi">白石</b> そういえばこの間、<a href="https://auth0.com/blog/2016/01/07/more-benchmarks-virtual-dom-vs-angular-12-vs-mithril-js-vs-the-rest/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Angular1、2、あとReactを比較したベンチマーク</a>なども話題になりました。</p>

<p><b class="speaker sagawa">佐川</b> Angular2では、<strong>外部プロジェクトの活用も意欲的</strong>ですね。そこも改善点といえるんじゃないでしょうか。</p>

<p><img src="/wp-content/uploads/2016/04/f7e83a869d3be6294f8460d2b8a782fa.jpg" alt="" width="600" height="423" class="aligncenter size-full wp-image-18732" srcset="/wp-content/uploads/2016/04/f7e83a869d3be6294f8460d2b8a782fa.jpg 600w, /wp-content/uploads/2016/04/f7e83a869d3be6294f8460d2b8a782fa-300x212.jpg 300w, /wp-content/uploads/2016/04/f7e83a869d3be6294f8460d2b8a782fa-207x146.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p><b class="speaker kanai">金井</b> そこも大きな改善点ですね。<strong>Angular1は独自色が強く、「Angular Way」と揶揄されてきました</strong>が、今回はTypeScriptやSystem.jsなど、外部プロジェクトの成果もうまく活用しています。</p>

<p><b class="speaker sagawa">佐川</b> その他の改善点としては、<strong>ルーター(※)も大きな改善点</strong>だと思います。従来のng-routerや、公式ではないながらも広く使われてきた<a href="https://github.com/angular-ui/ui-router" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ui-router</a>に代わり、Angular2では<strong>コンポーネントルーター</strong>(※)が採用されました。Angular2は、全体的にコンポーネント指向になっていますので、ルーターもそれに合わせて進化しました。</p>

<p><b class="speaker hayasi">林</b> コンポーネントルーターを使ってみると、<strong>ルーターがルーティングに専念できるようになった</strong>と感じました。今までは様々な処理をルーティングと混在させてしまいがちだったので。ルーターとコンポーネントの境目がきっちり分かれたという印象です。</p>

<p><b class="speaker kanai">金井</b> ちなみに、コンポーネントルーターは1.5でも使えます。1.5は、既存のAngularアプリケーションを2にアップグレードしやすくするため、2の設計の多くを持ち込んでいます。</p>

<p><b class="speaker sagawa">佐川</b> この座談会のテーマはAngular2ですが、1.5もコンポーネント指向なので、1を触っている人は1.5にするといいんじゃないかな。2よりも手軽に触れるので。</p>

<p><img src="/wp-content/uploads/2016/04/ed5a59dd7394427507c9302e718ca5a0.jpg" alt="" width="600" height="374" class="aligncenter size-full wp-image-18728" srcset="/wp-content/uploads/2016/04/ed5a59dd7394427507c9302e718ca5a0.jpg 600w, /wp-content/uploads/2016/04/ed5a59dd7394427507c9302e718ca5a0-300x187.jpg 300w, /wp-content/uploads/2016/04/ed5a59dd7394427507c9302e718ca5a0-207x129.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p><small></p>

<blockquote>
  <p>※ ルーター…AngularJSなどのSPAフレームワークにおいて、UIの状態遷移を実現する仕組み。SPAの場合、UIの状態とURLをひも付けるのが重要な課題となるため、「URLのルーティング」を行うという意味から「ルーター」と呼ばれている。</p>
  
  <p>※ コンポーネントルーター…従来のAngularJSでは、UI状態とテンプレート（とそれに紐づくコントローラー）が紐付いていたが、Angular2ではコンポーネントがUI状態に対応するようになった。
  </small></p>
</blockquote>

<h2>TypeScriptはどうよ？</h2>

<p><b class="speaker siraisi">白石</b> Angular2では、TypeScript(※)がメインの開発言語になりましたね。</p>

<p><b class="speaker yosida">吉田</b> そうですね。<strong>JavaScript（ECMAScript 5）でも書けなくはないですが、ドキュメントが不完全だったりして、あまりよくサポートされているとは言えなそう</strong>です。</p>

<p><b class="speaker kanai">金井</b> TypeScriptに重きが置かれているのは、<a href="http://angularjs.blogspot.jp/2015_09_01_archive.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">以前行われた開発者向けのアンケート</a>結果を踏まえてのものだと思います。その時のアンケート結果では、TypeScriptの採用を望む声が一番大きかったように記憶しています（編集部注: 1位はTypeScript (45%)、2位はBabel (33%)、ES5は3位 (9%)）。</p>

<p><b class="speaker yosida">吉田</b> TypeScriptでコーディングすると、<strong>デコレーター (※)が使えるのはいい</strong>ですね。コードの見通しが非常に良くなります。あと、型があるおかげで安心感があります。手軽さはなくなっちゃいましたけどね。</p>

<p><b class="speaker hayasi">林</b> <strong>TypeScriptは型を強制はしないので、敷居はそこまで高くない</strong>んじゃないかな。JavaScriptのスーパーセットなので、JSのコードもそのまま動きますし。あと、<strong>Angular2のDependency Injection (※)が型をベースとしたものになっている</strong>のも、TypeScriptのおかげです。</p>

<p><img src="/wp-content/uploads/2016/04/56ad5bf56e9d4ce8f3077424b2e590bc.jpg" alt="" width="600" height="405" class="aligncenter size-full wp-image-18733" srcset="/wp-content/uploads/2016/04/56ad5bf56e9d4ce8f3077424b2e590bc.jpg 600w, /wp-content/uploads/2016/04/56ad5bf56e9d4ce8f3077424b2e590bc-300x203.jpg 300w, /wp-content/uploads/2016/04/56ad5bf56e9d4ce8f3077424b2e590bc-207x140.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p><b class="speaker sagawa">佐川</b> import文で、利用しているモジュールだけが取り込まれるのもとてもいいですね。ただ、<strong>型がある言語になるとエンタープライズ業界で喜ばれるかと思ったら、今のところ意外とそうでもない</strong>んですよね…。</p>

<p><b class="speaker kanai">金井</b> 変化が大きいからじゃない？</p>

<p><b class="speaker sagawa">佐川</b> そうかも。基本的に、「変化しないとかバージョンアップしない（できない）ってことが正義」っていう雰囲気がなきにしもあらず…な業界ので (笑)。</p>

<p><img src="/wp-content/uploads/2016/04/35ae39be10eecce294f29a595a89a6b2.jpg" alt="" width="600" height="403" class="aligncenter size-full wp-image-18729" srcset="/wp-content/uploads/2016/04/35ae39be10eecce294f29a595a89a6b2.jpg 600w, /wp-content/uploads/2016/04/35ae39be10eecce294f29a595a89a6b2-300x202.jpg 300w, /wp-content/uploads/2016/04/35ae39be10eecce294f29a595a89a6b2-207x139.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p><small></p>

<blockquote>
  <p>※ TypeScript…マイクロソフトが開発した言語。厳密な型付けを持つことで大規模開発にも対応しやすくなっているだけではなく、ECMAScriptの先進的な機能を数多く取り込んでいるという特徴を持つ。コンパイルした結果JavaScriptのコードが得られるという、「JavaScriptトランスパイラ」（もしくはaltJS）と呼ばれる言語の一つである。</p>
  
  <p>※ デコレーター…クラスやプロパティ、関数や仮引数などに付加的な情報を付与したり、前処理を行ったりすることができる仕組み。Java言語の「アノテーション」に近い記法を持つが、JavaScriptのデコレーターはシンプルなJavaScript関数に変換されるため、（TypeScriptなどのトランスパイラが変換した結果は）古いブラウザなどでも動作する。</p>
  
  <p>※ Dependency Injection…和訳すると「依存性注入」。依存するクラスのインスタンスを得る手段として、手続き内で<code>new</code>によって生成するのではなく、外部から「注入」されるように記述することで、クラス間の依存性を疎結合にし、テスタビリティを向上させることができる仕組み。Angular1から使えた仕組みではあるが、Angular2ではTypeScriptの型を利用して依存関係を指定できる。
  </small></p>
</blockquote>

<h2>Angular2のテンプレートはキモい？</h2>

<p><b class="speaker siraisi">白石</b> TypeScriptについては、エキスパートの皆さんも概ね好意的ですね。では、<strong>Angular2で刷新されたHTMLテンプレート</strong>についてはいかがでしょうか？</p>

<p><b class="speaker kanai">金井</b> <strong>キモい</strong>です(笑) 。でも、慣れるしかない。</p>

<p><b class="speaker hayasi">林</b> アスタリスクや括弧などの、記号の意味を把握するのに最初は少し苦労しますね (※)。</p>

<p><b class="speaker kanai">金井</b> 前は、React（のJSX）のことをキモいと思ってたんですが、肩を並べちゃいました。「<strong>お互いキモいよね</strong>」という感じで、仲良くしていきたい (笑)。</p>

<p><b class="speaker siraisi">白石</b> 個人的には、テンプレートをデコレーターに直接書く(※)のも、最初は抵抗ありました。</p>

<p><b class="speaker kanai">金井</b> ぼくはtemplateUrlにテンプレートのURL書く派(※)ですね。</p>

<p><b class="speaker hayasi">林</b> ぼくは小さいテンプレートはデコレータの中に、大きめのものは外部ファイルに出す、って感じで使い分けてます。</p>

<p><b class="speaker yosida">吉田</b> デコレータ内に書く場合でも、TypeScriptはES6のテンプレート文字列(※)を使えるのが嬉しいですね。式を埋め込んだり、改行できたりするのがいい。あと、コンポーネントのUIという話で言うと、<strong>CSSがコンポーネントごとにカプセル化される</strong>(※)のは最高です。</p>

<p><b class="speaker hayasi">林</b> そうそう、コンポーネントのカプセル化は嬉しいところです。<strong>Angular1のような、スコープの干渉が少なくなったのもすごくいい</strong>ところだと思います。まあ、1の時みたいな無茶はできなくなっちゃいましたけどね。スコープの親をどこまでも辿っていって…とか。</p>

<p><b class="speaker yosida">吉田</b> まあ、無茶をしたかったらRxJS (※) でやろうと思えば、結構できるんじゃないでしょうか (笑)。</p>

<p><b class="speaker sagawa">佐川</b> そういえばRxJSといえば、<a href="https://github.com/Reactive-Extensions/rx.angular.js" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">rx.angular.js</a>を使うと、Angular1でもRxJSが使えるようになります。ただ、サンプルコードを見ていたら<code>$scope.$apply</code>が入ってなくてちゃんと動かなかったので、修正してプルリク送っときました (笑)。</p>

<p><img src="/wp-content/uploads/2016/04/1d727b5001826c402d89ada2b37217e8.jpg" alt="" width="600" height="390" class="aligncenter size-full wp-image-18735" srcset="/wp-content/uploads/2016/04/1d727b5001826c402d89ada2b37217e8.jpg 600w, /wp-content/uploads/2016/04/1d727b5001826c402d89ada2b37217e8-300x195.jpg 300w, /wp-content/uploads/2016/04/1d727b5001826c402d89ada2b37217e8-207x135.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p><small></p>

<blockquote>
  <p>※ アスタリスクや括弧など…Angular2では、コンポーネントのタグ内に様々な記号を記述していくことになる。例えば、「<code>person.name</code>というモデルと双方向に紐付いたinput要素を<code>personName</code>という変数で参照できるようにする」と言った場合、<code>&lt;input [(ngModel)]="person.name" #personName&gt;</code>といった具合である。</p>
  
  <p>※ テンプレートをデコレーターに直接書く／templateUrlにテンプレートのURLを書く…コンポーネントのHTMLテンプレートは、<code>@Component({template="文字列"})</code>という形式で書くか、<code>@Component({templateUrl="URL"})</code>という形式で書くかを選択できる。</p>
  
  <p>※ ES6のテンプレート文字列…ES6では、式の埋め込みや改行を行えるテンプレート文字列がサポートされている。詳しくは<a href="https://html5experts.jp/takazudo/17396/" data-wpel-link="internal">こちらの記事</a>を参照のこと。</p>
  
  <p>※ CSSがコンポーネントごとにカプセル化される…Angular2のコンポーネントは、<code>@Component({styles=["CSS"]})</code>や<code>@Component({stylesUrl="URL"})</code>といった形式でCSSを指定できるが、こうして指定したスタイルはコンポーネント外に影響しない（カプセル化される）。Shadow DOM（もしくは属性を用いたエミュレート）によって実現されている。</p>
  
  <p>※ RxJS…リアクティブプログラミングを実現するライブラリ(<a href="https://github.com/ReactiveX/rxjs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">GitHub</a>)。Angular2では、HTTP通信を行うモジュールやイベント処理など、基礎的なAPIで広く採用されている。
  </small></p>
</blockquote>

<h2>Angular1からの移行</h2>

<p><b class="speaker siraisi">白石</b> Angular1をこれまで使っていた方は、Angular2にアップグレードできると伺いました。</p>

<p><b class="speaker hayasi">林</b> 私がちょうど今、1.4のシステムを2に上げようと取り組んでいるところです。順序立てて取り組むのが重要ですね。</p>

<p><b class="speaker siraisi">白石</b> どのような順序で取り組んでいるんでしょう？</p>

<p><b class="speaker hayasi">林</b> 私はまず、1.5にアップグレードしました。その後、Babel (※) からTypeScriptに移行しました。その後、ビュー周りとか、ディレクティブとかも全部コンポーネントに置き換えていきました。ここまでは割とすんなりいけます。</p>

<p>ただ、今取り組んでいるルーターの置き換えには少し苦労していますね。ui-routerからコンポーネントルーターに置き換えるところでは、明示的なアップグレードパスが用意されていないので。</p>

<p>でも、ここが終わればあとは2に合わせてテンプレートの記法を書き換えていくだけです。ng-upgradeっていうアップグレード用のモジュールも用意されている (※) ので、それを使って少しずつ置き換えていけます。</p>

<p><b class="speaker siraisi">白石</b> ちなみに、どれくらいの期間取り組んでらっしゃるんですか？いつ頃終わりそうですか？</p>

<p><b class="speaker hayasi">林</b> 始めたのは3月に入ってからですから、まだ1週間くらいです（インタビューしたのは3月9日）。3月21日に<a href="http://ngjapan.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ng-japan</a> (※) というイベントで発表があるので、なんとしてもそれまでには終わらせたいですね (笑)（※）。</p>

<p><img src="/wp-content/uploads/2016/04/97264892191164c4533341e74aef1572.jpg" alt="" width="600" height="375" class="aligncenter size-full wp-image-18731" srcset="/wp-content/uploads/2016/04/97264892191164c4533341e74aef1572.jpg 600w, /wp-content/uploads/2016/04/97264892191164c4533341e74aef1572-300x188.jpg 300w, /wp-content/uploads/2016/04/97264892191164c4533341e74aef1572-207x129.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<p><small></p>

<blockquote>
  <p>※ Babel…ECMAScriptの先進的な機能を今すぐ利用できるようにしてくれるJavaScriptトランスパイラ。</p>
  
  <p>※ ng-upgrade…Anguar1とAngular2の共存を実現し、2への移行を楽にしてくれるモジュール。Angular1/2どっちで書いても相互にやり取りできるよう仲介してくれる。具体的には、Angular1記法のserviceやcomponentをAngular2から呼び出したり、逆にAngular2のserviceやcomponentをAngular1から呼び出したりできるようにするもので、双方のダウングレード/アップグレード機能を提供する。</p>
  
  <p>※ ng-japan…残念ながらもう終了しているが、HTML5 Experts.jpでは現在、<a href="https://html5experts.jp/yusuke-naka/18596/" data-wpel-link="internal">「Angular2実践入門」に関するセッションレポート</a>は公開済み。今後もレポートはいくつか掲載予定。</p>
  
  <p>※ 「なんとしてもそれまでには終わらせたい」…「残念ながらng-japanまでには完了しませんでした！！！！」（林）
  </small></p>
</blockquote>

<h2>Angular2の学習コスト</h2>

<p><b class="speaker siraisi">白石</b> そろそろこの座談会も時間的に終わりに近づいてきていますが、最後に一つ気になっていることを聞かせてください。Angular2の学習コストはかなり高いのではないかと思うのですが、いかがでしょうか？</p>

<p><b class="speaker kanai">金井</b> 仰るとおりです。<strong>学習コストは跳ね上がっている</strong>と言っていいでしょう。</p>

<p><b class="speaker sagawa">佐川</b> TypeScriptも込みなので、教育に時間がかかるようになっちゃいましたね。とはいえ、<a href="https://angular.io/docs/ts/latest/quickstart.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Angular2のクイックスタート</a>とかは、余計なことを考えずに取り組めば割と簡単だと思いますが。</p>

<p><b class="speaker yosida">吉田</b> ただ、あのクイックスタート「5 minutes」とか書いてあるけど、<strong>絶対5分じゃ終わらない</strong>ですけどね。</p>

<p><b class="speaker sagawa">佐川</b> はい、あの内容で講義したら50分使いました(笑)</p>

<p><b class="speaker kanai">金井</b> Angular2を使いこなそうと思ったら、TypeScript（もしくはBabel）、<a href="https://github.com/systemjs/systemjs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">System.js</a> (※)や<a href="http://webpack.github.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Webpack</a> (※)などのモジュールバンドラー (※)、RxJSなどを一通り押さえる必要があります。でもまあ逆に考えれば、一旦覚えさえすればモダンなJavaScriptが書けるようになるわけで。</p>

<p><b class="speaker hayasi">林</b> ですね。<strong>モダンJavaScriptの学習セット</strong> だと思えば、楽しく学べるんじゃないでしょうか。</p>

<p><img src="/wp-content/uploads/2016/04/f22bbd9e628c147337441cccbc58c848.jpg" alt="" width="640" height="423" class="aligncenter size-full wp-image-18736" srcset="/wp-content/uploads/2016/04/f22bbd9e628c147337441cccbc58c848.jpg 640w, /wp-content/uploads/2016/04/f22bbd9e628c147337441cccbc58c848-300x198.jpg 300w, /wp-content/uploads/2016/04/f22bbd9e628c147337441cccbc58c848-207x137.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><small></p>

<blockquote>
  <p>※ モジュールバンドラー…JavaScriptでは、ECMAScriptのimport文やCommonJSの<code>require()</code>関数（Node.jsが採用している）などでモジュール間の依存関係を記述するのが主流になりつつあるが、そうした依存関係はブラウザが直接取り扱えるわけではないので、それらを解釈、処理するためのツールが必要になる。そうしたツールは、モジュールの依存グラフを最終的に一つのJavaScriptファイルにまとめ上げる（バンドルする）機能を備えていることも多いため、「バンドラー」と呼ばれる。</p>
  
  <p>※ <a href="https://github.com/systemjs/systemjs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">System.js</a>…Angular2のチュートリアルなどで採用されているモジュールバンドラー。使いはじめるまでの障壁が低い。</p>
  
  <p>※ <a href="http://webpack.github.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Webpack</a>…現在広く利用されているモジュールバンドラー。複雑だが多機能。</p>
</blockquote>

<p></small></p>

<h2>まとめ</h2>

<p><b class="speaker siraisi">白石</b> ではそろそろ、お時間も遅くなってまいりましたので、お開きにしたいと思います。皆様、一言ずつ頂いてもよろしいでしょうか？</p>

<p><b class="speaker sagawa">佐川</b> まずはとにかく触って欲しいですね。<strong>気持ちよく触れるフレームワークになっている</strong>ので、面白いのは間違いありません。</p>

<p><b class="speaker hayasi">林</b> <strong>1と比べると、ソースが整理されて綺麗に書ける</strong>ようになるので、特に大きいシステムの場合は嬉しいですね。フルスタックのフレームワークとして、正しい方向に向かっているんじゃないかと思っています。</p>

<p><b class="speaker yosida">吉田</b> 1.0が登場した頃に比べると、完全に世界は変わってしまっています。それくらいWeb技術の流れは速いですが、<strong>Angular2にしておけば、あと2,3年は古びないシステムが作れる</strong>んじゃないでしょうか。ただ個人的には、「バージョンアップ」って感覚ではないですね。完全に別物。Perlが、Perl6になって完全に別物になってしまったような感覚と似てるかもしれません。</p>

<p><b class="speaker siraisi">白石</b> Perlの事情は全く知らないのですが、そうなんですか？</p>

<p><b class="speaker yosida">吉田</b> はい。Perl6は、「Perl6っていう新しい言語」ですから (笑)。</p>

<p><b class="speaker kanai">金井</b> パフォーマンスや設計上の問題点など、1の悪かった部分がなくなりました。ハードルは確かに結構高いですが、<strong>モダンなJavaScriptにアジャストするという点では、とても良いフレームワーク</strong>だなと思っています。</p>

<p><b class="speaker siraisi">白石</b> 皆さん、本日は貴重なお話をお聞かせいただきありがとうございました。とても勉強になりました。</p>

<p><img src="/wp-content/uploads/2016/04/DSC02021.jpg" alt="" width="600" height="392" class="aligncenter size-full wp-image-18730" srcset="/wp-content/uploads/2016/04/DSC02021.jpg 600w, /wp-content/uploads/2016/04/DSC02021-300x196.jpg 300w, /wp-content/uploads/2016/04/DSC02021-207x135.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /><span style="font-size: 80%;">　　　▲今回は、<a href="https://toreta.in/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">株式会社トレタ</a>さんに対談会場のご協力をいただきました。素敵なオフィスでした！</span></p>
]]></content:encoded>
			</item>
		<item>
		<title>【βリリース記念】5分でわかる！Angular2のススメ</title>
		<link>/canidoweb/18001/</link>
		<pubDate>Fri, 25 Dec 2015 02:00:26 +0000</pubDate>
		<dc:creator><![CDATA[金井 健一]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[Angular2]]></category>
		<category><![CDATA[AngularJS]]></category>

		<guid isPermaLink="false">/?p=18001</guid>
		<description><![CDATA[2015年12月15日に、Angular v2.0.0-beta.0がリリースされました。Angular2の発表から実に1年です。まだβ版ではありますが、1つの区切りとして現状のAngular2についてお伝えしていきます...]]></description>
				<content:encoded><![CDATA[<p>2015年12月15日に、Angular v2.0.0-beta.0がリリースされました。Angular2の発表から実に1年です。まだβ版ではありますが、1つの区切りとして現状のAngular2についてお伝えしていきます。</p>

<p><img src="/wp-content/uploads/2015/12/FireShot-Pro-Screen-Capture-032-One-framework_-Angular-2-angular_io.png" alt="" width="640" height="364" class="aligncenter size-full wp-image-18012" srcset="/wp-content/uploads/2015/12/FireShot-Pro-Screen-Capture-032-One-framework_-Angular-2-angular_io.png 640w, /wp-content/uploads/2015/12/FireShot-Pro-Screen-Capture-032-One-framework_-Angular-2-angular_io-300x171.png 300w, /wp-content/uploads/2015/12/FireShot-Pro-Screen-Capture-032-One-framework_-Angular-2-angular_io-207x118.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>何が変わったのか</h2>

<p>以前から言われているとおり、かなり大きく変わっています。これまでのJavaScriptフレームワークでは<code>MVC</code>や<code>MVVM</code>と呼ばれるデザインパターンが多く採用されてきました。</p>

<p>しかし、<code>Web Components</code>の仕様策定が進んでいる今、この仕様と共存できるようなコンポーネント指向のフレームワークが求められてきています。そういった背景から、MVW(hatever)という思想で開発されていたAngular1に対し、Angular2はコンポーネント指向で設計されています。</p>

<p>Angular2は、以下のような特徴をもっています。</p>

<ul>
<li>処理速度・パフォーマンスの向上</li>
<li>よりシンプルに、わかりやすく</li>
<li>クロスプラットフォーム</li>
<li>Angular1からのシームレスなアップグレード</li>
<li>柔軟な開発</li>
<li>網羅的なルーティング</li>
<li>Dependency Injection（DI）</li>
<li>レガシーブラウザのサポート</li>
<li>アニメーション（開発中）</li>
<li>国際化 (Internationalization:I18N) とアクセシビリティ（開発中）</li>
</ul>

<p><a href="https://angular.io/features.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">angular.io &#8211; FEATURES &amp; BENEFITS より</a></p>

<p>これだけだと伝わりにくいので要約すると、</p>

<ul>
<li>Angular1での課題の解決</li>
<li><code>ES2015/ESNext</code>への対応</li>
<li><code>TypeScript</code>などのトランスパイラとの連携</li>
<li><code>Web Components</code>や<code>Polymer</code>との連携</li>
<li>AndroidやiOS対応</li>
<li>デスクトップアプリ対応</li>
<li>サーバサイドレンダリング対応</li>
</ul>

<p>などが挙げられます。</p>

<p>Angular1の良いところはそのままに、課題については改善していこうという姿勢です。その結果もあり、Angular1で問題となっていた<code>Dirty Checking</code>を解決したことや、サーバサイドレンダリングをおこなえるようになったことで、パフォーマンスが飛躍的にアップしました。Angular2開発当初にパフォーマンスの問題で一時取り止めになっていた双方向バインディングも現在では実装されています。</p>

<p>それに加えて、Angular2では、モバイルやデスクトップアプリでも快適に動作するよう考慮されています。すでに<a href="http://ionicframework.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic</a>や <a href="https://www.nativescript.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">NativeScript</a>で、ハイブリッドアプリやネイティブUIモバイルアプリを開発する際も、Angular2を利用することができるようになりました。</p>

<p>これらを見れば、多岐にわたる変更があるだろうことが想像できるでしょう。</p>

<p>Angular2が提供するAPIは一新されていて、Angular1との互換性はありません。しかし、Angular1のディレクティブの設定に似ているため、多少経験がある方であれば理解するのはさほど難しくはありません。</p>

<p></p><pre class="crayon-plain-tag">// コンポーネントを作成するサンプル
(function(app) {
  app.AppComponent = ng.core
    .Component({
      selector: 'my-app',
      template: '&lt;h1&gt;My First Angular 2 App&lt;/h1&gt;'
    })
    .Class({
      constructor: function() {}
    });
})(window.app || (window.app = {}));</pre><p></p>

<h2>弱点がなくなった Angular2</h2>

<p>他のフレームワークと比較すると、Angular1は入力フォームの多い、管理画面などの開発において圧倒的な強みがありました。双方向バインディングや強力なフォームバリデーション機能が備わっていたためです。</p>

<p>Angular2は、それらの機能を備えたままさらに強力になったといえます。管理画面だけでなく、モバイル環境やデスクトップアプリでも問題なく利用できるので、活躍する場が広がっていくでしょう。</p>

<p>サーバサイドレンダリングを利用すれば、SEOが必要なWEBサイトのフロントですら利用することができるようになります。
このように、苦手としていたことの改善によるパフォーマンスが向上したことで、今後は限定的なケースではなく、さまざまなケースで利用されることが期待できます。</p>

<p>他にも、開発する際の自由度があがったことも大きなメリットです。<code>ES5</code>で実装することもできますし、<code>ES2015</code>で実装することもできます。また<code>TypeScript</code>や<code>Babel</code>などのトランスパイラも組み合わせて開発することも可能になりました。特に、Angular2自身が<code>TypeScript</code>で実装されていることもあり、tsdファイルを作成する必要がなくなったことは、<code>TypeScript</code>ユーザにとって嬉しいことではないでしょうか。</p>

<h2>Angular2 のこれから</h2>

<p>現在、β版にはなり多少は落ち着いたのかなといった印象ですが、今後はAngularユーザやコミュニティによってさらにブラッシュアップされていくことと思います。まだまだドキュメントが少ないことが懸念されますが、これらはAngularの開発チームでも課題になっているので、時間とともに解決されていくでしょう。</p>

<p>最後に気になるv2.0.0のリリース時期について、あくまでも予想ではありますが、 2016/5/4〜6にかけて開催される <a href="http://www.ng-conf.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ng-conf</a>でv2.0.0をお披露目したいのではないかと推測しています。（もしかしたら間に合わないかも、ということもありますが&#8230;）</p>
]]></content:encoded>
			</item>
		<item>
		<title>AngularJSのControllerとScopeの基礎を学ぼう</title>
		<link>/canidoweb/16732/</link>
		<pubDate>Mon, 07 Sep 2015 01:00:30 +0000</pubDate>
		<dc:creator><![CDATA[金井 健一]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[AngularJS]]></category>

		<guid isPermaLink="false">/?p=16732</guid>
		<description><![CDATA[連載： 初心者から中級者まで、今注目のAngularJS徹底解説 (3)連載企画「AngularJS徹底解説」の第3回目は、ControllerとScopeの基礎について解説していきます。 AngularJS は MVW...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/angularjs-beginning/" class="series-224" title="初心者から中級者まで、今注目のAngularJS徹底解説" data-wpel-link="internal">初心者から中級者まで、今注目のAngularJS徹底解説</a> (3)</div><p>連載企画「AngularJS徹底解説」の第3回目は、ControllerとScopeの基礎について解説していきます。</p>

<h2>AngularJS は MVW(hatever)!!!</h2>

<p>AngularJSはMVC(Model-View-Controller)フレームワークと呼ばれることが多いですが、一部の開発者からは MVVM(Model-View-ViewModel)である、という声もあがっていて、ある時期に「一体どっちなんだ！？」という状態になりました。<br>
そこで、そういった経緯に対してAngularJSチームが、そこについての議論は本筋ではないとして、AngularJSはMVW(Model-View-Whatever)である、と明言しています。</p>

<p>今回解説するControllerは、このWhateverの役割にあたる機能です。実際に「Whatever = 何でもいい」とはいっても、&#8221;Controller&#8221;という名のとおり、MVCパターンとして見れば M-V-&#8220;Controller&#8221;にあたる機能ですので、その概念から外れることはありません。</p>

<h3>Controller の基本</h3>

<p>コントローラは以下のように記述します。他にもいくつか書き方があるのですが、今回はこの書き方で解説していきます。</p>

<p>まず、<code>myApp</code>アプリに<code>myCtrl</code>というコントローラを作成してみます。</p>

<p></p><pre class="crayon-plain-tag">angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope){
    // ここにコードを書いていく
  }]);</pre><p> 
以下の意味になります。
</p><pre class="crayon-plain-tag">...
  .controller.('コントローラ名', ['依存サービス', function(依存サービス){
    // ここにコードを書いていく
  }]);</pre><p></p>

<p>$scopeについては、 ビューにデータなどを渡したり、ビューから発生したイベントを監視するなど、ビューとのやり取りを行うことができる特別なオブジェクトです。（AngularJSでは直接DOM操作をすることは推奨されていないため、この$scopeを通じて行います。そのためほとんどのケースでコントローラを記述する際に定義することになります）</p>

<p>また複数依存するサービスが複数ある場合は、</p>

<p></p><pre class="crayon-plain-tag">...
  .controller.('コントローラ名', ['依存サービス1', '依存サービス2' ... , function(依存サービス1, 依存サービス2 ...){
    // ここにコードを書いていく
  }]);</pre><p> 
このように、配列に追加していく形で定義することができます。</p>

<p>先ほどの$scopeを利用して、ビューにモデルの値を引き渡します。<br>
テンプレート(HTML)箇所については、前回までに解説した通りです。</p>

<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html lang="ja" ng-app="myApp"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;Controller&lt;/title&gt;
  &lt;script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.min.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body ng-controller="myCtrl"&gt;
&lt;div&gt;筆者：{{myName}}&lt;/div&gt;

&lt;div&gt;
  エキスパートたち
  &lt;ul&gt;
    &lt;li ng-repeat="expert in expertList"&gt;{{expert}}&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;

&lt;div&gt;
  {{author.name}} ( twitter - {{author.twitter}} )
&lt;/div&gt;

&lt;script&gt;
angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope){
    // Model の初期化 ①
    var myName = 'can.i.do.web';
    var expertList = ['Shumpei', 'komasshu', 'yoshikawa_t'];
    var author = { name: 'きゃない', twitter: 'can_i_do_web' };
    // View にバインディング ②
    $scope.myName = myName;
    $scope.expertList = expertList;
    $scope.author = author;
  }]);
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p>$socpeを利用することで、ビューとやりとりすることができます。①で様々な形式のモデルの初期化、②で$scopeにプロパティを追加していくかたちで、 ビューに値を渡すことができます。<br>上記のほかにも複雑なオブジェクトや、関数などもバインドすることが可能です。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/09/sample1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/09/sample1-300x188.png" alt="sample1" width="300" height="188" class="aligncenter size-medium wp-image-16932" srcset="/wp-content/uploads/2015/09/sample1-300x188.png 300w, /wp-content/uploads/2015/09/sample1.png 640w, /wp-content/uploads/2015/09/sample1-207x129.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>Controller の適用範囲</h3>

<p>コントローラに限らず、ではあるのですが、AngularJSのディレクティブには適用範囲があります。<br>それは、そのディレクティブを定義したDOMの範囲とイコールです。</p>

<p></p><pre class="crayon-plain-tag">...
&lt;body&gt;
  &lt;div ng-controller="myCtrl"&gt;
    myCtrl内: {{name}} &lt;!-- ① --&gt;
  &lt;/div&gt;
  myCtrl外: {{name}} &lt;!-- ② --&gt;
&lt;script&gt;
angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope){
    $scope.name = 'can.i.do.web';
  }]);
&lt;/script&gt;
&lt;/body&gt;</pre><p></p>

<p>①のように<code>ng-controller="myCtrl"</code>と定義したdivタグの内部のみ、初期化された<code>name</code>を表示（取り扱う）することができます。
②は<code>ng-controller="myCtrl"</code>が定義されているdivタグの外側にあるため、<code>myCtrl</code>で定義した<code>name</code>にアクセスすることはできません。</p>

<p>このように、AngularJSではそれぞれの コントローラなどのディレクティブがお互いに干渉しないよう、適用される範囲のみでそれぞれの機能を果たします。そうすることで個々の機能が疎結合になり、保守性が高くなります。</p>

<h3>Controller の分割</h3>

<p>最初に挙げたサンプルのように画面全体に対して1つのControllerで運用していった場合、かなり多機能なコントローラになってしまいます。</p>

<p>例えば以下のケースだとどうなっているか見ていきましょう。</p>

<p></p><pre class="crayon-plain-tag">...
&lt;body ng-controller="myCtrl"&gt;
  &lt;header&gt;
    ... &lt;!-- header --&gt;
  &lt;/header&gt;
  &lt;main&gt;
    ... &lt;!-- main --&gt;
  &lt;/main&gt;
  &lt;footer&gt;
    ... &lt;!-- footer --&gt;
  &lt;/footer&gt;
&lt;script&gt;
angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope){
    // いろいろな機能のコード
  }]);
&lt;/script&gt;</pre><p></p>

<p>上記は<code>body</code>全体に対してのみのコントローラとなっています。ヘッダやフッタに関しては、一般的なアプリケーションでは共通的な機能と言えるでしょう。</p>

<p>それに対して上記の場合は、画面ごとにヘッダやフッタのデータやイベント等の振る舞いを毎回記述しなくてはなりません。先述したとおり、保守性を高めるために、 コントローラを分割すると良いでしょう。</p>

<p></p><pre class="crayon-plain-tag">...
&lt;body ng-controller="myCtrl"&gt;
  &lt;header ng-controller="headerCtrl"&gt;
    ... &lt;!-- header --&gt;
  &lt;/header&gt;
  &lt;main ng-controller="mainCtrl"&gt;
    ... &lt;!-- main --&gt;
  &lt;/main&gt;
  &lt;footer ng-controller="footerCtrl"&gt;
    ... &lt;!-- footer --&gt;
  &lt;/footer&gt;
&lt;script&gt;
angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope){
    // 画面全体に渡るコード
  }])
  .controller('headerCtrl', ['$scope', function($scope){
    // headerで必要な機能のコード
  }])
  .controller('mainCtrl', ['$scope', function($scope){
    // main で必要な機能のコード
  }])
  .controller('footerCtrl', ['$scope', function($scope){
    // footer で必要な機能のコード
  }]);
&lt;/script&gt;</pre><p></p>

<p>上記のようにコントローラを分割することで、機能の塊を小さくできます。<code>headerCtrl</code>や<code>footerCtrl</code>を切り分けることによって、アプリケーション全体で共通的なヘッダ、フッタの機能として利用することもできます。</p>

<p>また、メインコンテンツ内も機能的に煩雑になっているようであれば、さらにコントローラを分割して運用していくとよいでしょう。</p>

<h3>Scope</h3>

<p>スコープはビューとコントローラの間に立って、モデルをビューにバインディングしたり、ビューから発生したイベントを受け取って何かしら振る舞う、といった役割を持ちます。$scopeはそれを実際に行なうためのオブジェクトです。</p>

<p>スコープはDOMツリーと同様ツリー構造になっていて、<code>ng-app</code>を基点にDOMツリーに沿うように構成されます。そして<code>ng-controller</code> と記述している箇所で<code>ng-app</code>の子スコープとして新たなスコープが生成されています。Chrome DevToolsなどで該当するDOMを見てみると、<code>ng-scope</code>というクラス名が自動的に付与されているため、これを元に確認することができます。</p>

<p>最初のサンプルの場合、<code>ng-repeat</code>でも新しくスコープを生成するため、<code>expertList</code>の<code>&lt;li&gt;</code>にも同じように付与されています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/09/sample1-a1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/09/sample1-a1.png" alt="sample1-a" width="640" height="262" class="aligncenter size-full wp-image-16941" srcset="/wp-content/uploads/2015/09/sample1-a1.png 640w, /wp-content/uploads/2015/09/sample1-a1-300x123.png 300w, /wp-content/uploads/2015/09/sample1-a1-207x85.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>&#8220;Controllerの適用範囲&#8221; で解説した内容はこのスコープのツリー構造と関わっています。</p>

<p>以下の例を見てみましょう。</p>

<p></p><pre class="crayon-plain-tag">...
&lt;body ng-controller="myCtrl"&gt;
&lt;p&gt;①親スコープの'name' -&gt; {{name}}&lt;/p&gt;
&lt;p&gt;②親から見ようとした 'twitter' -&gt; {{twitter}}&lt;/p&gt;

  &lt;div ng-controller="myChildCtrl"&gt;
    &lt;p&gt;③myChildCtrl の 'name' -&gt; {{name}}&lt;/p&gt;
    &lt;p&gt;④myChildCtrl の 'twitter' -&gt; {{twitter}}&lt;/p&gt;
  &lt;/div&gt;

&lt;script&gt;
angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope){
    $scope.name = 'can.i.do.web';
  }])
  .controller('myChildCtrl', ['$scope', function($scope){
    $scope.twitter = 'きゃない';
  }]);
&lt;/script&gt;</pre><p></p>

<p>実行してみると、このように表示されます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/08/scope.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/scope-300x120.png" alt="scope" width="300" height="120" class="aligncenter size-medium wp-image-16745" srcset="/wp-content/uploads/2015/08/scope-300x120.png 300w, /wp-content/uploads/2015/08/scope.png 640w, /wp-content/uploads/2015/08/scope-207x82.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>スコープはツリー上に構成されるため、スコープの親子関係が生まれます。<br>
原則、子スコープから親スコープの値は参照できますが、その反対はできません。<br>
親である<code>myCtrl</code>で定義された、<code>name</code>というプロパティは、子である<code>myChildCtrl</code>の<code>name</code>として参照することができるため、表示されています。<br>
反対に、親スコープから子スコープのプロパティを参照できないため、②では何も表示されていません。</p>

<p>子スコープが新たに生成されるタイミングは、コントローラを定義する（ng-controller）など、一部の（ビルトイン）ディレクティブ などを定義した場合です。<br>
どのディレクティブ が新しくスコープを生成するかや、詳細な挙動については、AngularJS にかなり慣れている必要があります。<br>
しかし、はじめから完璧に理解する必要は全くありません。スコープという概念があり有効範囲や親子関係がある、ということを頭の片隅においておくと良いでしょう。</p>

<h4>Controller 間でデータ共有</h4>

<p>親子コントローラ間でデータを共有するためには以下のように記述しましょう。</p>

<p></p><pre class="crayon-plain-tag">...
&lt;body ng-controller="parentCtrl"&gt;

  &lt;div&gt;
    &lt;p&gt;親スコープ&lt;/p&gt;
    &lt;input type="text" ng-model="autor.name"&gt;
  &lt;/div&gt;

  &lt;div ng-controller="childCtrl"&gt;
    &lt;p&gt;子スコープ&lt;/p&gt;
    &lt;input type="text" ng-model="autor.name"&gt;
  &lt;/div&gt;

&lt;script&gt;
angular.module('myApp', [])
  .controller('parentCtrl', ['$scope', function($scope){
    // 親スコープ
    var author = {};
    author.name = 'Kanai';
    // bind
    $scope.autor = author;
  }])
  .controller('childCtrl', ['$scope', function($scope){
    // 子スコープ
  }]);
&lt;/script&gt;</pre><p></p>

<p>これまでのサンプルとの違いは、<code>$scope.autor.name</code>のように、直接<code>$scope.name</code>としていない点です。<br>
このように<code>$scope</code>とバインドしたいプロパティとの間に、オブジェクトを挟むことで、親子間でデータを共有することができます。</p>

<p>こうすることで、親子スコープのどちらの<code>input</code>でも、片方の入力値を書き換えれば、もう一方のデータも書き変わります。<br>
先述してきたサンプルの場合は、JavaScriptのプロトタイプチェーンの都合上、親子関係が破綻してしまいます。そのため、値を書き換えても相互にデータの書き換えを行なうことができません。<br>
データの書き換えや参照が思ったようにうまくいかない場合は、このことを覚えておくとよいかもしれません。</p>

<h3>まとめ</h3>

<p>今回は、ControllerとScopeの基礎を解説しました。<br>
特にスコープについては複雑な概念や実装になっていますので、いきなり全てを把握することは難しいです。AngularJS の経験を積むとともに徐々に学んでいきましょう。<br>
次回はサービスについての解説を予定しています。</p>
]]></content:encoded>
		
		<series:name><![CDATA[初心者から中級者まで、今注目のAngularJS徹底解説]]></series:name>
	</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のビッグウェーブに！─isomorphic tokyo meetupに参加してきた</title>
		<link>/shumpei-shiraishi/14895/</link>
		<pubDate>Fri, 01 May 2015 03:01:33 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[Fetcr]]></category>
		<category><![CDATA[Flatiron]]></category>
		<category><![CDATA[Flummox]]></category>
		<category><![CDATA[Flux]]></category>
		<category><![CDATA[Fluxible]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[Rendr]]></category>
		<category><![CDATA[Virtual DOM]]></category>
		<category><![CDATA[isomorphic]]></category>
		<category><![CDATA[アーキテクチャ]]></category>

		<guid isPermaLink="false">/?p=14895</guid>
		<description><![CDATA[連載： アプリケーションアーキテクチャ最前線 (1)おはようございます。編集長の白石です。 昨日（2015年4月30日）、isomorphic tokyo meetupに参加してきました。 というのも実は近々、HTML5...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/arch/" class="series-287" title="アプリケーションアーキテクチャ最前線" data-wpel-link="internal">アプリケーションアーキテクチャ最前線</a> (1)</div><p>おはようございます。編集長の白石です。</p>

<p>昨日（2015年4月30日）、<a href="http://nodejs.connpass.com/event/13363/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">isomorphic tokyo meetup</a>に参加してきました。</p>

<p>というのも実は近々、HTML5 Experts.jpでは「Webアプリケーション・アーキテクチャ」に関する特集を行う予定なのですが、そこでキーワードとして挙げられていたのが<strong>isomorphic。</strong>
サーバサイドとクライアントサイドでコードの共有を促進するのが主な目的の一つ、というところまでは理解できたのですが、実際のところ、アーキテクチャはどう変わるのか？
それを探りたいと思っていたところ、ちょうどよくイベントの開催がアナウンスされていたので、急遽取材させていただきました。</p>

<p>取材を快く受け入れてくださった、主催の<a href="https://twitter.com/yosuke_furukawa" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Yosuke FURUKAWA</a>さん、本当にありがとうございました。</p>

<p>この記事では、トップバッターで講演されていた<a href="https://twitter.com/koichik" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">koichik</a>さんの講演内容を中心にご紹介して、isomorphicに触れるきっかけとなる記事を目指します。</p>

<p>なお、本日の講演者の皆様による資料はこちらになります。</p>

<h2><a href="http://nodejs.connpass.com/event/13363/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">isomorphic tokyo meetup</a>の発表資料</h2>

<h3>「Isomorphic Survival Guide」(by <a href="https://twitter.com/koichik" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">koichik</a>)</h3>

<p><a class="embedly-card" href="https://speakerdeck.com/koichik/isomorphic-survival-guide" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Isomorphic Survival Guide</a>
<script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script></p>

<h3>「Isomorphic Web development with Scala &amp; Scala.js」(by <a href="https://twitter.com/TanUkkii007" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TanUkkii</a>)</h3>

<p><a class="embedly-card" href="http://www.slideshare.net/TanUkkii/isomorphic-web-development-with-scala-and-scalajs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Isomorphic web development with scala and scala.js</a>
<script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script></p>

<h3>「実践isomorphic (+ Electron)」(by <a href="https://twitter.com/mizchi" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">mizchi</a>)</h3>

<p><a class="embedly-card" href="https://speakerdeck.com/mizchi/shi-jian-isomorphic-plus-electron" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">実践Isomorphic(+ Electron)</a>
<script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script></p>

<h3>「Unified Interface on Isomorphic JavaScript」 (by <a href="https://twitter.com/axross_" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">axross</a>)</h3>

<p><a class="embedly-card" href="http://www.slideshare.net/axross/unified-interface-on-isomorphic-javascript" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Unified Interface on Isomorphic Javascript</a>
<script async src="//cdn.embedly.com/widgets/platform.js" charset="UTF-8"></script></p>

<h3>「やみくも isomorphic から抜け出すために足りてないもの」 (by <a href="http://twitter.com/Jxck_" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Jxck_</a>)</h3>

<p>※資料は後日公開だそうです。</p>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">今日のスライドがちょっと片手間すぎるので、公開はいろいろ直してからにします。 <a href="https://twitter.com/hashtag/isomorphic_meetup?src=hash" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">#isomorphic_meetup</a></p>&mdash; Jxck (@Jxck_) <a href="https://twitter.com/Jxck_/status/593792866075353088" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">2015, 4月 30</a></blockquote>

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<h2>koichikさんによる「Isomorphic Survival Guide」つまみ食いレポート</h2>

<p><a href="https://twitter.com/koichik" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">koichik</a>さんの「Isomorphic Survival Guide」は、まずIsomorphicという言葉の語源からでした。ギリシャ語で「同じ」という意味を表す「isos」という言葉と、「形」という意味を表す「morphe」という言葉を合わせたものだそうです。</p>

<div id="attachment_14897" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/01_isomorphic.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/01_isomorphic-640x480.jpg" alt="isomorphicの語源" width="640" height="480" class="size-large wp-image-14897" srcset="/wp-content/uploads/2015/05/01_isomorphic.jpg 640w, /wp-content/uploads/2015/05/01_isomorphic-300x225.jpg 300w, /wp-content/uploads/2015/05/01_isomorphic-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">isomorphicの語源</p></div>

<p>同じ成り立ちの言葉として、「metamorphic」や「polymorphic」があるとのこと。オブジェクト指向の世界で頻繁に用いられる「ポリモーフィック」という言葉が、isomorphicと同様「-morphic」で終わる単語だと気づいたのはこの時が初めてで、ハッとしました。</p>

<div id="attachment_14898" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/02_x-morphic.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/02_x-morphic-640x480.jpg" alt="&quot;-morphic&quot;で終わる言葉はほかにも" width="640" height="480" class="size-large wp-image-14898" srcset="/wp-content/uploads/2015/05/02_x-morphic.jpg 640w, /wp-content/uploads/2015/05/02_x-morphic-300x225.jpg 300w, /wp-content/uploads/2015/05/02_x-morphic-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">&#8220;-morphic&#8221;で終わる言葉はほかにも</p></div>

<p>で、isomorphicが語られるときには、「クライアントとサーバの間でのコード共有」や「フロントエンドとバックエンドの間でのコード共有」と紹介されることが多いですが、そもそもクライアントとフロントエンド、サーバとバックエンドが同じ意味の単語なのか、そこには人による解釈の違いもあれば、指している意味合いの違いもある、と指摘。</p>

<div id="attachment_14899" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/03_2x2.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/03_2x2-640x480.jpg" alt="クライアント・サーバという用語とフロントエンド・バックエンドという用語は同一ではない" width="640" height="480" class="size-large wp-image-14899" srcset="/wp-content/uploads/2015/05/03_2x2.jpg 640w, /wp-content/uploads/2015/05/03_2x2-300x225.jpg 300w, /wp-content/uploads/2015/05/03_2x2-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">クライアント・サーバという用語とフロントエンド・バックエンドという用語は同一ではない</p></div>

<p>この講演においては、クライアントとサーバはネットワークの「こちら側」と「あちら側」、フロントエンドとバックエンドは情報の入出力を「人間相手に行う」のか「ストレージ相手に行う」のか、という意味で取り扱う。</p>

<div id="attachment_14900" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/04_definition.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/04_definition-640x480.jpg" alt="本講演における用語の定義" width="640" height="480" class="size-large wp-image-14900" srcset="/wp-content/uploads/2015/05/04_definition.jpg 640w, /wp-content/uploads/2015/05/04_definition-300x225.jpg 300w, /wp-content/uploads/2015/05/04_definition-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">本講演における用語の定義</p></div>

<p>例えば90年ごろの「C/Sシステム」（いわゆる「クラサバ」）は、クライアントのWindowsマシン上で「人間向け」（フロントエンド）の処理も「ストレージ向け」（バックエンド）の処理も行われていました。このように、クライアント＝フロントエンド、サーバ＝バックエンドという対応関係は時代によって変遷してきており、J2EEが提唱した三層アーキテクチャやRIAなど、様々なアーキテクチャと製品が模索されてきました。</p>

<div id="attachment_14901" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/05_cs.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/05_cs-640x480.jpg" alt="C/Sシステム" width="640" height="480" class="size-large wp-image-14901" srcset="/wp-content/uploads/2015/05/05_cs.jpg 640w, /wp-content/uploads/2015/05/05_cs-300x225.jpg 300w, /wp-content/uploads/2015/05/05_cs-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">C/Sシステム</p></div>

<div id="attachment_14902" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/06_bbff.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/06_bbff-640x480.jpg" alt="フロントエンドとバックエンドの変遷" width="640" height="480" class="size-large wp-image-14902" srcset="/wp-content/uploads/2015/05/06_bbff.jpg 640w, /wp-content/uploads/2015/05/06_bbff-300x225.jpg 300w, /wp-content/uploads/2015/05/06_bbff-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">フロントエンドとバックエンドの変遷</p></div>

<h2>isomorphicに挑戦してきた様々なフレームワーク</h2>

<p>こうした中、少しでも開発から無駄をなくすために、クライアント／サーバ、フロントエンド／バックエンドの間でコードを共有できないかという可能性が探られてきました。</p>

<p>「isomorphic」という単語は、筆者としては最近になって聞くようになったのですが、実は2011年にリリースされた
「<a href="http://flatironjs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Flatiron</a>」というフレームワークが提唱した概念だったそうです。4年近くも前から使われていた用語だったのですね。</p>

<div id="attachment_14903" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/07_flatiron.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/07_flatiron-640x480.jpg" alt="Flatiron" width="640" height="480" class="size-large wp-image-14903" srcset="/wp-content/uploads/2015/05/07_flatiron.jpg 640w, /wp-content/uploads/2015/05/07_flatiron-300x225.jpg 300w, /wp-content/uploads/2015/05/07_flatiron-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Flatiron</p></div>

<p>しかし、Flatironはそれほど普及することなく現在に至ります。その後もYahoo!の「<a href="https://github.com/yahoo/mojito" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Mojito</a>」や、一時期大きな話題になった（今でもアクティブに開発されていますが）<a href="https://www.meteor.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Meteor</a>など、様々なプロダクトがisomorphicなアプローチにチャレンジしてきました。しかしこれらがあまり大きく普及しなかった要因は、「（プロダクト利用者にとっての）どんな課題を解くのか」が不明瞭だったり、ニッチ過ぎたり、先進的すぎたりしたことにあると指摘。</p>

<div id="attachment_14904" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/08_frameworks.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/08_frameworks-640x480.jpg" alt="どんな課題を解くのかが重要" width="640" height="480" class="size-large wp-image-14904" srcset="/wp-content/uploads/2015/05/08_frameworks.jpg 640w, /wp-content/uploads/2015/05/08_frameworks-300x225.jpg 300w, /wp-content/uploads/2015/05/08_frameworks-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">どんな課題を解くのかが重要</p></div>

<p>そんな中、<a href="https://www.airbnb.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Airbnb</a>が2013年に公開した「<a href="https://github.com/rendrjs/rendr" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Rendr</a>」
は、SPA (Single Page Application)の「初期表示が遅い」「SEOが弱い」という課題を解決すべく生み出されたもので、
かなり実用的でした。</p>

<div id="attachment_14905" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/09_rendr.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/09_rendr-640x480.jpg" alt="Rendr(Airbnb)" width="640" height="480" class="size-large wp-image-14905" srcset="/wp-content/uploads/2015/05/09_rendr.jpg 640w, /wp-content/uploads/2015/05/09_rendr-300x225.jpg 300w, /wp-content/uploads/2015/05/09_rendr-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Rendr(Airbnb)</p></div>

<p>RendrはBackbone.jsを拡張してisomorphicな環境を実現するものでした。Rendrは、以下のように様々な可能性を切り開きました。</p>

<ul>
<li>サーバサイドにおけるフロントエンドレイヤをJavaScriptで提供することで、クライアントとサーバのコード共有を実現しやすい</li>
<li>サーバサイドにおけるフロントエンドレイヤがセッション管理を行うことで、バックエンドのAPIをステートレスに保つことができる</li>
<li>サーバサイドにおけるフロントエンドレイヤがAPIゲートウェイとしてデータ変換を行ったり、様々なバックエンドAPIを組み合わせて
フロントエンドに提供する（オーケストレーション）ことを可能にする</li>
<li>上記のことから、（サーバサイドにおける）フロントエンドとバックエンドの疎結合な関係や、バックエンドの実装をJavaScript
に縛られず自由に開発できるようになり、ステートレスなマイクロサービスが協調して一つのサービスを作り上げるという構成を構築しやすい</li>
</ul>

<div id="attachment_14906" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/10_rendr-isomorphic.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/10_rendr-isomorphic-640x480.jpg" alt="Rendr的なIsomorphicの可能性" width="640" height="480" class="size-large wp-image-14906" srcset="/wp-content/uploads/2015/05/10_rendr-isomorphic.jpg 640w, /wp-content/uploads/2015/05/10_rendr-isomorphic-300x225.jpg 300w, /wp-content/uploads/2015/05/10_rendr-isomorphic-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Rendr的なIsomorphicの可能性</p></div>

<h2>Reactの波に乗れ！</h2>

<p>ですが、Rendrがリリースされた時期はAngularJSが人気を獲得した時期と重なっており、残念ながら大きな話題にはなりませんでした…。しかし今、「仮想DOM」というキャッチーなキーワードを引っさげ、<a href="https://facebook.github.io/react/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">React</a>が登場するや、非常な人気を博して今に至ります。</p>

<div id="attachment_14907" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/11_react.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/11_react-640x480.jpg" alt="Reactの仮想DOM" width="640" height="480" class="size-large wp-image-14907" srcset="/wp-content/uploads/2015/05/11_react.jpg 640w, /wp-content/uploads/2015/05/11_react-300x225.jpg 300w, /wp-content/uploads/2015/05/11_react-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Reactの仮想DOM</p></div>

<p>しかしReactはあくまでビューだけに特化したライブラリ。アプリケーションアーキテクチャとしては、Facebookが
「<a href="https://github.com/facebook/flux" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Flux</a>」を提唱していますが、公式な実装が提供されたのはFluxの一部分
のみであったため、独自実装が乱立する事態となっています。</p>

<div id="attachment_14908" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/12_flux.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/12_flux-640x480.jpg" alt="Flux" width="640" height="480" class="size-large wp-image-14908" srcset="/wp-content/uploads/2015/05/12_flux.jpg 640w, /wp-content/uploads/2015/05/12_flux-300x225.jpg 300w, /wp-content/uploads/2015/05/12_flux-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Flux</p></div>

<p>Fluxを用いたアプリの基本的な構成は以下のようになります。
フロントエンド部分に限ってみると、処理の流れが綺麗に一方向（unidirectional）になっているのがわかります。</p>

<div id="attachment_14909" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/13_fluxapp.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/13_fluxapp-640x480.jpg" alt="Flux的アプリの基本要素" width="640" height="480" class="size-large wp-image-14909" srcset="/wp-content/uploads/2015/05/13_fluxapp.jpg 640w, /wp-content/uploads/2015/05/13_fluxapp-300x225.jpg 300w, /wp-content/uploads/2015/05/13_fluxapp-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Flux的アプリの基本要素</p></div>

<p>そして何よりReactが期待されているのは、仮想DOMの仕組みを応用したisomorphicなアーキテクチャ。クライアントでは仮想DOMを実際のDOMツリーに変換しますが、サーバサイドでは仮想DOMからHTML文字列を出力するようにできるので、クライアントとサーバのどちらでも同様のコードが実行できるわけです。</p>

<p>Reactに関係するisomorphicなライブラリには、以下の様なものがあります。</p>

<div id="attachment_14910" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/14_react_isomorphic.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/14_react_isomorphic-640x480.jpg" alt="Reactに関係した、Isomorphicなライブラリ" width="640" height="480" class="size-large wp-image-14910" srcset="/wp-content/uploads/2015/05/14_react_isomorphic.jpg 640w, /wp-content/uploads/2015/05/14_react_isomorphic-300x225.jpg 300w, /wp-content/uploads/2015/05/14_react_isomorphic-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Reactに関係した、Isomorphicなライブラリ</p></div>

<p><a href="https://github.com/acdlite/flummox/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Flummox</a>も期待のライブラリ。</p>

<div id="attachment_14911" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/15_flummox.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/15_flummox-640x480.jpg" alt="Flummox" width="640" height="480" class="size-large wp-image-14911" srcset="/wp-content/uploads/2015/05/15_flummox.jpg 640w, /wp-content/uploads/2015/05/15_flummox-300x225.jpg 300w, /wp-content/uploads/2015/05/15_flummox-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Flummox</p></div>

<p>Yahoo!が開発中の<a href="https://github.com/yahoo/fluxible" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Fluxible</a>は、比較的重量級なアプローチの、isomorphicなFluxアプリケーションコンテナ。</p>

<div id="attachment_14912" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/16_fluxible.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/16_fluxible-640x480.jpg" alt="Fluxible" width="640" height="480" class="size-large wp-image-14912" srcset="/wp-content/uploads/2015/05/16_fluxible.jpg 640w, /wp-content/uploads/2015/05/16_fluxible-300x225.jpg 300w, /wp-content/uploads/2015/05/16_fluxible-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Fluxible</p></div>

<p>Fluxibleが使用する「<a href="https://github.com/yahoo/fetchr" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Fetchr</a>」は、バックエンド（の窓口となるWeb API）へのアクセスを、クライアントサイドとサーバサイドで同様のコードを用いることを実現します。正しくセットアップしていれば、Fluxアプリケーションのisomorphic化を促進できると期待されています。</p>

<div id="attachment_14913" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/17_fetchr.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/17_fetchr-640x480.jpg" alt="Fetchr" width="640" height="480" class="size-large wp-image-14913" srcset="/wp-content/uploads/2015/05/17_fetchr.jpg 640w, /wp-content/uploads/2015/05/17_fetchr-300x225.jpg 300w, /wp-content/uploads/2015/05/17_fetchr-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Fetchr</p></div>

<h2>まとめ</h2>

<p>isomorphicなアーキテクチャは長い間模索されていましたが、これまでいまいち波に乗り切れていませんでした。しかし今はReactが非常に人気を博し、isomorphicなアーキテクチャの実現に対して、多くの人々が注力しています。</p>

<p>マイクロサービスとの相性も非常に良いと考えられ、今後大きな潮流になっていくのは間違いないでしょう。</p>

<div id="attachment_14914" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/05/18_matome.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/05/18_matome-640x480.jpg" alt="まとめ" width="640" height="480" class="size-large wp-image-14914" srcset="/wp-content/uploads/2015/05/18_matome.jpg 640w, /wp-content/uploads/2015/05/18_matome-300x225.jpg 300w, /wp-content/uploads/2015/05/18_matome-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">まとめ</p></div>

<p>Reactの波に乗り遅れるな！</p>
]]></content:encoded>
		
		<series:name><![CDATA[アプリケーションアーキテクチャ最前線]]></series:name>
	</item>
		<item>
		<title>「NewRouter」という名前を付けてしまってゴメンナサイ…Angular開発者が生で答えるQ&#038;Aセッション─ng-japan 2015</title>
		<link>/albatrosary/14233/</link>
		<pubDate>Fri, 10 Apr 2015 03:00:31 +0000</pubDate>
		<dc:creator><![CDATA[佐川 夫美雄]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[AngularJS]]></category>

		<guid isPermaLink="false">/?p=14233</guid>
		<description><![CDATA[連載： ng-japan 2015 特集 (6)この記事は、Angularをテーマとした日本初のカンファレンス 「ng-japan」のイベントレポート（第6回目）です。ng-japan特集最後は懇親会でのQ&#38;Aの...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/ngjapa2015/" class="series-258" title="ng-japan 2015 特集" data-wpel-link="internal">ng-japan 2015 特集</a> (6)</div><p>この記事は、Angularをテーマとした日本初のカンファレンス 「<a href="http://ngjapan.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ng-japan</a>」のイベントレポート（第6回目）です。ng-japan特集最後は懇親会でのQ&amp;Aの模様をレポートします。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/04/16880968991_bb477b9a39_z.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/16880968991_bb477b9a39_z.jpg" alt="16880968991_bb477b9a39_z" width="640" height="427" class="aligncenter size-full wp-image-14234" srcset="/wp-content/uploads/2015/04/16880968991_bb477b9a39_z.jpg 640w, /wp-content/uploads/2015/04/16880968991_bb477b9a39_z-300x200.jpg 300w, /wp-content/uploads/2015/04/16880968991_bb477b9a39_z-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h1>AngularカンファレンスQ&amp;A</h1>

<h3>Q1. Angular 2を開発するに当たって、React.jsのアーキテクチャや考え方から影響を受けていますか？</h3>

<p>一定の影響はありました。よく聞かれる質問としては「Virtual DOMについて」ですが、我々はこのVirtual DOMがパフォーマンスを上げるために必ずしも必要となるものではないと考えています。それよりも「unidirectional data flow」という考え方のほうが役に立つのではないかと考えています。</p>

<p>プレゼンテーションの中でも「Immutable Infrastructure」については触れましたが、これについてはReactのチームともディスカッションを始めているところ。この分野についてはReactチームとAngularチームのコラボで行っていけるのではないかと考えています。</p>

<h3>Q2. GoogleのプロダクトでAngularはどのぐらい利用されていますか？</h3>

<p>Googleプロダクトの約2,000のアプリケーションで、Angularを使っています。特にGoogleが提供するクラウドでは、ほとんどのUIがAngularで書かれています。AngularチームというのはGoogle内でもいろいろな組織が存在していますが、その中に広告のグループであるAdsのチームがあり、ここでもAngularが使われています。その他にもGoogle内部だけで使われるような、内部プロセス用のアプリケーションについてもAngularが利用されています。</p>

<p>すべてのアプリケーションがAngular 2に移行するとは考えていませんが、Angular 2を使った方が簡単ものもありAngular 2を使う価値があるものについては移行をします。</p>

<h3>Q3. Angular 1系のサポートはいつまで行っていきますか？</h3>

<p>一時期Angular 1のサポートはいつまでで、Angular 2はいつからといった区切りを設定する予定でした。例えば、Angular 1のサポートを2016年末で終わりますと言って、Angular 2が2016年末に出てきたら、まったく移行の期間がなくなります。プレゼンテーションでも様々なお話をしたようないろいろなシグナルを見て今開発をしている人は、自分の位置がどのあたりにいて、今後どうなるのかを把握する必要があります。そして移行期間が作れるように、段階的に終了していくというのが正しい方向ではないかと考えています。</p>

<p>そして、GoogleだけがAngularに投資を行っている企業ではなく、Googleの外にもコアなチームメンバーがいて、彼らは彼らでAngularの開発にあたっています。なので我々としてもサポートをしっかりしていくということが重要でありオープンソースにとっても重要だと考えています。とは言うもののAngular 2を魅力的なものにし、しかもマイグレーションし易いものにし、誰もがAngular 2に移行した利用したいといった素晴らしいものに創りあげたいと考えています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/04/16261977763_ed8d764c2b_z.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/16261977763_ed8d764c2b_z.jpg" alt="16261977763_ed8d764c2b_z" width="640" height="427" class="aligncenter size-full wp-image-14236" srcset="/wp-content/uploads/2015/04/16261977763_ed8d764c2b_z.jpg 640w, /wp-content/uploads/2015/04/16261977763_ed8d764c2b_z-300x200.jpg 300w, /wp-content/uploads/2015/04/16261977763_ed8d764c2b_z-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h3>Q4. Angular 2の新しい機能に対してServiceとかFilterとか変な名前を付けてないか確認したい</h3>

<p>まだ名前の付け方が得意じゃないけど、なるべく混乱のないような名前をつけていきます。でも、もう既に新しいRouterに対して、「NewRouter」という名前を付けてしまってゴメンナサイ。</p>

<h3>Q5. Angularで検討されている機能で「Component Helper」というのがあるようですが、Angular1.4でリリースされる予定はありますか？</h3>

<p>他のコンポーネントとの兼ね合い、Angular 2の機能の一部をAngular1.4に入れていることもあり、もしかするとAngular1.5でリリースされるかもしれません。十分な時間をかけて検討していきたいと考えています。</p>

<p>このAPIというのはベストプラクティスとなっていくものです。「Component Helper」の仕様を一旦決めてしまうと後になって開発者が変えていくことは大変な労力が必要になるため、じっくり考える時間を設ける。「Component Helper」はAngular1.5に入れることを検討しています。</p>

<h3>Q6. New RouterでControllerを指定するようになっていますが、Component Directiveのようなものを指定するようにはならないでしょうか？</h3>

<p>我々がしようとしていることは、まさにそういったComponentを指定するということです。しかし、まだAngular 1系ではComponentを使うことはできない。いまはどうすれば、Angular 1とAngular 2とで整合性が保たれるか、Componentを導入できるかを検討しています。</p>

<h3>Q7. Angular 2でEvent Emitterの仕組みは導入されますか？</h3>

<p>Event Emitterの機能は、Angular 2ではありません。しかし、それに変わる別のやり方が提供されます。Angular 2では各パーツ間のコミュニケーションのやり方が変わっていきます。</p>

<p>その変わりに使えるものが2種類あります。</p>

<ul>
<li>DOM Event</li>
<li>サードパティ・ライブラリ</li>
</ul>

<p>この変更に対してどこにアドバンテージがあるのかというと、いろいろなケースを考えると今のAngularイベントを使っていった場合、さまざまなところでタイポが発生し、イベントの名前が間違ってしまうことがあります。するとイベント名が有効でなく一体何が起こったのが開発者がわからないという状況になりますので、問題を解決するために「Event Injection」を入れました。そうすることでダイレクトにイベントが伝わるようになります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/04/16674642047_3cb1b85970_z.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/16674642047_3cb1b85970_z.jpg" alt="16674642047_3cb1b85970_z" width="640" height="427" class="aligncenter size-full wp-image-14235" srcset="/wp-content/uploads/2015/04/16674642047_3cb1b85970_z.jpg 640w, /wp-content/uploads/2015/04/16674642047_3cb1b85970_z-300x200.jpg 300w, /wp-content/uploads/2015/04/16674642047_3cb1b85970_z-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h1>最後に（編集後記）</h1>

<p>ng-japanの様子を余すことなく書き下ろしましたが、いかがだったでしょうか？</p>

<p>Angular1.4の内容やNewRouterの機能、Angular 2に関すること、Angular 1からAngular 2へのマイグレーションなど盛りだくさんの内容だったと思います。Angularはあまり大規模なアプリケーションを作るのには不適という話もありますが、Angularチームが目指すところは規模に関わらず作りやすく、よりメンテナンスビリティの良いフレームワークを目指しているのではないかと思います。</p>

<p>AngularはGoogle社の閉じた世界観で作られているのではなく、Google社外のコミッターとの連携やReactチームとのコラボレーションもあり健全なオープンソースの道を歩んでいるのではないかと考えてます。しかも我々がAngularと関わりたいと思えばGitHubでissueを書くこともpull requestも送ることもできます。より関わることで、Angularが我々開発者にとって良いものになるのではと思います。</p>

<p>そのための一歩としてまずは、Angularを「触ってみる」ということも重要だと思います。「AngularJS Japan User Group」では各地で初心者向けハンズオンや、中上級者向けのハッカソン、ナイトセミナーも実施しておりますので、機会がありましたら足を運んでいただけたら幸いです。</p>

<p>最後に多くの方に来場いただき、感謝するとともに、多くのスポンサー様にご協力いただききました。この場をお借りし御礼申し上げます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/04/3bcdd72fb8d51ac61624d195f02dabd4.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/04/3bcdd72fb8d51ac61624d195f02dabd4.png" alt="スクリーンショット 2015-04-02 13.44.25" width="640" height="344" class="aligncenter size-full wp-image-14239" srcset="/wp-content/uploads/2015/04/3bcdd72fb8d51ac61624d195f02dabd4.png 640w, /wp-content/uploads/2015/04/3bcdd72fb8d51ac61624d195f02dabd4-300x161.png 300w, /wp-content/uploads/2015/04/3bcdd72fb8d51ac61624d195f02dabd4-207x111.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h1>セッション動画</h1>

<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/QzyUePqt4RM" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>
</div>
]]></content:encoded>
		
		<series:name><![CDATA[ng-japan 2015 特集]]></series:name>
	</item>
		<item>
		<title>噂のAngular 2をのぞき見る！ーng-japan 2015</title>
		<link>/albatrosary/13980/</link>
		<pubDate>Fri, 03 Apr 2015 00:00:53 +0000</pubDate>
		<dc:creator><![CDATA[佐川 夫美雄]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[AngularJS]]></category>

		<guid isPermaLink="false">/?p=13980</guid>
		<description><![CDATA[連載： ng-japan 2015 特集 (5)この記事は、Angularをテーマとした日本初のカンファレンス 「ng-japan」のイベントレポート（第5回目）です。 はじめに Angular 2の発表があり、大きく様...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/ngjapa2015/" class="series-258" title="ng-japan 2015 特集" data-wpel-link="internal">ng-japan 2015 特集</a> (5)</div><p>この記事は、Angularをテーマとした日本初のカンファレンス 「<a href="http://ngjapan.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ng-japan</a>」のイベントレポート（第5回目）です。</p>

<h1>はじめに</h1>

<p>Angular 2の発表があり、大きく様変わりするのではないかと懸念され、話題にもなりました。そして、AtScriptからTypeScriptへの変更など、話題にことかかないAngular 2ですが、彼らがなぜ、そのような変更を行っているのかが理解できるセッションとなりました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/03/2565c2726d9ebf968ae5399b387f34cc.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/03/2565c2726d9ebf968ae5399b387f34cc.png" alt="スクリーンショット 2015-03-25 17.30.33" width="640" height="427" class="alignnone size-full wp-image-13982" /></a></p>

<h1>Angular 2 &#8211; Igor Minar</h1>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/03/16694579000_e362bfda34_z.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/03/16694579000_e362bfda34_z.jpg" alt="16694579000_e362bfda34_z" width="640" height="427" class="alignnone size-full wp-image-13981" srcset="/wp-content/uploads/2015/03/16694579000_e362bfda34_z.jpg 640w, /wp-content/uploads/2015/03/16694579000_e362bfda34_z-300x200.jpg 300w, /wp-content/uploads/2015/03/16694579000_e362bfda34_z-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Angularは、私たち開発者のWebアプリ開発の手法を変え、生産性を向上してくれました。今度は我々のニーズに合わせて、Angularが変化をする番です。このセッションでは、何が変わり、なぜそのような変更が必要なのかをお話します。</p>

<p>まずは、Angular 2の3つのポイントについて。</p>

<ul>
<li>なぜAngular 2を作ることにしたのか</li>
<li>Angular 2はどういうものにあるのか</li>
<li>いつ出てくるか</li>
</ul>

<h1>なぜAngular 2を作ることにしたのか</h1>

<p>5年前にAngular 1の開発を始めたわけですが、これはWebアプリケーションの生産制を上げるために始めました。自分だちだけで閉鎖的に作るのではなく、様々な人にも見てもらいので、オープンソースにしました。その結果、多くの人に気に入ってもらえたと思います。そして気に入ったということだけではなく、実際に使い、コントリビューションしてくれました。</p>

<p>実際、世の中にどのくらいAngularが使われているかはよくわかりませんが、類推できる統計値はいくつかあります。例えば、今回のカンファレンスがほぼ満席になっているということが挙げられますね。とても嬉しいことです。そして毎月100万の開発者が、Angularについて学ぼうとしサイトにやってきます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/03/193c9f76f1d9a4efb82a03f415c18f81.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/03/193c9f76f1d9a4efb82a03f415c18f81.png" alt="スクリーンショット 2015-03-25 17.33.13" width="640" height="427" class="alignnone size-full wp-image-13983" /></a></p>

<p>Googleの外の世界で、Angularがどう使われているのか計り知ることは難しいですが、Googleの中ではヘビーに使っています。現在Googleの中では2,000のアプリケーションが構築されています。このような数字が何をもの語っているかというと、多くの人がAngularを信頼されているということです。しかし、信頼されているということは、責任が増すとも言えます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/03/c3ca979bb08fd7688ffc36025f7a9077.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/03/c3ca979bb08fd7688ffc36025f7a9077.png" alt="スクリーンショット 2015-03-25 17.33.23" width="640" height="427" class="alignnone size-full wp-image-13984" /></a></p>

<p>5年間で徐々にAngularを育ててきた中で、次の段階ではもっとよりよいものにしたいと考え、Angular 2を作ることにしました。Angular 2がどういうものになるのかが気になるところだと思いますし、指針は重要かと思います。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/03/8cc83ed56b8d2f3c575dd6c901cbe97f.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/03/8cc83ed56b8d2f3c575dd6c901cbe97f.png" alt="スクリーンショット 2015-03-25 17.33.44" width="640" height="427" class="alignnone size-full wp-image-13985" /></a></p>

<p>Angularを、よりシンプルな一貫性のあるものにしたいと考えています。なぜそれが実現できたかというと、どう使われて、どう開発されてきたかわかっているので、どう最適化すればいいのかも見えてきたからです。そしてAngularを気にいっている人からは、とても柔軟性があるからと言われています。こうした柔軟性も、Angular 2に盛り込みたいと考えています。</p>

<p>私たちがAngular 1で経験できていなかった部分として、パフォーマンスが挙げられます。より大きなプロジェクトを行っているうちに、パフォーマンスが重要であることに気づきました。そして、最後の要素が生産性の向上になりますが、Angular 2でも生産性の向上を行っていきます。</p>

<h1>Angular 1とAngular 2は似たようなものにあるか？</h1>

<p>APIとシンタックスは異なる部分は多くありますが、Angularの中に入れば基本的な概念は似たようなものが多くあります。Angular 1で好んで使ってくれたData Bindingなどは、Angular 2でも利用することができます。</p>

<p>Angular 2は、より使い勝手がよくシンプルにし、よりパワフルにしました。そして新しい強力な機能を追加しました。</p>

<ul>
<li>Viewports</li>
<li>New languages</li>
<li>Web Components</li>
<li>New template syntax</li>
<li>Unidirectional data flow</li>
<li>Ultra-fast change detection</li>
</ul>

<h1>Productivity</h1>

<p>Angular 2の中で盛り込んでいくテーマについてもいくつかありますが、その中で2つ話をします。</p>

<ul>
<li>生産性向上</li>
<li>パフォーマンス向上</li>
</ul>

<p>Angular 2においては、Angular 1のさらにその先をいくことを考え、それがtoolsを活用することができるということです。いま提案された、開発が終わってない、ブラウザでも実装されていないものに対しても、コードを書くことができるということです。そして開発者にとって役に立つこととして、タイプミスを防ぐことをしています。この新しいテンプレートシステムによってエラーやタイプミスがないかを抽出することができます。TypeScriptのチームとパートナーシップを組むことでそれを進めることができました。</p>

<p>TypeScriptを利用する重要なことの一つは、ECMAScript 6でも使うことができるようになることです。つまりTypeScriptをオプションとして、使うことができます。異なるチームに分散した大きなプロジェクトのときに、コントラクトを表すことができます。</p>

<p>もう一つTypeScript 1.5に含まれることにアノテーションがあります。アノテーションのお陰でコードを書く量を減らすことができます。これらの機能を標準化しJavaScriptに入れていくことを考えています。ChromeのV8チームやTypeScriptのチーム、その他のチームと連携しています。</p>

<p>将来的にはこれら機能がJavaScriptの中に含まれていくと思います。そういうことになると将来的には変換ということが必要ではなくなります。もちろんこれらは長く時間がかかるものですが、時間をかけてやっていくことには意義があると思います。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/03/472f9edd9bba6254906b67ad1ad06cbf.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/03/472f9edd9bba6254906b67ad1ad06cbf.png" alt="スクリーンショット 2015-03-25 17.34.08" width="640" height="427" class="alignnone size-full wp-image-13986" /></a></p>

<p>Angular 2はTypeScriptが使われていますが、一般の開発者がTypeScriptを使わないといけないのかという疑問があるかと思います。答えとしては自由に選択することができます。みなさんが自由にどの言語を使って、Angularアプリケーションを書くか、ECMAScript 5やECMAScript 6などどれを使ってもいいです。ただこうしたアプリケーションのツールを使いたいときは、TypeScriptを使うのがよいと思います。</p>

<h1>標準化</h1>

<p>言語の拡張と標準の話をしてきました。しかし、このAngular 2の大きなテーマとしては、標準化が好きだということがあります。Angular 1を作り始めた頃は、まだ使えないようなAPIを持ってきて、Angular 2の中に盛り込みました。よい例としては、Shadow DOM、Templateエレメントなどを使っています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/03/c9a5352b684443b8c188bbdf592fb514.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/03/c9a5352b684443b8c188bbdf592fb514.png" alt="スクリーンショット 2015-03-25 17.41.17" width="640" height="427" class="alignnone size-full wp-image-13987" /></a></p>

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

<p>Angular 1.3のときに、パフォーマンスの改善を試みたというのがわかると思います。パフォーマンスを語るときに、難しいのは速いというのはどういうことなのかという定義です。この答えとして、ツールを作りました。パフォーマンスを信頼性の高いものにするためBenchmarksというのを作りました。</p>

<p>一連のベンチマークテストとして、世の中でやっているいろいろなベンチマークを行いました。その一つがDeep Treeです。Deep Treeでは深く複雑にネスティングしているものをベンチマークすることができます。結果的にAngularでは複雑な画面に対して、どのくらいパフォーマンスがあるのかを知ることができます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/03/174ba8a6d1e5426757e573e156d25597.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/03/174ba8a6d1e5426757e573e156d25597.png" alt="スクリーンショット 2015-03-25 17.34.30" width="640" height="427" class="alignnone size-full wp-image-13988" /></a></p>

<p>Angularが速いのか遅いのかを知るために、ベースマークを作りました。それにはJavaScriptをAngularを使わずに作り、様々な工夫してベースマークを作りました。ポイントは、とにかく速く走るというプログラムなので通常書くようなロジックではありません。同じベンチマークでAnguler 1を作りました。</p>

<p>このベンチマークでは、ベースラインと比べると8倍時間がかかります。しかし、他に出ているソリューションとでは、ほとんど変わらないものになっています。もっと改善できるというはずだということで、Angular 2で試した結果としては3倍時間になりました、もっと速くすることができると考え、結果としては改善することができました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/03/a9be98635c597ac79f71185a50f1250a.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/03/a9be98635c597ac79f71185a50f1250a.png" alt="スクリーンショット 2015-03-25 17.34.39" width="640" height="427" class="alignnone size-full wp-image-13989" /></a></p>

<p>Angualar 2の中にはView Cacheがあり、DOMエレメントを再利用することができ、この機能を使うことでパフォーマンスを上げていくことができます。</p>

<p>特にナビゲーションの中で2つのViewを行ったり来たりする場合、高い効果がありました。もちろんパフォーマンスについて注目しましたが、ガベージコレクションも気になるところです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/03/927ca1ea1bd4285d53a639ddbfdc7454.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/03/927ca1ea1bd4285d53a639ddbfdc7454.png" alt="スクリーンショット 2015-03-25 17.34.53" width="640" height="427" class="alignnone size-full wp-image-13990" /></a></p>

<p>アプリケーションの様々な操作によってメモリーに関する事象が異なりますが、モバイル・アプリケーションのようなメモリーに制限のあるものについてはいろいろと効果することがあります。パフォーマンスというのは速度だけが重要なのではなく様々な要素で出てきます。一つパフォーマンスの中で注目しているのが、変更検知を取り入れた時に、どのくらい影響があるのかに興味がありました。</p>

<p>幸いなことに、Angular 2では柔軟な変更検知ができます。変更不可能なデータ構造がエキサイティングなのはなぜかというと、絶対に変わることがないとわかっていますので、変更検知の中で活用していくことになります。いくつかのシナリをの中で、使っていくことができます。バーチャルスクローリングが、それにあたります。</p>

<p>Angular 1の場合には変更検知を行っていくための時間というのは、データのサイズに比例して増えていきました。Angular 2の場合には改善されほとんど気にする必要のないくらいの速度になります。</p>

<h1>Angular 2</h1>

<p>Angular 2がどういうものかご紹介します</p>

<p><a href="https://github.com/davideast/ng2do" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/03/ca03f6027ad8871828c7e4ba3f2e1875.png" alt="スクリーンショット 2015-03-25 17.52.28" width="640" height="427" class="alignnone size-full wp-image-13994" /></a></p>

<h1>いつAngular 2が使えるか</h1>

<p>いまAngular 2はアルファバージョンになっていますので、大きな変更はあります。なぜ、安定してないものを紹介しているかというと、我々がどのようなな開発をしているかを示したいからです。オープンソースにし、Angular 2の初期の段階で、様々なフィードバックを受けたいという想いから公開しています。</p>

<p>すべてのコードはgithubに公開していますので、issueやコメントを入れてください。どういうアイデアがこれまでインプリされているかは、ドキュメントを見ていただきたいと思います。</p>

<p>2月にアルファを出したが、3月に行われたng-confでAngular 2のデモを行い、多くの反響をいただきました。正確にいつリリースされるか、日付は発表されてはいませんが、Googleのあるチームは5月には使いはじめ、マイグレーションを行っていきます。そして、このGoogle内部のチームからのフィードバック、コミュニティからのフィードバックでロードマップが決まってきます。</p>

<p>Angular 1を使う人は、angularjs.orgのサイトも使っていると思いますが、Angular 2に特化したサイトも立ち上げました。多くのAngular 2のドキュメントは、angular.ioに掲載されます。</p>

<p>では、Angular 1はどうなるかというと、多くの方がAngular 1を使っていると思いますので、ほとんどの方がAngular 2に移行したというまでは、Angular 1をサポートし残しておく方針です。より移行が簡単になるようAngular 2を開発していく予定です。そのマイグレーションが進む中で1.5や1.6を出していきます。</p>

<p>数週間前のng-confでのビデオがありますので、見ていただけたらと思います。</p>

<p><a href="https://www.youtube.com/user/ngconfvideos" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/03/990efc3ffd5ec8cd2bd4f552bcda069e.png" alt="スクリーンショット 2015-03-25 17.45.33" width="640" height="427" class="alignnone size-full wp-image-13992" /></a></p>

<div style="border: 1px solid gray; margin: 1em; padding: 1em;">
<article>
<h1>CodeIQとの連動企画！</h1>
AngularJS雑学、豆知識を問う問題です。<br>腕試しに、もしくは理解度チェックに是非ご活用ください！<a href="https://codeiq.jp/q/1384" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちら</a>から問題にチャレンジ！<br><a href="https://codeiq.jp/q/1384" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">問題：知ってる？AngularJS雑学</a>
</article>
</div>

<h1>プレゼンテーション資料</h1>

<p>今回取り上げたプレゼンテーションの資料は以下のとおり公開されています。合わせてご覧ください。</p>

<p><a href="https://docs.google.com/presentation/d/1c9YTFu5Dn6sxwnkWhXZhJC8pppASfJraKz6CC_eTezU/pub?start=false&amp;loop=false&amp;delayms=3000&amp;slide=id.p" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/03/f047265561803cbc9cdfec34f5c1c08a.png" alt="スクリーンショット 2015-03-25 17.43.44" width="640" height="427" class="alignnone size-full wp-image-13991" /></a></p>

<h1>セッション動画</h1>

<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/EEOKVlEaIDY?start=15653" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>
</div>
]]></content:encoded>
		
		<series:name><![CDATA[ng-japan 2015 特集]]></series:name>
	</item>
		<item>
		<title>Webエンジニア必見！AngularとTypeScriptが大規模開発の未来を変えるーng-japan 2015</title>
		<link>/albatrosary/13971/</link>
		<pubDate>Thu, 02 Apr 2015 00:00:37 +0000</pubDate>
		<dc:creator><![CDATA[佐川 夫美雄]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[TypeScript]]></category>

		<guid isPermaLink="false">/?p=13971</guid>
		<description><![CDATA[連載： ng-japan 2015 特集 (4)この記事は、Angularをテーマとした日本初のカンファレンス 「ng-japan」のイベントレポート（第4回目）です。 はじめに 昨年秋に、Angular 2はAtScr...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/ngjapa2015/" class="series-258" title="ng-japan 2015 特集" data-wpel-link="internal">ng-japan 2015 特集</a> (4)</div><p>この記事は、Angularをテーマとした日本初のカンファレンス 「<a href="http://ngjapan.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ng-japan</a>」のイベントレポート（第4回目）です。</p>

<h1>はじめに</h1>

<p>昨年秋に、Angular 2はAtScriptというaltJSで開発するといったアナウンスがありました。しかし、今年3/5に急遽、Angular 2はTypeScriptで開発するという変更がなされました。このニュースはGoogle社とMicrosoft社が手を結んだということでも大きなニュースになり、今年一番の出来事かもしれません。</p>

<p>そのTypeScriptとカレントバージョンであるAngular 1.3を利用した開発ポイントを、株式会社トップゲートのエンジニアであり、TypeScriptマスターでもある@vvakame氏に講演していただきました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/03/16259614824_b82efd0d83_z.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/03/16259614824_b82efd0d83_z.jpg" alt="16259614824_b82efd0d83_z" width="640" height="427" class="alignnone size-full wp-image-13973" srcset="/wp-content/uploads/2015/03/16259614824_b82efd0d83_z.jpg 640w, /wp-content/uploads/2015/03/16259614824_b82efd0d83_z-300x200.jpg 300w, /wp-content/uploads/2015/03/16259614824_b82efd0d83_z-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h1>TypeScript+Angular 1.3 &#8211; vvakame</h1>

<p>AtScriptからTypeScriptに移行される旨がアナウンスされたため、TypeScript自体の話を少しと、現行のAngular 1.3とTypeScriptを組み合わせて開発する方法についてお話します。</p>

<p>「AtScriptの近況と将来」の話をしようと思いましたが、3月頭に必要なくなったようなのでタイトルを変えました。「TypeScript+Angular 1.3」というタイトルでお話させていただきます。</p>

<h1>Angularを取り巻く開発言語</h1>

<h3>ECMAScriptとは</h3>

<p>ECMAScriptに関して整理します。</p>

<ul>
<li>JavaScriptの元となる仕様のこと</li>
<li>DOMの仕様は入っていない</li>
<li>最近のブラウザはECMAScript 5をサポート</li>
<li>そろそろ6の仕様が確定（現在RC2</li>
</ul>

<h3>AtScriptとは</h3>

<p>AtScriptとは何だったのかを振り返ってみます。</p>

<ul>
<li>AtScript=ES6+A (A=Annotiosion, AnnotationはES6に含まれない)</li>
<li>Super set of TypeScript</li>
</ul>

<p>AngularチームがAngular 2を開発するために策定したTypeScriptより、優れているaltJSということでした。</p>

<h3>TypeScriptとは</h3>

<p>では、TypeScriptの特徴はどういうものかを整理します。</p>

<ul>
<li>TypeScriptはJavaScriptを拡張した言語</li>
<li>静的型付け</li>
<li>ECMAScript6規格の文法を取り込み中</li>
<li>読みやすい変換後JavaScript</li>
<li>Java, C#とかにやさしい言語仕様</li>
</ul>

<p>TypeScriptは、Microsoftが出してきたということで当時注目されました。特徴の一つである静的型付けの特徴をまとめます。</p>

<ul>
<li>静的解析で多くの整合性検証が可能</li>
<li>不整合があった場合、コンパイルエラー</li>
<li>大規模、大人数になるほど有利</li>
<li>Java, C#が有名</li>
</ul>

<p>通常のJavaScriptでは、バグに関して実際に動かしてみて初めて分かりますが、TypeScriptのような静的型付けを用いると、静的解析でより多くの整合性検査が可能です。なるべくコンパイルした段階で、エラーが出力されるところが良い点の一つです。</p>

<p>例えば次の文はエラーになります。</p>

<p></p><pre class="crayon-plain-tag">var foo: number="bar";</pre><p></p>

<p>TypeScriptは、ECMAScript 6のスーパーセットになると考えられています。既存の資産を活用したいという要望も当然あります。そうした要望を満たすため、TypeScriptに様々なJavaScriptライブラリの型を定義した型情報を用意する必要があります。例えば、次のようなものがあります。</p>

<ul>
<li>jQuery</li>
<li>Angular</li>
<li>mocha</li>
<li>etc</li>
</ul>

<h3>DefinitelyTyped</h3>

<p>型定義ファイルというものがあります。現在は1,000個以上あります。既存JavaScriptに型を後付けというのはわかりづらいとは思います。</p>

<p>Angularの例を見てみます。</p>

<p></p><pre class="crayon-plain-tag">declare var angular: angular.IAngularStatic;

// Type definitions for Angular JS 1.3+
// Project: http://angularjs.org/
// Definitions by: Diego Vilar 
// Definitions: https://github.com/borisyankov/DefinitelyTyped


/// 

declare var angular: angular.IAngularStatic;

// Support for painless dependency injection
interface Function {
    $inject?: string[];
}

// Collapse angular into ng
import ng = angular;
// Support AMD require
declare module 'angular' {
    export = angular;
}

///////////////////////////////////////////////////////////////////////////////
// ng module (angular.js)
///////////////////////////////////////////////////////////////////////////////
declare module angular {

    // not directly implemented, but ensures that constructed class implements $get
    interface IServiceProviderClass {
        new (...args: any[]): IServiceProvider;
    }

    interface IServiceProviderFactory {
        (...args: any[]): IServiceProvider;
    }

    // All service providers extend this interface
    interface IServiceProvider {
        $get: any;
    }</pre><p></p>

<p>実際にこれを使ってコードを見てみます。JavaScriptとあまり変わりがないので読みやすいのではないかと思います。</p>

<p></p><pre class="crayon-plain-tag">module App {
	"use strict";

	angular.module(
		"app",
		["ngRoute", "app.hello"],
		($routeProvider: ng.route.IRouteProvider, $locationProvider: ngILocationProvider)=&gt; {
			$routeProvider
				.when("/sample", {
					templateUrl: "/template/sample.html"
				})
				.otherwise({
					templateUrl: "/template/main.html"
				});
			$locationProvider.html5Mode(true);
		}
	)
		.run(($rootScope: ngIRootScopeService, $routeParams: ng.route.IRouteParamsService)=&gt; {
			false;
		})
	;

	angular.module(
		"app.hello",
		[],
		()=&gt; {
			false;
		}
	)
		.service("sampleService", Service.SampleService)
		.controller("SampleTestController", Sample.TestController)
	;</pre><p></p>

<h1>Angular 2とTypeScript</h1>

<p>2015年3月5日に、Angular 2はTypeScriptで作ることになるという記事が出てきました。AtScriptからTypeScriptに変えた理由がいくつかあり、AngularチームとTypeScriptチームの調整がうまくいったのではないかと考えられます。</p>

<ul>
<li>TypeScriptに必要な機能が入る</li>
<li>Angularチームが作りたいのは、AtScriptではなくAngular本体である</li>
<li>TypeScriptのスーパーセットを作るのが困難</li>
</ul>

<p>TypeScriptのスーパーセットを作るという話でしたが、TypeScript自体の開発スピードがかなり早く、しかもその間にECMAScript 6の仕様も出て、短期間の内にAtScriptを開発するためには、人的にもコスト的にも難しい状況だと考えられます。</p>

<p>話をまとめると、Angularを使うという観点からも、今からTypeScriptを使う必要があると言えます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/03/16856063626_096494ddbb_z.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/03/16856063626_096494ddbb_z.jpg" alt="16856063626_096494ddbb_z" width="640" height="427" class="alignnone size-full wp-image-13976" srcset="/wp-content/uploads/2015/03/16856063626_096494ddbb_z.jpg 640w, /wp-content/uploads/2015/03/16856063626_096494ddbb_z-300x200.jpg 300w, /wp-content/uploads/2015/03/16856063626_096494ddbb_z-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h1>TypeScriptのSyntax</h1>

<p>TypeScriptの独自Syntaxはあまりなく、JavaScriptとそれほど変わるものではありません。TypeScriptですが、だいたい2日もあれば書けるようになると思われます。</p>

<h3>Type Annotations</h3>

<p>Type Annotationsを具体的に見てみます。</p>

<p></p><pre class="crayon-plain-tag">var str1:string = "string";
var str2:number = "string"; // エラー
var str3 = "string"; // 初期化子から型推論されstringを指定したのと等価
str3 = 1; //エラー

var b: boolean = true;
var n: number = 1;

var a: any = true;
a = 1; // anyは何でもOK</pre><p></p>

<h3>Classes</h3>

<p>ECMAScript 6からは、クラスの宣言ができるようになりました。TypeScriptの例を見てみます。</p>

<p></p><pre class="crayon-plain-tag">class Hoge {
	name: string;
	
	constructor(name: string) {
		this.name = name;
	}
	
	hello(): string{
		return "Hello, " + this.name;
	}
}

var obj = new Hoge("world");
window.alert(obj.hello());</pre><p></p>

<h3>Interface</h3>

<p>TypeScriptで定義したInterfaceは、実行時には消えてしまいます。型だけの定義です。</p>

<p></p><pre class="crayon-plain-tag">interface Hoge {
	str: string;
	num: number;
}

var obj: Hoge = {
	str: "string",
	num: 1
};

window.alert(obj.str + obj.num);
window.alert(obj.hello());</pre><p></p>

<h3>Allow Functions</h3>

<p>Allow Functionsは、最近話題になっています。メリットとしては、functionというキーワードが必要なくなるところです。これはECMAScript 6でも標準化されますので、TypeScriptを通して今のうちから慣れるのもよいかと思います。</p>

<p></p><pre class="crayon-plain-tag">var hello = (word: string) =&gt; console.log("Hello, " + word);
hello("TypeScript");

// 返り値の型を明示する
var hello2 = (word: string): void =&gt; console.log("Hello, " + word);
// 参考：今まで通りの書き方 1
var hello3 = function (word: string) { console.log("Hello, " + word); };
// 参考：今まで通りの書き方 2
function hello4(word: string) { console.log("Hello, " + word); }</pre><p></p>

<h3>internal modules</h3>

<p>今までのJavaScriptでは、モジュールの定義するというのは存在していませんでした。TypeScriptではモジュールが定義されています。今は過渡期でこうした書き方ですが、ECMAScript 6だと書き方があるので、なくなると思われます。</p>

<p></p><pre class="crayon-plain-tag">module app {
	export class Sample {
		hello(word = "TypeScript") {
			return `Hello, ${word}`;
		}
	}
}
var obj = new app.Sample();
console.log(obj.hello("AngularJS"));


var app;
(function (app) {
    var Sample = (function () {
        function Sample() {
        }
        Sample.prototype.hello = function (word) {
            if (word === void 0) { word = "TypeScript"; }
            return "Hello, " + word;
        };
        return Sample;
    })();
    app.Sample = Sample;
})(app || (app = {}));
var obj = new app.Sample();
console.log(obj.hello("AngularJS"));</pre><p></p>

<h3>Generics</h3>

<p>Genericsは非常に便利です。</p>

<p></p><pre class="crayon-plain-tag">class Container {
    constructor(public data: T) { }
}

var a = new Container("str");
var b = new Container(1);

a.data.charAt(0);
b.data.toExponential();</pre><p></p>

<h1>はじめてみよう &#8211; Angular-typescript</h1>

<p>@vvakameのgithubにあるので是非見ていただき、TypeScriptを始めてもらえたらと思います。</p>

<p><a href="https://github.com/vvakame/angularjs-typescript" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/03/ffa63c24a9c43d2715cc64655dd91f1d.png" alt="スクリーンショット 2015-03-25 16.14.58" width="640" height="427" class="alignnone size-full wp-image-13978" /></a></p>

<p>開発する際、利用するツールは次の通りです。</p>

<ul>
<li>node.js</li>
<li>grunt</li>
<li>bower</li>
<li>TypeScript
** tslint
** typedoc
** dtsm (tsd)</li>
<li>LESS</li>
<li>unit test
** mocha
** power-assert</li>
<li>karma</li>
<li>protractor</li>
<li>その他</li>
</ul>

<h1>Angular 1.3と組み合わせる</h1>

<p>あまり考えなくてよく、TypeScriptと重ねることは特別なことはないです。TypeScriptはJavaScriptの延長線上にあり、JavaScriptのベストプラクティスがそのまま利用することができます。</p>

<p>その中で覚えなければならないのは</p>

<ul>
<li>型の名前</li>
<li>使いたいメソッド（angularのドキュメントを読むより型定義ファイルを見たほうが早い）</li>
<li>使いたいDIオブジェクト名</li>
</ul>

<p>その中で次のことに注意すれば、問題なく記述することができます。</p>

<ul>
<li>tsc &#8211;noImplicitAny</li>
<li>型注釈を書く</li>
</ul>

<div style="border: 1px solid gray; margin: 1em; padding: 1em;">
<article>
<h1>CodeIQとの連動企画！</h1>
AngularJS雑学、豆知識を問う問題です。<br>腕試しに、もしくは理解度チェックに是非ご活用ください！<a href="https://codeiq.jp/q/1384" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちら</a>から問題にチャレンジ！<br><a href="https://codeiq.jp/q/1384" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">問題：知ってる？AngularJS雑学</a>
</article>
</div>

<h1>プレゼンテーション資料</h1>

<p>今回取り上げたプレゼンテーションの資料は、以下のとおり公開されています。合わせてご覧ください。</p>

<p><a href="http://www.slideshare.net/vvakame/ngjapan-2015-typescriptangularjs-13" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/03/7219121e4a9fc12387b410f2da9e1224.png" alt="スクリーンショット 2015-03-25 16.04.40" width="640" height="427" class="alignnone size-full wp-image-13972" /></a></p>

<h1>セッション動画</h1>

<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/EEOKVlEaIDY?start=12068" frameborder="0" 0="allowfullscreen" scrolling="yes" class="iframe-class"></iframe>
</div>
]]></content:encoded>
		
		<series:name><![CDATA[ng-japan 2015 特集]]></series:name>
	</item>
	</channel>
</rss>
