<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>Angular &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/angular/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>Angular 2を使うならUIはコレで！Ionic 2ことはじめ（正式リリース版対応）</title>
		<link>/rdlabo/22296/</link>
		<pubDate>Thu, 16 Feb 2017 00:14:20 +0000</pubDate>
		<dc:creator><![CDATA[榊原昌彦]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Angular 2]]></category>
		<category><![CDATA[Ionic2]]></category>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<h2>Ionic 2のUI</h2>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<h2>終わりに</h2>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<p><b class="speaker siraisi">白石</b>Webの進化に合わせて、どこまでも進化していくフレームワークということですね。ならば、正式名称からバージョン番号を外して「Angular」にしたというのも頷けます。
Angularを開発しているGoogleは、Webの標準化においても影響力は大きいですし、<strong>Webの進化とAngularの進化が両輪で進んでいく</strong>というわけですね。Webはこれからもエキサイティングな場であり続けそうです。</p>
]]></content:encoded>
			</item>
		<item>
		<title>Angular1から2への移行プロセス、詳しく語ります</title>
		<link>/frontainer/18780/</link>
		<pubDate>Thu, 28 Apr 2016 03:05:16 +0000</pubDate>
		<dc:creator><![CDATA[林 優一]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[TypeScript]]></category>

		<guid isPermaLink="false">/?p=18780</guid>
		<description><![CDATA[Angular2のリリースが近づいてきている今、Angular1で開発された資産を、どうやってAngular2に移行していけばよいのでしょうか？ この記事では、実際に移行を行う上でのプロセスを具体的に示していきます。 編...]]></description>
				<content:encoded><![CDATA[<p>Angular2のリリースが近づいてきている今、Angular1で開発された資産を、どうやってAngular2に移行していけばよいのでしょうか？</p>

<p>この記事では、実際に移行を行う上でのプロセスを具体的に示していきます。</p>

<p><em>編集部注: この記事は、2016年3月21日に開催された「<a href="http://ngjapan.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ng-japan 2016</a>」のセッション「Angular1.4で作られた自社マイクロサービスを2へマイグレーション」についての、講演者自身によるレポートです。講演内容に加えて、講演者自身による解説や追記によって、よりわかりやすく詳細な記事に仕上げていただきました。</em></p>

<p><img src="/wp-content/uploads/2016/04/DSC027921.jpg" alt="" width="550" height="382" class="aligncenter size-full wp-image-18853" srcset="/wp-content/uploads/2016/04/DSC027921.jpg 550w, /wp-content/uploads/2016/04/DSC027921-300x208.jpg 300w, /wp-content/uploads/2016/04/DSC027921-207x144.jpg 207w" sizes="(max-width: 550px) 100vw, 550px" /></p>

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

<h3>講演資料</h3>

<iframe class="embedly-embed" src="//cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.slideshare.net%2Fslideshow%2Fembed_code%2Fkey%2FMVkoVxeu8i10TT&#038;url=http%3A%2F%2Fwww.slideshare.net%2Ffrontainer%2Fangular142&#038;image=http%3A%2F%2Fcdn.slidesharecdn.com%2Fss_thumbnails%2Fng-japan2016-160321133747-thumbnail-4.jpg%3Fcb%3D1458569152&#038;key=internal&#038;type=text%2Fhtml&#038;schema=slideshare" width="500" height="417" scrolling="no" frameborder="0" allowfullscreen></iframe>

<h3>講演動画（4:19:52付近から始まります）</h3>

<iframe width="560" height="315" src="https://www.youtube.com/embed/4QVMhM75XK8" frameborder="0" allowfullscreen></iframe>

<h2>Angular1から2へ移行する前に</h2>

<p>Angular2への移行を始める前に、Angular1の構成やソースコードを整理する必要があります。公式サイトに「<a href="https://angular.io/docs/ts/latest/guide/upgrade.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">UPGRADING FROM 1.X</a>」という1からアップグレードする手順の解説があります。その手順に加え、実際のアプリケーションの構成を考慮すると以下のような流れになります。</p>

<ul>
<li>事前準備</li>
<li>ng-upgrade</li>
<li>コンポーネント(ディレクティブ)の移植</li>
<li>サービスの移植</li>
<li>ページコンポーネントの移植</li>
<li>フィルターの移植</li>
<li>ルーターの移植</li>
<li>ng1ライブラリの置き換え</li>
<li>ng-upgradeの除去</li>
</ul>

<p>※ セッションでは上記の「サービスの移植」までの前段のみを取り上げています。</p>

<h2>事前準備</h2>

<p>Angular2では1とは異なる点が多く、そのままではすぐにアップグレードすることはできません。そこでまずは1で近い構成にする事前準備が必要になります。</p>

<h3>AngularJS Style Guideに従った構成になっていること</h3>

<p><a href="https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">johnpapa/angular-styleguide Angular 1 Style Guide</a></p>

<p>上記スタイルガイドの<a href="https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#rule-of-1" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Rule of 1</a>及び<a href="https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#folders-by-feature-structure" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Folders-by-Feature Structure</a>、<a href="https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#modularity" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Modularity</a>の３点には最低限合わせておきましょう。</p>

<p>Angular2ではコンポーネントが中心になり、ファイルの構成もこのスタイルガイドと近い構成になっていきます。あらかじめコンポーネントごとにファイルを分けて置くことで、基本的な設計もコンポーネント指向に近づけておきます。</p>

<p>「<a href="http://qiita.com/laco0416/items/edfa917583af4593ad6c" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">その使い方はもう古いかも？AngularJS老化チェック</a>」という記事の内容が現在のコードに当てはまらないかどうかをチェックしておきましょう。当てはまったものはスタイルガイドに沿ってリファクタリングを行いましょう。</p>

<h3>モジュールローダー（モジュールバンドラー）（Browserify/Webpackなど）を使っていること</h3>

<p>Angular2は必要なスクリプトを読み込んでいって作ることもできますが、モジュールローダー（モジュールバンドラー）前提で話が進んでいくことがあり、導入されていないと理解が難しい状況になります。何も導入していなければBrowserifyかWebpackをおすすめします。公式サイトではSystemJSを用いていますが、Browserify/Webpackを使う場合、必ずしもSystemJSを使う必要はありません。</p>

<ul>
<li><a href="http://browserify.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Browserify</a></li>
<li><a href="https://webpack.github.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Webpack</a></li>
<li><a href="https://github.com/systemjs/systemjs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SystemJS</a></li>
</ul>

<h3>TypeScriptへ移行</h3>

<p>Angular2入門のページではBabelやTypeScriptなどの利用を、とありますが、マイグレーション時においては<a href="https://www.typescriptlang.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TypeScript</a>への移行を先にすることを強くお勧めします。</p>

<p>例えば先ほどの「UPGRADING FROM 1.X」のページですが、JavaScript用のドキュメントは準備中となっています（2016年4月現在）。</p>

<p>このような状況からみて、今後の新しい機能についてもTypeScript優先で情報提供されることがあることでしょう。また、既にAngular2に取り組んでいる先人たちのノウハウ（StackOverflowなど）もTypeScriptをベースにしているものが多いので、これを機にTypeScriptを使うと良いでしょう。型などを用いることで移行時の不具合を見つける手助けにもなります。</p>

<h3>コンポーネントディレクティブの使用</h3>

<p>Angular1.5からコンポーネント機能が提供されました。Angular2の基本はコンポーネントで構成されます。そのため、既存のアプリケーションをコンポーネント化していくことで移行がスムーズになります。対応ブラウザに問題がなければまずはAngular1.5にアップグレードし、ディレクティブや共通部分をコンポーネント化しましょう。</p>

<p><a href="https://docs.angularjs.org/guide/component" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Angular Developer Guide / Component</a></p>

<p>ここまでを一通り行い、Angular2への移行の準備が整います。</p>

<p>この時点で難しいと思われる方もいるかもしれません。しかしながら、Angular2でも準備と同様の環境が求められます。Angular2はパフォーマンス改善やコンポーネント指向など魅力的な変更があるのでぜひとも移行していきたいところなのです。いずれにしても、今後も大きなフロントエンド開発においてはこのようなモダン構成が求められることでしょうから、そうした練習としてAngular2を採用するのも良いでしょう。</p>

<h2>Angular2の導入</h2>

<p>Angular2の方へ入っていきたいと思います。最低限必要なものとして以下のものが必要になります。（2016/4/24時点）</p>

<ul>
<li>angular2@2.0.0-beta.15</li>
<li>systemjs@0.19.26</li>
<li>refrect-metadata@0.1.2</li>
<li>rxjs@5.0.0-beta.2</li>
<li>zone.js@0.6.10</li>
<li>es6-shim@0.35.0</li>
</ul>

<p><code>npm install</code>でまとめて導入できます。</p>

<p></p><pre class="crayon-plain-tag">npm install angular2@2.0.0-beta.15 systemjs@0.19.26 refrect-metadata@0.1.2 rxjs@5.0.0-beta.2 zone.js@0.6.10 es6-shim@0.35.0</pre><p></p>

<p>まずAngularの起動方法を変更します。</p>

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

<p>これは以下のように<code>angular.bootstrap</code>関数を用いて定義するようにします。この際HTMLに<code>ng-app</code>は不要です。</p>

<p></p><pre class="crayon-plain-tag">angular.bootstrap(document.body,['app'],{strictDi:true});</pre><p></p>

<p>さらにこの部分を<strong>ng-upgrade</strong>と呼ばれているangular2/upgradeの<code>UpgradeAdapter</code>というものを用いてAngularを起動していきます。</p>

<p></p><pre class="crayon-plain-tag">import {UpgradeAdapter} from 'angular2/upgrade';
export const Adapter = new UpgradeAdapter();</pre><p></p>

<p></p><pre class="crayon-plain-tag">import {Adapter} from './adapter.ts';
Adapter.bootstrap(document.body,['app'],{strictDi:true});</pre><p></p>

<p>このようにupgradeの中にある<code>UpgradeAdapter</code>を経由して実行をします。今後1と2を混在させた状態でアプリケーションを動かすためのハブのような役割をこのAdapterが行ってくれます。今後いろいろな場面でAdapterを呼び出して使うことになるので、あらかじめ別のファイルにしておいて外部から参照できるようにしておきましょう。</p>

<p>続いて<code>angular2-polyfill.js</code>を読み込みます。後々<code>Observable</code>を使う時に必要になるので、忘れないように入れておきましょう。</p>

<p></p><pre class="crayon-plain-tag">import 'angular2/bundles/angular2-polyfills';

// for old browsers
import 'es6-shim/es6-shim.min.js';
import 'angular2/es6/dev/src/testing/shims_for_IE';</pre><p></p>

<p>ここでユニットテストなどで<code>PhantomJS</code>などで実行しているとエラーが出ます。<code>es6-shim</code>を入れることで回避することができます。</p>

<p><a href="https://github.com/radify/karma-es6-shim" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">karma-es6-shim</a></p>

<p>TypeScriptにもes6の型定義ファイルが必要になるので、<code>es6-shim</code>の型定義ファイルを入れておきましょう。</p>

<p></p><pre class="crayon-plain-tag">typings install es6-shim --save --ambient</pre><p></p>

<p>以上で移行の前段はできました。ここからはAngular1で作ったものを徐々に2へと置き換えて行く作業になります。</p>

<h2>コンポーネントを置き換え</h2>

<p>まずは他にあまり依存しない、Directiveのrestrict:&#8217;E&#8217;で実装されていたものをAngular2へ移行していきます。大きなところからやりたくなりますが、<strong>移行は末端から順番にやるようにしましょう</strong>。</p>

<p>以下はAngular1のコンポーネントを使って書かれたローディングの例です。</p>

<p></p><pre class="crayon-plain-tag">const template = require('./loading.html');
class LoadingCtrl {
    constructor(private LoadingService) {}
}
angular.module(‘app')
    .component('globalLoading',{
        controller: LoadingCtrl,
        transclude: true,
        template: template
    });
export default LoadingCtrl;</pre><p></p>

<p></p><pre class="crayon-plain-tag">class LoadingService {
    count:number = 0;
    loading:boolean = false;
    constructor() {}
    start() {
        ++this.count;
        this.loading = true;
    }
    stop() {
        --this.count;
        if (this.count === 0) {
            this.loading = false;
        }
    }
}
angular.module(‘app')
    .service('LoadingService',LoadingService);</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;div ng-show="LoadingService.loading" class="loading"&gt;
    &lt;div class="loading-text" ng-transclude&gt;&lt;/div&gt;
&lt;/div&gt;</pre><p></p>

<p>このローディングコンポーネントをAngular2に置き換えていきます。
まずはコンポーネント部分を置き換えていきましょう。</p>

<p></p><pre class="crayon-plain-tag">import {Adapter} from '../../core/adapter';
import {Component} from 'angular2/core';
import {LoadingService} from './LoadingService';
const template = require('./loading.html');

@Component({
    selector: 'global-loading',
    template: template
})
export class LoadingCtrl {
    constructor(private LoadingService:LoadingService) {}
}
angular.module('app').directive('globalLoading',&lt;angular.IDirectiveFactory&gt;Adapter.downgradeNg2Component(LoadingCtrl));</pre><p></p>

<p>Angular2の基本はコンポーネントになっているので、出来る限りコンポーネントに置き換えておきましょう。</p>

<p>Angular2で書かれたコンポーネントは1環境では呼び出すことができません。そこでディレクティブに<code>Adapter.downgradeNg2Component()</code>を用いて登録することで、Angular1環境下においても使うことができるようになります。</p>

<p>続いて、サービス部分の移植です。</p>

<p></p><pre class="crayon-plain-tag">import {Adapter} from '../../core/adapter';
import {Injectable} from 'angular2/core';

@Injectable()
export class LoadingService {
    count:number = 0;
    loading:boolean = false;
    constructor() {}
    start() {
        ++this.count;
        this.loading = true;
    }
    stop() {
        --this.count;
        if (this.count === 0) {
            this.loading = false;
        }
    }
}
angular.module('app').factory('LoadingService',Adapter.downgradeNg2Provider(LoadingService));
Adapter.addProvider(LoadingService);</pre><p></p>

<p><code>@Injectable()</code>をつけてInject(DI)可能であることを示します。
コンポーネント同様に、Angular2記法のServiceをAngular1からもDIできるように<code>Adapter.downgradeNg2Provider()</code>を使ってダウングレードして登録しておきます。</p>

<p>加えて、<code>Adapter.addProvider()</code>で作ったサービスを<code>Provider</code>に登録する必要があります。これは<code>UpgradeAdapter</code>を使っている場合で、Angular2のコンポーネントからDIさせるために必要になります。</p>

<p>これを行わないと以下のようなエラーとなります。</p>

<p><code>
EXCEPTION: Error: [$injector:unpr] Unknown provider: LoadingServiceProvider &lt;- LoadingService &lt;- LoadingInterceptor &lt;- $http &lt;- $templateFactory &lt;- $view &lt;- $state</code></p>

<p>同様にHTMLもAngular2記法に置き換えを行います。</p>

<p>ディレクティブでは<code>ng-transclude</code>を使っていましたが、Angular2では<code>ng-content</code>になっているのは注意が必要です。</p>

<p>また、細かいところですが、<code>angular.constants</code>もなくなっているので、<code>const</code>でオブジェクトを作っておき、それを<code>import</code>して使うように置き換えましょう。</p>

<h3>ServiceのAngular2移行</h3>

<p>さて次に、ServiceをAngular2化していきます。
基本はLoadingのときと同じですが、通信周りには変更があります。</p>

<p>Ajax通信を行う際は<code>$http</code>を使って通信を行っていました。Angular2では<code>Http</code>でAjax通信を行うことができます。<code>$http</code>は<code>Promise</code>を返していましたが、<code>Http</code>は<code>Observable</code>を返すという違いがあります。</p>

<p>以下はAngular2記法に置き換えたいわゆるモデルです。作りは先程のローディングの場合と殆ど変わりませんが、<code>Http</code>は<code>Observable</code>を返すので、処理の変更箇所を減らすために<code>Promise</code>で返すようにしています。</p>

<p></p><pre class="crayon-plain-tag">import {Adapter} from '../../core/adapter';
import {Injectable} from 'angular2/core';
import {CONSTANTS} from '../../core/constants';
import {Http, Response} from 'angular2/http';
@Injectable()
export class AccountModel {
    constructor(protected http:Http) {}
    get() {
        return this.http.get(`${CONSTANTS.API_PATH}account`).toPromise();
    }    
}
angular.module('app').factory('AccountModel', Adapter.downgradeNg2Provider(AccountModel));
Adapter.addProvider(AccountModel);</pre><p></p>

<p><code>Http</code>の返す<code>Observable</code>については<a href="https://github.com/ReactiveX/rxjs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">RxJSのドキュメント</a>を参照してください。</p>

<p><a href="https://github.com/Reactive-Extensions/RxJS" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Reactive-Extensions/RxJS</a></p>

<p>最後にあらかじめコンポーネントにしておいたページでフォームの部分を移植してみます。
まずテンプレートをAngular2記法に置き換えます。</p>

<p>テンプレートの記法は以下の参考リンクを上から順番に見ていくと良いでしょう。</p>

<ul>
<li>*ngIfのようなシンタックスについて &#8211; <a href="https://angular.io/docs/ts/latest/guide/template-syntax.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TemplateSyntax</a></li>
<li>Angular1ではこう書いてたけど2だとどうなるの？というとき &#8211; <a href="https://angular.io/docs/ts/latest/cookbook/a1-a2-quick-reference.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ANGULAR 1 TO 2 QUICK REFERENCE</a></li>
<li>慣れてきて一覧でみたい時 &#8211; <a href="https://angular.io/docs/ts/latest/guide/cheatsheet.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ANGULAR CHEAT SHEET</a></li>
</ul>

<h3>formの移植</h3>

<p>続いてformの制御部分を移植します。メールアドレスの入力フォームで、バリデーションが通らないと更新ボタンが押せない（disabled）になるというよくあるものです。</p>

<p></p><pre class="crayon-plain-tag">&lt;form ng-submit="$ctrl.save()"&gt;
    &lt;label class="layout-block"&gt;メールアドレス変更&lt;/label&gt;     &lt;div class="form-item"&gt;
        &lt;div class="form-input form-fill"&gt;
            &lt;input ng-model="$ctrl.newEmail" type=“email" name="email" placeholder="新しいメールアドレス" required&gt;
            &lt;span class="form-error"&gt;
                &lt;span ng-if="!form.email.$error.email"&gt;メールアドレスを正しく入力してください&lt;/span&gt;
                &lt;span ng-if="!form.email.$error.required"&gt;必ず入力してください&lt;/span&gt;
            &lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;button ng-disabled="!emailform.$valid" class="btn btn-default btn-revert"&gt;メールアドレスを変更する&lt;/button&gt;
&lt;/form&gt;</pre><p></p>

<p>formの制御のために<code>[ngFormModel]="name"</code>を使います。（これ以外にも複数方法があります）また、inputタグには<code>ngControl="name"</code>を使って名前を付けます。</p>

<p>下記のように書きかえます。</p>

<p></p><pre class="crayon-plain-tag">&lt;form [ngFormModel]="form" (submit)="save();"&gt;
	&lt;div class="form-input"&gt;
		&lt;input [(ngModel)]="user['lastname-phonetic']" ngControl="lastphonetic" type="text" value="" placeholder="セイ"&gt;
		&lt;span class="form-error" *ngIf="form.controls.lastphonetic.errors"&gt;
			&lt;span class="form-error-message"&gt;
				&lt;div [hidden]="!form.controls.lastphonetic.errors.required"&gt;セイは必須項目です&lt;/div&gt;
				&lt;div [hidden]="form.controls.lastphonetic.errors.required &amp;&amp; form.controls.lastphonetic.errors.invalidPhonetic"&gt;全角カタカナで入力してください&lt;/div&gt;
			&lt;/span&gt;
		&lt;/span&gt;
	&lt;/div&gt;
	&lt;button [disabled]="!form.valid" class="btn btn-default btn-revert"&gt;更新&lt;/button&gt;
&lt;/form&gt;</pre><p></p>

<p>フォームのエラー状況によって振り分けしたい部分は[ngFormModel]でつけた名前.controls.inputにつけたngCotrol名.errors.エラー名でエラーが発生しているかどうかを確認することができるようになりますが、スクリプトも修正が必要です。</p>

<p></p><pre class="crayon-plain-tag">import {FORM_DIRECTIVES,Control,ControlGroup,Validators} from 'angular2/common';

@Component({
    selector: 'profile-form',
    templateUrl: 'webroot/components/profile/profile.html',
    directives: [FORM_DIRECTIVES]
})

this.form = new ControlGroup({
	lastphonetic: new Control('',Validators.compose([
		Validators.required,
		ValidateService.phonetic
	]))
});</pre><p></p>

<p>コンポーネント内でform関連のディレクティブを使うときには@Componentのdirectivesに配列で使うディレクティブを指定します。</p>

<p>先ほどngModelFormにつけた名前と同じ名称にnew ControlGroup()します。
そしてngControlにつけた名前と同じ名称でnew Control()します。
第一引数がデフォルトの値、第二引数にバリデーション関数を指定します。
複数指定する場合はValidators.componse([])を１つの場合はValidators.requiredなどを指定します。</p>

<p>Validatorsにはあらかじめ定義されているバリデーターがあります。</p>

<p></p><pre class="crayon-plain-tag">static required(control: modelModule.Control): {
	[key: string]: boolean;
};
static minLength(minLength: number): Function;
static maxLength(maxLength: number): Function;
static pattern(pattern: string): Function;
static nullValidator(c: any): {
	[key: string]: boolean;
};</pre><p></p>

<p>Angular1ではtype=&#8221;email&#8221;でメールアドレスのチェックが行われていましたが、Angular2では上記のチェック以外は行われない点は注意してください。</p>

<p>今回はメールアドレスなので、カスタムバリデータを作成します。</p>

<p></p><pre class="crayon-plain-tag">export const ValidateService = {
	email(control:Control) {
		if (!/^[a-z0-9!#$%&amp;'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i.test(control.value)) {
			return {email: true};
		}
	}
}</pre><p></p>

<p>returnする名称はエラーが発生した時に form.controls.lastphonetic.errors.emailで取得することができる値です。</p>

<p>バリデーションの正規表現についてはAngular1で使用されていたものと同じです。</p>

<p><a href="https://github.com/angular/angular.js/blob/g3_v1_5/src/ng/directive/input.js#L27" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Angular directive/input.js</a></p>

<p>セッションでは時間の関係で移行手順の途中までしかお話できませんでした。
移行作業は作られたアプリケーションによって異なりますが、公式サイトの手順だけではハマりどころも発生することでしょう。</p>

<p>今後移行手順に関してはさらに整理され情報も出てくると思いますので、事前準備をしっかりと行い、ng-upgradeを用いて少しずつ移行を進めていきましょう。</p>
]]></content:encoded>
			</item>
	</channel>
</rss>
