<?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>ng-japan &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/ng-japan/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>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の失敗しない始め方〜「ng-japan 2016」セッションレポート〜</title>
		<link>/yusuke-naka/18590/</link>
		<pubDate>Fri, 01 Apr 2016 00:52:57 +0000</pubDate>
		<dc:creator><![CDATA[仲 裕介]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Angular2]]></category>
		<category><![CDATA[ng-japan]]></category>

		<guid isPermaLink="false">/?p=18590</guid>
		<description><![CDATA[この記事は、「ng-japan 2016」のセッションレポートです。講演内容を再現していますが、ニュアンス等伝えきれない場合があるので、気になるところは、記事末尾に掲載の講演資料やYoutube動画でご確認ください。 A...]]></description>
				<content:encoded><![CDATA[<p>この記事は、「<a href="http://ngjapan.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ng-japan 2016</a>」のセッションレポートです。講演内容を再現していますが、ニュアンス等伝えきれない場合があるので、気になるところは、記事末尾に掲載の講演資料やYoutube動画でご確認ください。</p>

<h1>Angular2の失敗しない始め方 / 稲富駿氏</h1>

<p>株式会社トップゲートの<a href="https://twitter.com/laco0416" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">稲富 駿氏</a>によるセッションです。セッション資料や配信動画は記事末尾でご確認ください。このセッションでは、大きく3つの点について触れられました。それぞれのポイントを書き起こします。</p>

<ol>
<li>Angular2に関するよくある質問や誤解について</li>
<li>Angular2を構成する基礎技術について</li>
<li>Angular2を学ぶために必要なこと</li>
</ol>

<p><img src="/wp-content/uploads/2016/03/ina3.jpg" alt="" width="600" height="367" class="aligncenter size-full wp-image-18640" srcset="/wp-content/uploads/2016/03/ina3.jpg 600w, /wp-content/uploads/2016/03/ina3-300x184.jpg 300w, /wp-content/uploads/2016/03/ina3-207x127.jpg 207w" sizes="(max-width: 600px) 100vw, 600px" /></p>

<h2>1. Angular2に関するよくある質問や誤解について</h2>

<p>Angular2について正しい知識を知ってもらうために、よくある質問とその回答について幾つか取り上げる。</p>

<h3>Q1. AngularJS2なのか？Angular2なのか？</h3>

<p>Angular2が正しい名称。ここが大事。Angularはただ単にJSフレームワークライブラリではない。JSフレームワークであると同時に、
ElectronやNativeアプリで動くライブラリでもあり、Serverサイドで動くためのライブラリでもある。つまり、Angularはアプリケーション開発のためのプラットフォームと認識するのが正しい。</p>

<h3>Q2. Angular2を学ぶためにTypeScriptを勉強する必要があるのか？</h3>

<p>必ず必要というわけではないが、勉強すべきである。Angular2はコードベースがTypeScriptベースになっている。勉強すべき理由はそれだけではなく、TypeScriptを利用することで、次の大きく3つのメリットを享受でき、安全で開発自体の生産性向上を図ることが可能になる。特にTypeScriptを採用できない理由がない場合は、TypeScriptで書くべきである。</p>

<h4>メリット１：静的型チェックが利用可能</h4>

<p>TSの一番大きな特徴である静的型チェック。静的型付けされたコードは常に正しいAPIドキュメントだと言える。型が付いている限り、常に正しいコードが書けるし、コンパイラでエラーを事前にチェックできる等のメリットがある。また、型があることで、エディタやIDEで入力補完の恩恵をうけることができる。</p>

<h4>メリット２：Decoratorsが利用可能</h4>

<p>デコレーター（＠Decorators）は次世代のWeb標準（ESnext）として提案されている機能。TypeScriptでもオプションを付けることで利用可能。Angular2ではこれを推奨している。デコレーターを利用することで、コンポーネント作成にあたっての属性設定はデコレーターで、コンポーネントの実装はclassでというふうに分けて書くことができる。それによってコードの視認性も向上する。</p>

<p></p><pre class="crayon-plain-tag">@Component({
    selector: "app-profile",
    template: "&lt;p&gt;Name: {{ name }}&lt;/p&gt;"
})
class ProfileComponent {
    name: string;
    constructor() {
        this.name = "laco";
    }
}</pre><p></p>

<h4>メリット３：Type-Base DIが利用可能</h4>

<p>Type-Base DI（Type-Safe DI）を利用すると、DIを型ベースで行うことが可能。例えば、コンストラクタに渡す変数名が間違っていたとしても、型を指定するため、エラーを未然に防ぐことが可能。誤字（typo）に強いDIができる。DIについての詳しい説明は省略する。</p>

<p></p><pre class="crayon-plain-tag">import {Http} from "angular2/http";

@Injectable()
class MyService {
    constructor(private anyNameForHttp: Http) {
    }
}</pre><p></p>

<h3>Q3. Angular１系はサポート終了になるのか？</h3>

<p>Angular1系は、1.4系と1.5系が今後もサポートされ続ける。これがステーブルとなり、基本的には破壊的変更は入らない。もし、破壊的変更が入る場合は、1.6、1.7とバージョンが上がっていく予定で、遅れてバックポートしたものが1.5にもマージされることになる。</p>

<p>Angular1.5ではComponent Helperが追加された。これは、Angular2への移行をサポートするためのもので、将来的に移行を検討している場合は、使っておくと良い。また、Angular2のRouterについては、Angular1用のライブラリが出ており、利用することでAngular2とほぼ同じAPI、書き方で実装することができる。</p>

<h3>Q4. 双方向バインディングはなくなったのか？</h3>

<p>存在する。しかし、Angular2は原則単方向バインディングを利用することになっている。双方向バインディングを実装したい場合は、二重カッコ[()]で記載する必要が出てくる。</p>

<p></p><pre class="crayon-plain-tag">&lt;input [(ngModel)]="myName"&gt;</pre><p></p>

<p>このように記載すると実行時に、以下のように単方向バインディング＋イベントハンドラが自動生成される。</p>

<p></p><pre class="crayon-plain-tag">&lt;input [ngModel]="myName" (ngModelChange)="myNameChanged($event)"&gt;</pre><p></p>

<h3>Q5. Dirty checkはなくなったのか？</h3>

<p>存在する。しかし、Angular1に比べて爆速で動作するようになった。理由は、Angular２は実行時に変更検知を行うためのコード生成を行う。具体的には、Angular2の各コンポーネントは、自分自身の変更検知のために、専用のChange Detectorという変更検知器を生成する。それぞれのコンポーネントに最適化された変更検知器のおかげで、Dirty checkのパフォーマンスが改善（10msで100000チェックが可能）された。watchの個数は基本的に気にしなくて良くなる。</p>

<h3>Q6. サーバサイドレンダリングはできるようになるのか？</h3>

<p>Angular Universalというnodejs上で実行されるAngular2が存在する。コアのコードはAngular2とまったく同じ。また、nodejsにかぎらず、今後は、Java/php/.net/python等の環境でも利用できるようになる予定。</p>

<h3>Q7. WebComponentを利用しているのか？</h3>

<p>利用していない。しかし、Angular2はWebComponentと併用可能である。例えば、ShadowDom。Angular２は独自の機能でShadowDomをエミュレート（CSSのスコーピング）を行うことが出来る。</p>

<p></p><pre class="crayon-plain-tag">@Component({
    selector: "my-component",
    encapsulation: ViewEncapsulation.Native
})
class MyComponent{}</pre><p></p>

<p>ディフォルトは<code>ViewEncapsulation.Emulated</code>である。もしブラウザにShadowDomの機能がついていれば、 <code>ViewEncapsulation.Native</code>を指定することで利用可能。パフォーマンス面では、ブラウザのShardDomを使うほうが早い。現時点ではChromeでしか動作しないが、対応ブラウザがChromeの場合や、Electron上で動作させる場合は、こちらを活用してパフォーマンス向上を狙ってほしい。</p>

<h2>2. Angular2を構成する基礎技術について</h2>

<p>次に、Angular２を構成する基礎技術について解説する。Angular２は様々な技術を利用して作られているので、個別の技術について理解すると、より効果的にAngular2を習得することが出来る。</p>

<h3>SystemJS</h3>

<p>SystemJSは動的なモジュールローダー（NodeJSの<code>require</code>と同じような役割をもつ）である。SystemJSはES.nextの<code>import</code>、<code>export</code>に対応するのが特徴で、将来ブラウザに実装されるモジュールローダーのポリフィル的存在。これを活用すると、遅延ローディングが可能になる。必要なコンポーネントのみを都度読み込む事が可能になり、よりパフォーマンスが向上する。</p>

<p>しかし、利用は必須ではない。JavaScriptのライブラリを静的に読み込みたい場合（npmなどでダウンロードしてくる場合）は、今までどおりBrowserifyやWebpackなどが利用可能。動的ロードしたい場合のみ、SystemJSを使えば良い。</p>

<h3>RxJS</h3>

<p>Angular2を利用するにあたって必須の機能。Observableのポリフィルとして利用されている。Observableはリアクティブプログラミングに基づいた考え方であり、Promise同様に非同期処理を実現する。Angular1はPromiseで、Angular2はObservableで非同期処理がそれぞれ実装されている。両者には様々な違いがあるが、Webの非同期処理についてObservableの利点を幾つか挙げる。</p>

<p>onkeyup等のDOM Eventに関しては、連続して発生した場合に、Promiseではその発生順序を知るすべはないが、Observableではイベントの順序どおりに処理が可能になる。DOMのAnimationについては、Promiseでは一度始まるとそれが完了するまで値は取れないが、Observableでは途中で処理をキャンセルすることが可能。WebSocketの通信についても、ストリームとして順序どおりに扱うことが可能になり、Ajaxに関しては処理途中でキャンセルが可能になる。</p>

<p>このように、Webにおける非同期ではObservableの方が適しているシーンが多々ある。そのため、Angular2では非同期処理の根幹はObservableで実装されている。そのため、RxJSとObservableの修得は、Angular2を学ぶためには必須とい言える。</p>

<h3>Zone.js</h3>

<p>ZonesというES.nextに提案されている機能のポリフィル。これを利用すると、非同期処理のコンテキストを開発者が自由に設定可能になる。具体的には、setTimeout等あらゆる非同期処理の前後にフック可能なポイントを挟むことができる。</p>

<p>Webにおける非同期処理の後にはかなりの確率で何らかの変更が行われる可能性がある。例えば、Ajaxでレスポンスを受け取った後はそれを受けてModelが変更されるなど。そのため、Angular２では、Zone.jsを利用し、全ての非同期処理の後に変更検知処理を行っている。処理速度も早い。</p>

<h3>reflect-metadata</h3>

<p>リフレクションのためのAPIを追加するためのポリフィル。reflect-metadataの機能もES.nextに提案されている。Angular2は内部的にTypeScriptのコンパイルに利用している。インストールは必要だが、開発者は覚えなくても問題はない。</p>

<h2>3. Angular2を学ぶうえで必要なもの</h2>

<p>次に、Angular2を学ぶ上で理解しておくことを幾つか取り上げる。</p>

<h3>Angular2はAngular１よりシンプルになった</h3>

<p>Angular1はAPIが多すぎたため、Angular２ではかなりシンプルになった。データバインディングと双方向バインディングの設定方法、イベントハンドラの設定方法はかなりシンプルになった。また、APIについても基本的には&#8217;@Component&#8217;を覚えれば良い。</p>

<h3>Angular2はパフォーマンスが改善されている</h3>

<p>Angular1は<code>dirty-checking</code>、<code>two-way bindings</code>、<code>$digest loop</code>が遅いと言われてきたが、Angular2でChange Detection（変更検知）が革命的に変わり、パフォーマンスが改善された。</p>

<h3>Change Detection</h3>

<p>Change Detectionは、例えば、Modelのここが変更になったらViewに描画するなどの処理を行う際に必要になる。重要なのは、どこでどんな変更が起きたかを素早く検知して、それを反映すること。Angular2の変更検知メカニズムはよく考えられている。全てのコンポーネントには個別のChange Detecter（変更検知メカニズム）が存在する。そして、Angular2の全てのコンポーネントはツリー構造になっており、変更検知が必ず一方向（親から子へ）に行われるようになっている。そして、各コンポーネントでは変更検知を行うかどうかを個別に設定可能になっており、親のレベルで変更検知を停止したり、子のレベルで変更検知を停止したり、非常に柔軟で戦略的な変更検知の設定が可能になっている。</p>

<h3>Angular2では静的解析ツールが利用可能</h3>

<p>Angular1では静的解析ツールが利用できなかった。例えば、バインディングの記述に[]を利用するようになったため、機械的にバインディングかどうかのチェックが可能になっている。</p>

<h2>まとめ</h2>

<p>Angular2を学ぶためには、ES.next、Decorators、Observables、Zones等、最新のWeb標準技術について学ぶことが大前提である。Angular1の登場（2009年）から、Angular2の登場までの間に、Web標準の世界は大きく変わった。最新のAngular2がAngular1とまったく異なっているのは必然であり、この世界で生きていくには、勉強し続ける必要がある。枯れた技術にしがみついてはダメ。何もかも最新のものを使う必要はないが、最新の技術に常に目を向けて置く必要はある。</p>

<p>最後に、Angular2を使うのは素晴らしいことだが、まだベータ版であることを忘れてはならない。今後BREAKING CHANGES（破壊的変更）が発生する可能性が十分にある。そのために、チェンジログは必ず読むようにする。どうにもならなければコミットログも読む。そして、それ以上深く関わりたければ、issueを出したりPullRequestを送りましょう。それがハードルが高いと考える方は、カンファレンスに参加したり記事を書いたりしよう。開発者にTwitterで質問するのも効果的。</p>

<h1>セッションをもっと詳しく知りたい方は？</h1>

<p>以上で、セッションの書き起こしは終了です。<br />
稲富駿氏のセッション資料はこちらで公開されています。</p>

<p><a href="http://laco0416.github.io/slides/a-way-for-happy-angular-days/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Angular2の失敗しない始め方</a></p>

<p>セッション動画もYoutubeで公開されているので、ぜひご覧ください！</p>


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

]]></content:encoded>
			</item>
		<item>
		<title>Angular2実践入門〜ng-japan 2016 セッションレポート〜</title>
		<link>/yusuke-naka/18596/</link>
		<pubDate>Tue, 22 Mar 2016 02:00:01 +0000</pubDate>
		<dc:creator><![CDATA[仲 裕介]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Angular2]]></category>
		<category><![CDATA[ng-japan]]></category>

		<guid isPermaLink="false">/?p=18596</guid>
		<description><![CDATA[この記事は、「ng-japan 2016」のセッションレポート（速報）です。講演内容を忠実に再現していますが、ニュアンス等伝えきれない場合があるので、気になるところは、記事末尾に掲載の講演資料やYoutube動画でご確認...]]></description>
				<content:encoded><![CDATA[<p>この記事は、「<a href="http://ngjapan.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ng-japan 2016</a>」のセッションレポート（速報）です。講演内容を忠実に再現していますが、ニュアンス等伝えきれない場合があるので、気になるところは、記事末尾に掲載の講演資料やYoutube動画でご確認ください。</p>

<h1>Angular2実践入門 / 白石俊平氏</h1>

<p>当メディアの編集長であり、<a href="https://techfeed.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TechFeed</a>の開発者でもある白石俊平氏によるセッション。スライド40枚以上の大作でライブコーディングもあります。</p>

<p><img src="/wp-content/uploads/2016/03/shiraishi1.jpg" alt="" width="500" height="335" class="aligncenter size-full wp-image-18630" srcset="/wp-content/uploads/2016/03/shiraishi1.jpg 550w, /wp-content/uploads/2016/03/shiraishi1-300x201.jpg 300w, /wp-content/uploads/2016/03/shiraishi1-207x139.jpg 207w" sizes="(max-width: 500px) 100vw, 500px" /></p>

<h2>ライブコーディングで学ぶAngular2</h2>

<p>今日のライブコーディングを追体験できるスターターキットを作った。是非活用してほしい。
<a href="https://github.com/shumpei/angular2-webpack-starter-minimum" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">https://github.com/shumpei/angular2-webpack-starter-minimum</a><br />
  &#8211; Angular2をwebpackを利用してミニマムスタートできるプロジェクト<br />
  &#8211; 教育用途、もしくは開発環境を自作したい人向け</p>

<h3>Angular2の特徴（かなり主観）</h3>

<h4>特徴その１：TypeScriptを推奨</h4>

<p>TypeScriptを一言で言えば、ES.next全部＋型である。また、実験的なサポート扱いである「デコレーター」は、Angular2を使う上では必須となる。</p>

<h4>特徴その２：コンポーネント指向</h4>

<p>実際のコードは以下のとおり。JavaScriptとは大分変わった見た目になるのが第一印象。</p>

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

@Component({
  selector: 'my-app',
  templateUrl: '/src/components/app.component.html'
})
export class AppComponent {
}</pre><p></p>

<p><code>import</code>はモジュールをインポートする仕組み。<code>@Component</code>はデコレーターであり、これを取り付けたクラスがUIコンポーネントとなる。上記サンプルはAngular2における、UIコンポーネントの例である。UIコンポーネントは簡単にいえば、自作のタグだ。上記サンプルだと、<code>&lt;my-app&gt;</code>タグをHTMLに埋め込めるようになる。また、<code>templateUrl</code>は実際に出力するテンプレートを指定する。</p>

<p>次に、<code>my-alert-button</code>コンポーネントをライブコーディングする。</p>

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

@Component({
  selector: 'my-alert-button',
  templateUrl: '/src/components/alert-button.component.html',
})
export class AlertButtonComponent {
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;button&gt;Click me!&lt;/button&gt;</pre><p></p>

<p>作成したコンポーネントdirectivesに指定し、実際に利用する。</p>

<p></p><pre class="crayon-plain-tag">import {Component} from 'angular2/core';
import {AlertButtonComponent} from './alert-button.component';

@Component({
  selector: 'my-app',
  templateUrl: '/src/components/app.component.html',
  directives: [AlertButtonComponent],
})
export class AppComponent {
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;My first Angular2 app!&lt;/h1&gt;
&lt;my-alert-button&gt;&lt;/my-alert-button&gt;</pre><p></p>

<p>これは、ボタンを押すとアラートを発生させる処理をコンポーネントとして実装した例である。</p>

<h4>特徴その３：ちょっとキモい</h4>

<p>テンプレートのシンタックスがキモい。例えば、クリックイベントを補足する処理は、以下のように、<code>(click)="onClick()"</code>と記載し、対応するイベントハンドラは<code>onClick()</code>としてコンポーネント内に記述する。</p>

<p></p><pre class="crayon-plain-tag">&lt;button (click)="onClick()"&gt;Click me!&lt;/button&gt;</pre><p></p>

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

@Component({
  selector: 'my-alert-button',
  templateUrl: '/src/components/alert-button.component.html'
})
export class AlertButtonComponent {
  onClick(): void {
    window.alert('Hello!');
  }
}</pre><p></p>

<h4>特徴その４：Angularっぽさ</h4>

<p>Angular2とAngular1はかなり違うが、似通っているところもある。例えば、サービス/DI/ディレクティブなど用語や概念を引き継いでいる。例として、<code>loadData()</code>というstring型の配列を返すサービスを作る。</p>

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

@Injectable()
export class MyService {
  loadData(): string[] {
    return ['a', 'b', 'c'];
  }
}</pre><p></p>

<p>サービスをDIする場合は、事前準備として<code>providers</code>でサービスを指定する。実際にDIするためには、<code>AppComponent</code>クラスのコンストラクタに指定する必要がある。</p>

<p></p><pre class="crayon-plain-tag">import {Component} from 'angular2/core';
import {AlertButtonComponent} from './alert-button.component';
import {MyService} from '../services/my.service';

@Component({
  selector: 'my-app',
  templateUrl: '/src/components/app.component.html',
  directives: [AlertButtonComponent],
  providers: [MyService]
})
export class AppComponent {
  private data: string[];

  constructor(private myService: MyService) {
    this.data = myService.loadData();
  }
}</pre><p></p>

<h4>特徴その５：やっぱりキモい</h4>

<p>テンプレートでは、以下の様な記法を要素内に記述していく。</p>

<p><code>(),[],[()],#,*</code></p>

<p>全力を出すとこんな感じだ。だいぶキモい。</p>

<p><code>&lt;input *ngif="alive" [(ngMode)]="name" #name&gt;</code></p>

<p>例として、テンプレート内でループ処理を実装してみる。</p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;My first Angular2 app!&lt;/h1&gt;
&lt;my-alert-button&gt;&lt;/my-alert-button&gt;

&lt;ul&gt;
  &lt;li *ngFor="#item of data"&gt;{{item}}&lt;/li&gt;
&lt;/ul&gt;</pre><p></p>

<p>テンプレートは外部ファイル指定するのではなく、バッククォートで囲み、Component定義内に直接HTMLやCSSを記載することも可能。また、コンポーネントはCSSをカプセル化（そのコンポーネント内に閉じる）するので、コンポーネントのスタイルは外部に影響を与えない。</p>

<h2>Angular2を始めたらあなたが出会うであろう１１のこと</h2>

<p>TechFeedのモバイルアプリ版を現在開発していて、その開発でAngular2を使っている。その開発経験を基に感じたことを時系列で取り上げる。</p>

<p><a href="https://techfeed.io/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">TechFeed -テクノロジー情報に特化した情報キュレーションサービス-</a></p>

<h3>その1:ハードル高くない？</h3>

<p>使うにあたっての前提技術が多い（TypeScriptやモジュールバンドラー、RxJS）ので、当初ハードルが高そうだと感じた。前提技術が多すぎるように感じるからだ。</p>

<ul>
<li>TypeScript</li>
<li>モジュールバンドラー</li>
<li>RxJS</li>
<li>もちろんAngular2</li>
</ul>

<p>でも、意外とそうでもなかった。なぜか？</p>

<ul>
<li>Angular1の文脈を引き継いでいる（1系やったことがある人は学習コスト低め）</li>
<li>TypeScriptはJavaっぽい（もともとJava屋の人は親しみやすい）</li>
<li>RxJSは最初から詳しく知っている必要なし</li>
<li>Webpackの調整が一番時間がかかった（でも、だれか一人がやればいいのであまり気にしない）</li>
</ul>

<h3>その2:言語はどれを選ぶ？</h3>

<p>個人的には、TypeScript一択ではないかと考える。ドキュメントが完備されていて、型があり、デコレーターが使えるのが嬉しい。JavaScriptやBabelも止めはしないが、きっとTypeScriptで書くほうが楽だ。</p>

<h3>その3:モジュールバンドラーは何にする？</h3>

<p>TypeScriptを選ぶとモジュールバンドラーが必須。TechFeedでは、実績豊富等の理由からWebpackを選択した。Angular2の公式ではSystem.jsというものが使われているが、後発であり情報が少なめだったため、採用しなかった。</p>

<h3>その4:エディタは何にする？</h3>

<p>TypeScript対応のエディタやIDEは、AtomやSublime、WebStormなどいくつかある。白石は今のところAtomを使っている。</p>

<h3>その5:テンプレートをどこに書く？</h3>

<p><code>@Component</code>に直接埋め込む方法、URLで外部ファイルにする方法のほか、Webpackを使えばrequireでHTMLファイルを埋めこむこともできる。３つの方法を比較するとWebpack利用が一番柔軟性があるが、個人的には、コンポーネントとテンプレートファイルがひとまとまりになるので、埋め込み方式もわかりやすいと思う。</p>

<h3>その6:テンプレートがキモい</h3>

<p>これは慣れるしかない。ただ、慣れるには順序がある。以下のように、Angular2が指定する新しいメンタルモデルを理解すれば、少しは楽になる。</p>

<ul>
<li>こいつはHTMLじゃない。HTML Plusだ</li>
<li>タグの属性とプロパティはそもそも似て非なるもの</li>
<li><code>[]</code>は属性ではなくプロパティを指している</li>
<li>属性ってやつは、プロパティの初期化にすぎない</li>
</ul>

<h3>その7:Sassを使いたい</h3>

<p>モジュールバンドラーの機能を駆使すれば、Sass/Less等もコンポーネントで利用することができる。Webpack側でSassのコンパイル設定を行っておけば、scssファイルをコンポーネントでrequireするだけで利用可能。</p>

<h3>その8:RxJSとのつきあい方</h3>

<p>RxJSはリアクティブプログラミング用ライブラリである。Angular2はHTTPやEventEmitterなどの頻出APIがRxJS前提（Observable利用前提）である。ObservableはES7にも提案されているため、この機会に勉強するのは良いかもしれない。なお、Angular2はRxJS５（beta）を利用している。</p>

<h3>その9:ページネーションしたい</h3>

<p>よくあるユースケースだが世界中が現在実装方法を模索中。TechFeedでは、Observableの簡単なラッパーを作った。もう少し使い勝手を良くしてOSSで公開したいと考えている。</p>

<h3>その10:UIフレームワークを使いたい</h3>

<p>TechFeedでは、Ionic2を採用した。Ionic2はAngular2で完全にリライトされているので、Angular2開発の参考にもなる。その他にも、Angular2対応のUIフレームワークとして、Onsen UI2.0や、angular-material2、ng2-bootstrap等がある。</p>

<h3>その11:コンポーネント設計</h3>

<p>コンポーネントの粒度や振る舞い、状態をどこに配置するかは、現在熱い話題。<a href="https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0#.wsd00zwq4" target="-blank" data-wpel-link="external" rel="follow external noopener noreferrer">Presentational and Container Component</a>という議論の土台があるが、これがあるからといって全て解決するわけではないので、やはり悩ましい。（全て外部に移譲するのか？面倒くさくない？…等） 個人的に唯一の正解は、「必要になるまで分割するな」だと考えている。</p>

<h1>セッションをもっと詳しく知りたい方は？</h1>

<p>以上で、セッションの書き起こしは終了です。<br />
白石俊平氏のセッション資料はこちらで公開されています。</p>

<iframe src="//www.slideshare.net/slideshow/embed_code/key/sqJvihresqQt7F" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>

<div style="margin-bottom:5px"> <strong> <a href="https://html5experts.jp//www.slideshare.net/shumpei/angular2-59809652" title="Angular2実践入門" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Angular2実践入門</a> </strong> from <strong><a target="_blank" href="//www.slideshare.net/shumpei" data-wpel-link="external" rel="follow external noopener noreferrer">Shumpei Shiraishi</a></strong> </div>

<p><BR>セッション動画もYoutubeで公開されているので、ぜひご覧ください！</p>


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


<p>※白石俊平氏の講演開始時間から再生されます</p>
]]></content:encoded>
			</item>
	</channel>
</rss>
