<?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>Angular2 &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/angular2/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>モバイルUIフレームワークのド本命、Onsen UI 2正式リリース！──React, Angular 2両対応！</title>
		<link>/n_matagawa/20766/</link>
		<pubDate>Wed, 05 Oct 2016 00:19:13 +0000</pubDate>
		<dc:creator><![CDATA[又川 尚樹]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[Angular2]]></category>
		<category><![CDATA[Onsen UI 2]]></category>
		<category><![CDATA[React]]></category>

		<guid isPermaLink="false">/?p=20766</guid>
		<description><![CDATA[連載： React/Angular2時代のWeb開発 (1)先日、本サイトにて公開された React/Angular2時代のUIフレームワーク考──Ionic2、Onsen UI2を語る という記事を受けて、本記事ではO...]]></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> (1)</div><p>先日、本サイトにて公開された <a href="https://html5experts.jp/shumpei-shiraishi/20411/" data-wpel-link="internal">React/Angular2時代のUIフレームワーク考──Ionic2、Onsen UI2を語る</a> という記事を受けて、本記事ではOnsen UI 2の具体的な使い方をご紹介していきたいと思います。</p>

<h2>Onsen UI 2 の概要</h2>

<p><img src="/wp-content/uploads/2016/09/blog_onsen_2.png" alt="blog_onsen_2"></p>

<p><a href="https://onsen.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI</a>はアシアル株式会社が2013年から公開している<a href="https://github.com/OnsenUI/OnsenUI" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">オープンソース</a>のHTML5 UIライブラリです。
HTML5モバイルアプリでの利用に特化した高速な動作性が特徴です。</p>

<p>2016/09/15（日本時間）に次期バージョン「<strong>Onsen UI 2</strong>」の正式版をリリースしました。
AngularJSのロードが必要だったOnsen UI 1と異なり、Onsen UI 2は<strong>単体で動作</strong> します（Web 標準の Custom Elements を利用しています）。</p>

<p>また、Android向けの画面とiOS向けの画面をワンソースで構築できる<strong>Automatic Styling</strong>などの新機能を備えています。</p>

<p><img src="/wp-content/uploads/2016/09/onsen-ui2-automatic-styling.png" alt="onsen-ui2-automatic-styling"></p>

<h2>Hello, World</h2>

<p>空ディレクトリを作成し、以下のコマンドで<code>onsenui</code>パッケージをインストールします。</p>

<p></p><pre class="crayon-plain-tag">npm init --yes
npm install onsenui@2.0.0 --save</pre><p></p>

<p>次に、<code>index.html</code>を以下の内容で作成します。</p>

<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html lang="ja"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"&gt;
    &lt;meta http-equiv="Content-Security-Policy" content="default-src * data:; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'"&gt;
    &lt;link rel="stylesheet" href="node_modules/onsenui/css/onsenui.css"&gt;
    &lt;link rel="stylesheet" href="node_modules/onsenui/css/onsen-css-components.css"&gt;
    &lt;script src="node_modules/onsenui/js/onsenui.min.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;ons-page&gt;
        &lt;ons-toolbar&gt;
            &lt;div class="center"&gt;Onsen UI&lt;/div&gt;
        &lt;/ons-toolbar&gt;

        &lt;div style="text-align: center;"&gt;
            &lt;p&gt;Hello World!&lt;/p&gt;
            &lt;ons-button onclick="ons.notification.alert('Onsen UI alert');"&gt;Click Me!&lt;/ons-button&gt;
        &lt;/div&gt;
    &lt;/ons-page&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p><code>head</code>要素内で読み込まれている<code>onsenui.css</code>, <code>onsen-css-components.css</code>, <code>onsenui.min.js</code>がOnsen UI 2の実体です。</p>

<p>上記3つのファイルの読み込みが完了すると、<code>ons-page</code> や <code>ons-toolbar</code>といった要素がブラウザに登録され、<strong>元々ブラウザに組み込まれている<code>input</code>要素などと同じ感覚で使えるようになります</strong>。</p>

<p>最終的なディレクトリ構成は以下のようになります。</p>

<p></p><pre class="crayon-plain-tag">├── index.html
├── node_modules
│   └── onsenui
└── package.json</pre><p></p>

<p>ブラウザで<code>index.html</code>を開くと以下のような画面が表示されているはずです。
ボタンをクリックするとOnsen UI製のダイアログ（<code>ons-alert-dialog</code> 要素）が表示されます。</p>

<p><img src="/wp-content/uploads/2016/09/onsen-ui2-purejs-01-aligned.png" alt="onsen-ui2-purejs-01-aligned">
<img src="/wp-content/uploads/2016/09/onsen-ui2-purejs-02-aligned.png" alt="onsen-ui2-purejs-02-aligned"></p>

<p>このようにOnsen UI 2は、特殊な知識を必要とすることなく、少しの準備ですぐに使い始めることができます。</p>

<p>なお、今回使用した<code>ons-page</code>, <code>ons-toolbar</code>, <code>ons-button</code>, <code>ons-alert-dialog</code>以外にも、Onsen UI 2はモバイルアプリに不可欠なコンポーネントを数多く揃えています（以下はその例です）。</p>

<p><img src="/wp-content/uploads/2016/09/onsen-ui2-components-02.png" alt="onsen-ui2-components-02"></p>

<p>使用可能なコンポーネントの一覧は <a href="https://onsen.io/v2/docs/js.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI 2 Docs</a> にあります。Onsen UI 2を使った開発では、使用可能なコンポーネントとその使い方を公式ドキュメントから探しながら画面を実装していくことになります。</p>

<h2>アプリケーションフレームワークと併用する</h2>

<p>発展的な内容として、Onsen UI 2をアプリケーションフレームワークと併用する方法について解説します。</p>

<p>Onsen UI 2の特徴は<strong>任意のアプリケーションフレームワークと併用できる</strong>点です。実際、React, AngularJS, Angular2, Vue.js, Meteorと一緒に動作させても問題なく動作することを確認しています。</p>

<p>しかし Onsen UI 2のコンポーネントは <code>input</code> 要素などと同じく、DOM要素自体にメソッドが紐づけられているため、<strong>Onsen UI 2単体では</strong>コンポーネントを操作する際にDOM要素への直接アクセスが必要になってしまいます。DOM要素への直接アクセスは、ReactやAngular2などといったDOM要素への直接アクセスを忌避するアプリケーションフレームワークにおいて問題となります。</p>

<p>その問題の解決策として、Onsen UI 2は一部のアプリケーションフレームワークに対して<strong>バインディング</strong>を用意しています。</p>

<p>バインディングを利用すると、DOM要素への直接アクセスを回避し、<strong>各アプリケーションフレームワークの流儀に則って</strong> Onsen UI 2のコンポーネントを操作することができます。</p>

<p>2016/09現在、Onsen UI 2は <a href="https://onsen.io/react/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">React</a>, <a href="https://onsen.io/angular2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AngularJS</a>, <a href="https://onsen.io/angular2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Angular 2</a>, <a href="https://onsen.io/vue/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Vue.js</a> の4種類のアプリケーションフレームワークに対してバインディングを提供しています。</p>

<h3>React と併用する</h3>

<p>Onsen UI 2をReactと併用する場合は <code>react-onsenui</code> パッケージ（<strong>React バインディング</strong>）を使用します。</p>

<p>空ディレクトリを作成し、以下のコマンドで必要なパッケージをインストールします。</p>

<p></p><pre class="crayon-plain-tag">npm init --yes

# Onsen UI本体
npm install onsenui@2.0.0 --save

# アプリケーションフレームワーク （React）
npm install react react-dom --save

# Onsen UIのReactバインディング
npm install react-onsenui@1.0.0 --save

# トランスパイラ （Babel）
npm install babel-core@^5 --save</pre><p></p>

<p>次に、<code>index.html</code> を以下の内容で作成します。</p>

<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html lang="ja"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"&gt;
    &lt;meta http-equiv="Content-Security-Policy" content="default-src * data:; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'"&gt;
    &lt;link rel="stylesheet" href="node_modules/onsenui/css/onsenui.css"&gt;
    &lt;link rel="stylesheet" href="node_modules/onsenui/css/onsen-css-components.css"&gt;
    &lt;script src="node_modules/onsenui/js/onsenui.min.js"&gt;&lt;/script&gt;
    &lt;script src="node_modules/react/dist/react.min.js"&gt;&lt;/script&gt;
    &lt;script src="node_modules/react-dom/dist/react-dom.min.js"&gt;&lt;/script&gt;
    &lt;script src="node_modules/react-onsenui/dist/react-onsenui.js"&gt;&lt;/script&gt;
    &lt;script src="node_modules/babel-core/browser.min.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div id="app"&gt;&lt;/div&gt;

    &lt;script type="text/babel"&gt;
        var App = React.createClass({
            alertPopup: function() {
                ons.notification.alert('Onsen UI alert');
            },

            renderToolbar: function() {
                return (
                    &lt;Ons.Toolbar&gt;
                        &lt;div className='center'&gt;Onsen UI&lt;/div&gt;
                    &lt;/Ons.Toolbar&gt;
                );
            },

            render: function() {
                return (
                    &lt;Ons.Page renderToolbar={this.renderToolbar}&gt;
                        &lt;div style={{textAlign: 'center'}}&gt;
                            &lt;p&gt;Hello World!&lt;/p&gt;
                            &lt;Ons.Button onClick={this.alertPopup}&gt;Click Me!&lt;/Ons.Button&gt;
                        &lt;/div&gt;
                    &lt;/Ons.Page&gt;
                );
            },
        });
        
        ReactDOM.render(&lt;App /&gt;, document.getElementById('app'));
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p>最終的なディレクトリ構成は以下のようになります。</p>

<p></p><pre class="crayon-plain-tag">├── index.html
├── node_modules
│   ├── babel-core
│   ├── onsenui
│   ├── react
│   ├── react-dom
│   └── react-onsenui
└── package.json</pre><p></p>

<p>ブラウザで <code>index.html</code> を開くと先ほどと同様の画面が表示されているはずです。</p>

<h3>Angular 2と併用する</h3>

<p>Angular 2をReactと併用する場合はangular2-onsenuiパッケージ（<strong>Angular 2 バインディング</strong>）を使用します。</p>

<p>空ディレクトリを作成し、以下のコマンドで必要なパッケージ・型定義ファイルをインストールします。</p>

<p></p><pre class="crayon-plain-tag">npm init --yes

# Onsen UI本体
npm install onsenui@2.0.0 --save

# Angular 2 アプリのビルドに使用するツール
npm install --global typescript
npm install --global typings
npm install --global webpack

# Angular 2の動作に必要なライブラリ （polyfill）
npm install core-js --save
npm install reflect-metadata --save
npm install zone.js --save
npm install rxjs --save

# Angular 2本体
npm install @angular/core@2.0.0 --save
npm install @angular/common@2.0.0 --save
npm install @angular/compiler@2.0.0 --save
npm install @angular/platform-browser@2.0.0 --save
npm install @angular/platform-browser-dynamic@2.0.0 --save

# Onsen UIのAngular 2バインディング
npm install angular2-onsenui@1.0.0-rc.1 --save

# Angular 2アプリのビルドに必要な型定義ファイル
typings install --global dt~core-js#0.0.0+20160725163759</pre><p></p>

<p>次に<code>main.ts</code>を以下の内容で作成します。</p>

<p></p><pre class="crayon-plain-tag">import { NgModule, CUSTOM_ELEMENTS_SCHEMA, Component } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { OnsenModule, onsNotification } from 'angular2-onsenui';

@Component({
    selector: 'app-root',
    template: `
        &lt;ons-page&gt;
            &lt;ons-toolbar&gt;
                &lt;div class="center"&gt;Onsen UI&lt;/div&gt;
            &lt;/ons-toolbar&gt;

            &lt;div style="text-align: center;"&gt;
                &lt;p&gt;Hello World!&lt;/p&gt;
                &lt;ons-button (click)="alertPopup()"&gt;Click Me!&lt;/ons-button&gt;
            &lt;/div&gt;
        &lt;/ons-page&gt;
    `,
})
export class AppComponent {
    alertPopup() {
        onsNotification.alert('Onsen UI alert');
    }
}

@NgModule({
  imports:      [ OnsenModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ],
  schemas:      [ CUSTOM_ELEMENTS_SCHEMA ],
})
export class AppModule {
}

platformBrowserDynamic().bootstrapModule(AppModule);</pre><p></p>

<p>次に以下のコマンドを実行します。</p>

<p></p><pre class="crayon-plain-tag">tsc --init</pre><p></p>

<p>生成された <code>tsconfig.json</code> を以下の内容に書き換えます。</p>

<p></p><pre class="crayon-plain-tag">{
    "compilerOptions": {
        "moduleResolution": "node",
        "module": "commonjs",
        "target": "es5",
        "noImplicitAny": false,
        "sourceMap": false,
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true
    },
    "exclude": [
        "node_modules"
    ]
}</pre><p></p>

<p>次に以下のコマンドで <code>main.bundle.js</code> を生成します。</p>

<p></p><pre class="crayon-plain-tag"># トランスパイル
tsc

# バンドル
webpack main.js main.bundle.js</pre><p></p>

<p>最後に <code>index.html</code> を以下の内容で作成します。</p>

<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html lang="ja"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"&gt;
    &lt;meta http-equiv="Content-Security-Policy" content="default-src * data:; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'"&gt;
    &lt;link rel="stylesheet" href="node_modules/onsenui/css/onsenui.css"&gt;
    &lt;link rel="stylesheet" href="node_modules/onsenui/css/onsen-css-components.css"&gt;
    &lt;script src="node_modules/onsenui/js/onsenui.min.js"&gt;&lt;/script&gt;
    &lt;script src="node_modules/reflect-metadata/Reflect.js"&gt;&lt;/script&gt;
    &lt;script src="node_modules/zone.js/dist/zone.min.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;app-root&gt;&lt;/app-root&gt;

    &lt;script src="main.bundle.js"&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p>最終的なディレクトリ構成は以下のようになります。</p>

<p></p><pre class="crayon-plain-tag">├── index.html
├── tsconfig.json
├── main.ts
├── main.js
├── main.bundle.js
├── node_modules
│   ├── @angular
│   │   ├── common
│   │   ├── compiler
│   │   ├── core
│   │   ├── platform-browser
│   │   └── platform-browser-dynamic
│   ├── angular2-onsenui
│   ├── core-js
│   ├── onsenui
│   ├── reflect-metadata
│   ├── rxjs
│   └── zone.js
├── package.json
└── typings
    ├── globals
    │   └── core-js
    └── index.d.ts</pre><p></p>

<p>ブラウザで<code>index.html</code>を開くと先ほどと同様の画面が表示されているはずです。</p>

<h2>まとめ</h2>

<p>本記事ではOnsen UI 2の具体的な使い方を紹介しました。また、発展的な内容として、Onsen UI 2をReact, Angular 2と併用する方法について解説しました。</p>

<p>アプリケーションフレームワークの進化やUIライブラリの充実により、HTML5によるモバイルアプリの実装の敷居は下がり続けています。</p>

<p>ハイブリッドアプリに続いてProgressive Web Appsが話題となる中、そこで必要となるモバイルアプリライクな UI/UX の実装に対する一つの解として、是非Onsen UI 2を活用していただければと思います。</p>

<p>（追伸: 先日Twitterに<a href="https://twitter.com/Onsen_UI_ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@Onsen_UI_ja</a>を開設しました。日本語での技術的な質問はこちらまでどうぞ）</p>
]]></content:encoded>
		
		<series:name><![CDATA[React/Angular2時代のWeb開発]]></series:name>
	</item>
		<item>
		<title>キミはNativeScriptを知っているか？Angular2でネイティブモバイルアプリが書けるぞ！</title>
		<link>/albatrosary/20691/</link>
		<pubDate>Fri, 09 Sep 2016 02:42:17 +0000</pubDate>
		<dc:creator><![CDATA[佐川 夫美雄]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Angular2]]></category>
		<category><![CDATA[NativeScript]]></category>

		<guid isPermaLink="false">/?p=20691</guid>
		<description><![CDATA[連載： Web技術でアプリ開発2016 (4)Web技術でアプリ開発2016特集・第4弾は、JavaScript（およびTypeScript）によるクロスプラットフォーム開発が可能ながらネイティブと同様の実行速度を得られ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/web-based-apps-2016/" class="series-391" title="Web技術でアプリ開発2016" data-wpel-link="internal">Web技術でアプリ開発2016</a> (4)</div><p>Web技術でアプリ開発2016特集・第4弾は、JavaScript（およびTypeScript）によるクロスプラットフォーム開発が可能ながらネイティブと同様の実行速度を得られる、<a href="http://www.telerik.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Telerik</a>社の<a href="https://www.nativescript.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">NativeScript</a>を取り上げたいと思います。</p>

<p>NativeScriptは、Angular2とも組み合わせて使うことができる、現在注目のフレームワークです。本記事では、XMLによるUI定義を行う従来の開発手法だけではなく、Angular2（ただし、RC4という少し古いバージョン）と組み合わせてモバイルアプリを開発する方法まで網羅してご紹介します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/NativeScript_logo.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/NativeScript_logo.png" alt="NativeScript_logo" width="300" height="300" class="alignnone size-full wp-image-20730" srcset="/wp-content/uploads/2016/09/NativeScript_logo.png 300w, /wp-content/uploads/2016/09/NativeScript_logo-150x150.png 150w, /wp-content/uploads/2016/09/NativeScript_logo-207x207.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h1>NativeScriptの概要</h1>

<p><a href="https://www.nativescript.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">NativeScript 2.0</a>は、JavaScriptとCSSを使用し、ネイティブのiOSとAndroidのアプリを構築するためのフレームワークです。ネイティブで実行されるパフォーマンスとUXを提供し、その結果、ネイティブプラットフォームのレンダリングエンジンを使ってUIを構築します。WebViewsでのUIレンダリングはしていません。</p>

<p>NativeScriptには<a href="https://www.npmjs.com/package/tns-core-modules" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">tns-core-modules</a>というコアモジュールがあり、上記に述べたJavaScriptからネイティブへの変換を行っています。NativeScriptのgithubリポジトリを見ると「0.9.0」のリリースが「5 Mar 2015」なので、約1年とちょっとの歳月が経過していることになります。現時点での最新バージョンは「2.2.1」です。</p>

<p>NativeScriptでAngular2を利用する場合には、まず、Angular2のテンプレート（@Component.template）に、NativeScriptで提供しているディレクティブを記述します。そして、上記で説明したtns-core-modulesと<a href="https://www.npmjs.com/package/nativescript-angular" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">nativescript-angular</a>を利用してNativeScriptがビルドを行い、iOSやAndroidのネイティブコードを生成します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/4bd44303086f2a767d223e68d2da08ae.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/4bd44303086f2a767d223e68d2da08ae-300x129.png" alt="nativescript-angular" width="300" height="129" class="alignnone size-medium wp-image-20694" srcset="/wp-content/uploads/2016/09/4bd44303086f2a767d223e68d2da08ae-300x129.png 300w, /wp-content/uploads/2016/09/4bd44303086f2a767d223e68d2da08ae.png 640w, /wp-content/uploads/2016/09/4bd44303086f2a767d223e68d2da08ae-207x89.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>「NativeScript with Angular2」の最初の「v0.3.0」がリリースされたのが今年8月初旬で、最新は「v0.3.1」です。</p>

<p>この記事では、macOS上での開発を前提に解説をしています。</p>

<h1>インストール</h1>

<p>インストール手順は<a href="http://docs.nativescript.org/start/quick-setup" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">quick-setup</a>にも書かれている通り、あまり複雑なところはありません。しかし、もしAndroid SDKをはじめて利用する場合には少し戸惑うと思います（私もNativeScriptのあまりやさしいとはいえないエラーメッセージにちょっと苦しみました）ので、順を追って説明します。</p>

<ul>
<li>ステップ1: Rubyのインストール</li>
<li>ステップ2: Node.jsのインストール</li>
<li>ステップ3: NativeScript CLIのインストール</li>
<li>ステップ4: iOSとAndroid開発に必要なもののインストール</li>
</ul>

<h2>ステップ1: Rubyのインストール</h2>

<p>NativeScriptをビルドするとき、Rubyを利用します。Rubyのバージョンは2.2以降が必要ですが、macOSにデフォルトでインストールされているRubyは古いため、<code>Homebrew</code>を使って最新バージョンをインストールします。最新のRubyが入っている方は読み飛ばして下さい。</p>

<h3>Homebrewのインストール</h3>

<p><a href="http://brew.sh/index_ja.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Homebrew</a>はRubyを使いインストールし、インストール後環境変数を定義します。</p>

<p></p><pre class="crayon-plain-tag">$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew update
$ echo 'export PATH=/usr/local/bin:$PATH' &gt;&gt; .bash_profile
$ source .bash_profile</pre><p></p>

<h3>rbenvとruby-buildのインストール</h3>

<p>brewを使って<a href="https://github.com/rbenv/rbenv" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">rbenv</a>と<a href="https://github.com/rbenv/ruby-build" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ruby-build</a>をインストールします。rbenvを使ってRubyのバージョン管理を行います。ruby-buildはrbenvのプラグインで、異なるバージョンのRubyをコンパイルし、インストールするためのものです。</p>

<p></p><pre class="crayon-plain-tag">$ brew install rbenv ruby-build
$ echo 'eval "$(rbenv init -)"' &gt;&gt; ~/.bash_profile
$ source ~/.bash_profile
$ rbenv --version
$ rbenv install -l
$ rbenv install 2.2.3
$ rbrnv version
$ rbenv global 2.2.3
$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin15]
$</pre><p></p>

<h2>ステップ2: Node.jsのインストール</h2>

<p><code>Node.js</code>はv4.0.0以降を利用する必要があります。<code>rbenv</code>と同様にバージョン管理システムをインストールします。<code>Node.js</code>のバージョン管理システムには<a href="https://github.com/hokaccha/nodebrew" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">nodebrew</a>, <a href="https://github.com/marcelklehr/nodist" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">nodist</a>, <a href="https://github.com/creationix/nvm" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">nvm</a>, <a href="https://github.com/coreybutler/nvm-windows" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">nvm-windows</a>などいくつかありますが、筆者は<code>nodebrew</code>を好んで利用しています。</p>

<h3>nodebrew のインストール</h3>

<p>curlを使ってインストールを行います。インストールが完了するとパスを追加するようにメッセージが表示されますので、.bash_profile に登録してください。</p>

<p></p><pre class="crayon-plain-tag">$ curl -L git.io/nodebrew | perl - setup
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' &gt;&gt; .bash_profile
$ source .bash_profile</pre><p></p>

<h3>Node.jsのインストール</h3>

<p>続いて、Node.jsをインストールします。<code>nodebrew ls-remote</code>コマンドを使ってバージョンを確認し、<code>nodebrew install-binary</code>コマンドを使ってNode.jsのインストールを行います。利用するバージョンを動かす場合には<code>nodebrew use</code>コマンドを実行します。</p>

<p>今回、Node.jsのバージョンとしては<code>v5.12.0</code>を利用しました。</p>

<p></p><pre class="crayon-plain-tag">$ nodebrew ls-remote
$ nodebrew install-binary v5.12.0
$ nodebrew use v5.12.0
$ node -v
v5.12.0
$</pre><p></p>

<h2>ステップ3: NativeScript CLIのインストール</h2>

<p>いよいよNativeScriptのインストールです。<code>npm</code>コマンドを使って<code>nativescript</code>をグローバルインストールします。<code>nativescript</code>はスカッフォールディング（コード雛形の自動生成）を提供するモジュールで、<code>tns</code>コマンドによって実行されます。</p>

<p><code>tns</code>コマンドを実行して、インストールが正しく行われているか確認しましょう。参考までに<code>tns</code>コマンドで出力される内容は<code>tns --help</code>と同じ内容です。<code>tns</code>コマンドでは主に</p>

<ul>
<li>テンプレートからプロジェクトの生成</li>
<li>プロジェクトへの生成プラットフォーム(iOS, Android)の追加</li>
<li>JavaScriptからネイティブへのビルド</li>
<li>エミュレータの実行</li>
</ul>

<p>を行います</p>

<p></p><pre class="crayon-plain-tag">$ npm install nativescript -g
$ tns
# NativeScript
┌─────────┬─────────────────────────────────────────────────────────────────────┐
│ Usage   │ Synopsis                                                            │
│ General │ $ tns  [Command Parameters] [--command ]                            │
│ Alias   │ $ nativescript  [Command Parameters] [--command ]                   │
└─────────┴─────────────────────────────────────────────────────────────────────┘

・・・

$</pre><p></p>

<h2>ステップ4: iOSとAndroid開発に必要なもののインストール</h2>

<h3>JDKのインストール</h3>

<p>JDKはバージョンが8以降のものをインストールしてください。インストールが完了したら、<code>.bash_profile</code>に設定を登録してください。</p>

<p></p><pre class="crayon-plain-tag">$ echo 'export JAVA_HOME=$(/usr/libexec/java_home)' &gt;&gt; .bash_profile
$ source .bash_profile</pre><p></p>

<h3>Android開発環境のインストール</h3>

<p>Android SDKをHomebrewからインストールし、変数<code>ANDROID_HOME</code>を定義します.</p>

<p></p><pre class="crayon-plain-tag">$ brew install android-sdk
$ echo 'export ANDROID_HOME=/usr/local/Cellar/android-sdk/24.4' &gt;&gt; .bash_profile
$ echo 'export PATH=$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools' &gt;&gt; .bash_profile
$ source .bash_profile</pre><p></p>

<h4>Androidエミュレータのインストール</h4>

<p>android-sdkのインストールが終わったら、実際に利用するエミュレータを定義します。<code>android-sdk</code>がインストールされているディレクトリへ移動し、<code>andorid avd</code>を実行することで設定を行います。<code>android-sdk</code>以下のディレクトリ構成は次の通りです。</p>

<p></p><pre class="crayon-plain-tag">$ cd /usr/local/Cellar/android-sdk/24.4
$ tree -L 1
.
├── INSTALL_RECEIPT.json
├── README
├── add-ons -&gt; ../../../var/lib/android-sdk/add-ons
├── bin
├── build-tools
├── etc
├── extras -&gt; ../../../var/lib/android-sdk/extras
├── platform-tools
├── platforms -&gt; ../../../var/lib/android-sdk/platforms
├── samples -&gt; ../../../var/lib/android-sdk/samples
├── sources -&gt; ../../../var/lib/android-sdk/sources
├── system-images -&gt; ../../../var/lib/android-sdk/system-images
├── temp -&gt; ../../../var/lib/android-sdk/temp
└── tools</pre><p></p>

<p>Androidエミュレータを高速化するためのハードウェア支援環境「Intel Hardware Accelerated Execution Manager (Intel® HAXM) 」を事前にインストールします。次のスクリプトを実行してください。</p>

<p></p><pre class="crayon-plain-tag">$ cd /usr/local/Cellar/android-sdk/24.4/extras/intel/Hardware_Accelerated_Execution_Manager
$ sudo ./silent_install.sh</pre><p></p>

<p>完了したら、<code>android avd</code>を起動し、事前にエミュレータ定義を登録します。</p>

<p></p><pre class="crayon-plain-tag">$ cd /usr/local/Cellar/android-sdk/24.4/tools
$ ./android avd</pre><p></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/08745f58e1623aad624c9c147ce67bdf.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/08745f58e1623aad624c9c147ce67bdf-300x226.png" alt="android avd" width="300" height="226" class="alignnone size-medium wp-image-20697" srcset="/wp-content/uploads/2016/09/08745f58e1623aad624c9c147ce67bdf-300x226.png 300w, /wp-content/uploads/2016/09/08745f58e1623aad624c9c147ce67bdf.png 640w, /wp-content/uploads/2016/09/08745f58e1623aad624c9c147ce67bdf-207x156.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>この設定を忘れると<a href="https://github.com/NativeScript/android-runtime/issues/533" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">「Cannot read property &#8216;targetNum&#8217; of undefined」というエラーが出ます</a>。</p>

<p>参考までに、今回利用しているエミュレータは次のように定義しています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/92e741b3229f54ad2ccec77a5d994344.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/92e741b3229f54ad2ccec77a5d994344-300x250.png" alt="スクリーンショット 2016-09-06 14.11.30" width="300" height="250" class="alignnone size-medium wp-image-20698" srcset="/wp-content/uploads/2016/09/92e741b3229f54ad2ccec77a5d994344-300x250.png 300w, /wp-content/uploads/2016/09/92e741b3229f54ad2ccec77a5d994344.png 640w, /wp-content/uploads/2016/09/92e741b3229f54ad2ccec77a5d994344-207x173.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>よくあるトラブルとしては、Dockerを起動しているようなら終了させておくのが無難です。Dockerが利用しているポートとエミュレータが利用するポートがぶつかり、実行できないことがあります。</p>

<h3>iOS開発環境のインストール</h3>

<p>macOSを利用されていれば、iOSのエミュレータを利用するのは容易だと思います。</p>

<h4>Command Line Tools for Xcode</h4>

<p></p><pre class="crayon-plain-tag">$ sudo gem install xcodeproj
$ sudo gem install cocoapods
$ brew install xcproj</pre><p></p>

<p>だいぶ長くなりましたが、これで開発環境の設定は完了です。尚、tnsコマンドには<code>tns doctor</code>というコマンドがあります。環境設定などうまくできているかのチェックができますので、一通り終わった後に実行し、漏れがないかを確認します。</p>

<p></p><pre class="crayon-plain-tag">$ tns doctor
Verifying CocoaPods. This may take more than a minute, please be patient.
  ◡ Installing iOS runtime.tns-ios@2.2.1 ../../../../../../var/folders/ts/n268b_qx2j7g3ykzkqlj3jt00000gn/T/nativescript-check-cocoapods11686-1391-akcqo6/node_modules/tns-ios
  ◝ Verifying CocoaPods. This may take some time, please be patient..
Your components are up-to-date.

No issues were detected.
$</pre><p></p>

<h1>NativeScriptで作るHello World</h1>

<p>ここではNativeScriptを使ってHello World的なアプリケーションを作成します。手順は</p>

<ol>
<li>プロジェクトの作成</li>
<li>プラットフォームのインストール</li>
<li>エミュレータの実行</li>
</ol>

<p>です。NativeScriptでのアプリケーション作成には<code>tns</code>コマンドを使います。</p>

<p>今、プロジェクトを<code>MyFirstNativeScriptApp</code>としますので、iOSとAndroidアプリケションの両方を作成する場合にはiOSとAndroidのプラットフォーム用ライブラリをインストールしエミュレートを起動します。</p>

<p></p><pre class="crayon-plain-tag">$ cd ~
$ tns create MyFirstNativeScriptApp
$ cd MyFirstNativeScriptApp
$ tns platform add android
$ tns platform add ios
$ tns run android --emulator
$ tns run ios --emulator</pre><p></p>

<p>Androidエミュレータでの実行結果</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/MyFirstNativeScriptApp-Android.gif" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/MyFirstNativeScriptApp-Android.gif" alt="MyFirstNativeScriptApp-Android" width="200" height="300" class="alignnone size-medium wp-image-20720" /></a></p>

<p>iOSエミュレータでの実行結果</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/MyFirstNativeScriptApp-iOS.gif" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/MyFirstNativeScriptApp-iOS.gif" alt="MyFirstNativeScriptApp-iOS" width="200" height="300" class="alignnone size-medium wp-image-20721" /></a></p>

<p><code>tns create MyFirstNativeScriptApp</code>で作成されたファイルを確認します。</p>

<p></p><pre class="crayon-plain-tag">$ tree -L 2
.
├── app
│   ├── App_Resources
│   ├── app.css
│   ├── app.js
│   ├── main-page.js
│   ├── main-page.xml
│   ├── main-view-model.js
│   ├── package.json
│   └── references.d.ts
├── node_modules
│   ├── babel-traverse
│   ├── babel-types
│   ├── babylon
│   ├── lazy
│   ├── tns-core-modules
│   └── tns-core-modules-widgets
├── package.json
└── platforms
    ├── android
    └── ios</pre><p></p>

<p>このアプリケーションで特に重要なファイルがありますので、簡単に説明します。</p>

<ul>
<li>app.js</li>
<li>main-page.xml</li>
<li>main-page.js</li>
<li>main-view-model.js</li>
</ul>

<p><code>app.js</code>はアプリケーションが一番最初にロードするエントリーポイントで、このファイルからアプリケーション<code>main-page.js</code>の呼び出しを行っています。</p>

<p></p><pre class="crayon-plain-tag">// app.js
var application = require("application");
application.start({ moduleName: "main-page" });</pre><p></p>

<p></p><pre class="crayon-plain-tag">// main-page.js
var createViewModel = require("./main-view-model").createViewModel;

function onNavigatingTo(args) {
  var page = args.object;
  page.bindingContext = createViewModel();
}
exports.onNavigatingTo = onNavigatingTo;</pre><p></p>

<p><code>main-page.xml</code>は画面をXMLで定義し、関連する処理を<code>main-view-model.js</code>に定義してます。</p>

<p></p><pre class="crayon-plain-tag">&lt;!-- main-page.xml --&gt;
&lt;Page xmlns="http://schemas.nativescript.org/tns.xsd" navigatingTo="onNavigatingTo"&gt;
  &lt;StackLayout&gt;
    &lt;Label text="Tap the button" class="title"/&gt;
    &lt;Button text="TAP" tap="{{ onTap }}" /&gt;
    &lt;Label text="{{ message }}" class="message" textWrap="true"/&gt;
  &lt;/StackLayout&gt;
&lt;/Page&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">// main-view-model.js
var Observable = require(&quot;data/observable&quot;).Observable;

function getMessage(counter) {
  if (counter &lt;= 0) {
    return &quot;Hoorraaay! You unlocked the NativeScript clicker achievement!&quot;;
  } else {
    return counter + &quot; taps left&quot;;
  }
}

function createViewModel() {
  var viewModel = new Observable();
  viewModel.counter = 42;
  viewModel.message = getMessage(viewModel.counter);

  viewModel.onTap = function() {
    this.counter--;
    this.set(&quot;message&quot;, getMessage(this.counter));
  }

  return viewModel;
}

exports.createViewModel = createViewModel;</pre><p></p>

<h2>テンプレートを使って簡単なアプリケーションを作成する</h2>

<p>NativeScriptには、テンプレートを使ってプロジェクトを生成する機能があります。</p>

<p></p><pre class="crayon-plain-tag">$ tns create [Project Name] --template [Template Name]</pre><p></p>

<p>繰り返しになりますが、テンプレートを作成した後「プラットフォームのインストール」「エミュレータの実行」を行うとエミュレートで実行確認ができます。</p>

<p>このテンプレートはnpmに登録されています。が、まだあまり多くのテンプレートは定義されていないようです。その中から開発時に利用できそうなものを幾つかピックアップしました。具体的なコードは各テンプレートを使ってコードを生成し確認していただけると幸いです。</p>

<h3>タブを使ったアプリケーション</h3>

<p></p><pre class="crayon-plain-tag">$ tns create MyNextGreatApp --template tns-template-tab-navigation</pre><p></p>

<p>タブ切り替えのテンプレート部分は<code>TabView</code>タグを使い、各タブで表示する内容は<code>TabViewItem</code>で定義しています。</p>

<p></p><pre class="crayon-plain-tag">&lt;!-- main-page.xml --&gt;
&lt;Page xmlns="http://schemas.nativescript.org/tns.xsd" loaded="pageLoaded"&gt;
  &lt;TabView&gt;
    &lt;TabView.items&gt;
      &lt;TabViewItem title="First"&gt;
        &lt;TabViewItem.view&gt;
          &lt;StackLayout class="tab-content"&gt;
            &lt;Label text="First View" class="title"/&gt;
            &lt;Label text="This is the content of the first tab." textWrap="true"/&gt;
          &lt;/StackLayout&gt;
        &lt;/TabViewItem.view&gt;
      &lt;/TabViewItem&gt;
      &lt;TabViewItem title="Second"&gt;
        &lt;TabViewItem.view&gt;
          &lt;StackLayout class="tab-content"&gt;
            &lt;Label text="Second View" class="title"/&gt;
            &lt;Label text="This is the content of the second tab." textWrap="true"/&gt;
          &lt;/StackLayout&gt;
        &lt;/TabViewItem.view&gt;
      &lt;/TabViewItem&gt;
    &lt;/TabView.items&gt;
  &lt;/TabView&gt;
&lt;/Page&gt;</pre><p></p>

<p>Androidエミュレータでの実行結果</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/MyNextGreatApp-Android.gif" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/MyNextGreatApp-Android.gif" alt="MyNextGreatApp-Android" width="200" height="300" class="alignnone size-medium wp-image-20722" /></a></p>

<p>iOSエミュレータでの実行結果</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/MyNextGreatApp-iOS.gif" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/MyNextGreatApp-iOS.gif" alt="MyNextGreatApp-iOS" width="200" height="300" class="alignnone size-medium wp-image-20723" /></a></p>

<h3>一覧と詳細を表示するアプリケーション</h3>

<p></p><pre class="crayon-plain-tag">$ tns create MyMasterDetailApp --template tns-template-master-detail</pre><p></p>

<p>一覧と明細は<code>GridLayout</code>を使って表示する場所を定義し、一覧部分を表示するテンプレートは<code>ListView</code>を使っています。</p>

<p></p><pre class="crayon-plain-tag">&lt;!-- main-page.xml --&gt;
&lt;Page xmlns="http://schemas.nativescript.org/tns.xsd" loaded="pageLoaded"&gt;
  &lt;GridLayout rows="auto, *"&gt;
    &lt;Label text="Items Page" class="title" /&gt;

    &lt;ListView items="{{ items }}" itemTap="listViewItemTap" row="1"&gt;
      &lt;ListView.itemTemplate&gt;
        &lt;Label text="{{ title }}" class="listItem" /&gt;
      &lt;/ListView.itemTemplate&gt;
    &lt;/ListView&gt;
  &lt;/GridLayout&gt;
&lt;/Page&gt;</pre><p></p>

<p>明細部分は<code>details-page.xml</code>でレイアウトを定義していて、具体的な内容の表示には<code>details-view.xml</code>を使っています。</p>

<p></p><pre class="crayon-plain-tag">&lt;!-- details-page.xml --&gt;
&lt;Page xmlns="http://schemas.nativescript.org/tns.xsd"
      xmlns:app="."
      navigatedTo="pageNavigatedTo"&gt;
  &lt;app:details-view /&gt;
&lt;/Page&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;!-- details-view.xml --&gt;
&lt;StackLayout  xmlns="http://schemas.nativescript.org/tns.xsd"&gt;
  &lt;Label text="{{ title }}" class="detail-title"/&gt;
  &lt;Label text="{{ info }}" class="info" textWrap="true"/&gt;
&lt;/StackLayout&gt;</pre><p></p>

<p>Androidエミュレータでの実行結果</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/MyMasterDetailApp-Android.gif" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/MyMasterDetailApp-Android.gif" alt="MyMasterDetailApp-Android" width="200" height="300" class="alignnone size-medium wp-image-20716" /></a></p>

<p>iOSエミュレータでの実行結果</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/MyMasterDetailApp-iOS.gif" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/MyMasterDetailApp-iOS.gif" alt="MyMasterDetailApp-iOS" width="200" height="300" class="alignnone size-medium wp-image-20717" /></a></p>

<h3>サイドメニュー付きアプリケーション</h3>

<p></p><pre class="crayon-plain-tag">$ tns create MyDrawerApp --template nativescript-template-drawer</pre><p></p>

<p>サイドメニュー付きアプリケーションを作成する場合には、サイドメニュー<code>drawer-content.xml</code>を定義し、メニューをクリックしたときの画面をそれぞれ定義しています。</p>

<p></p><pre class="crayon-plain-tag">&lt;!-- drawer-content.xml --&gt;
&lt;grid-layout class="drawer-content"&gt;
  &lt;stack-layout&gt;
    &lt;label text="Home" tap="navigate" class="{{ selectedPage == 'home' ? 'selected' : '' }}" /&gt;
    &lt;label text="About" tap="navigate" class="{{ selectedPage == 'about' ? 'selected' : '' }}" /&gt;
    &lt;label text="Settings" tap="navigate" class="{{ selectedPage == 'settings' ? 'selected' : '' }}" /&gt;
  &lt;/stack-layout&gt;
&lt;/grid-layout&gt;</pre><p></p>

<p>Androidエミュレータでの実行結果</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/MyDrawerApp-Android.gif" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/MyDrawerApp-Android.gif" alt="MyDrawerApp-Android" width="200" height="300" class="alignnone size-medium wp-image-20724" /></a></p>

<p>iOSエミュレータでの実行結果</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/MyDrawerApp-iOS.gif" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/MyDrawerApp-iOS.gif" alt="MyDrawerApp-iOS" width="200" height="300" class="alignnone size-medium wp-image-20725" /></a></p>

<h1>NativeScriptとAngular2を組み合わせる</h1>

<p>ここからが本記事の一番のポイント、「Angular2を使ったNativeScriptアプリケーション」に入ります。準備が長くて申し訳ありません！</p>

<p><a href="https://www.npmjs.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">npm</a>にはいくつかのAngular2を利用したNativeScriptのテンプレートがありますが、今回は<a href="http://docs.nativescript.org/angular/tutorial/ng-chapter-1#11-install-nativescript-and-configure-your-environment" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">NativeScriptのチュートリアル</a>を参考に、githubリポジトリーからテンプレートをcloneしたものを利用します。</p>

<h2>NativeScript with Angular2で作るHello World</h2>

<p>まずはリポジトリ<code>https://github.com/NativeScript/sample-Groceries</code>をcloneします。clone後、<code>angular-start</code>をcheckoutすると、NativeScript with Angular2で開発するための最も基本的な構成を得ることができます。</p>

<p></p><pre class="crayon-plain-tag">$ git clone https://github.com/NativeScript/sample-Groceries.git
$ cd sample-Groceries
$ git checkout angular-start
$ tree -L 2
├── app
│   ├── App_Resources
│   ├── app.component.ts
│   ├── app.css
│   ├── app.routes.ts
│   ├── main.ts
│   ├── package.json
│   ├── pages
│   ├── platform.android.css
│   ├── platform.ios.css
│   ├── shared
│   └── utils
├── package.json
├── platforms
│   └── ios
├── references.d.ts
└── tsconfig.json
$ tns platform add ios
$ tns platform add android
$ tns run ios --emulator
$ tns run android --emulator</pre><p></p>

<p>Androidエミュレータでの実行結果</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/bd526adedcc1d8bc115334228f13f924.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/bd526adedcc1d8bc115334228f13f924-186x300.png" alt="HelloWorld-Android" width="186" height="300" class="alignnone size-medium wp-image-20732" srcset="/wp-content/uploads/2016/09/bd526adedcc1d8bc115334228f13f924-186x300.png 186w, /wp-content/uploads/2016/09/bd526adedcc1d8bc115334228f13f924.png 397w, /wp-content/uploads/2016/09/bd526adedcc1d8bc115334228f13f924-128x207.png 128w" sizes="(max-width: 186px) 100vw, 186px" /></a></p>

<p>iOSエミュレータでの実行結果</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/9c8a45b0a1b5bb63648952bde5c36faa.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/9c8a45b0a1b5bb63648952bde5c36faa-200x300.png" alt="Helloworld-iOS" width="200" height="300" class="alignnone size-medium wp-image-20733" srcset="/wp-content/uploads/2016/09/9c8a45b0a1b5bb63648952bde5c36faa-200x300.png 200w, /wp-content/uploads/2016/09/9c8a45b0a1b5bb63648952bde5c36faa.png 427w, /wp-content/uploads/2016/09/9c8a45b0a1b5bb63648952bde5c36faa-138x207.png 138w" sizes="(max-width: 200px) 100vw, 200px" /></a></p>

<p>NativeScriptではBootstrapに特別なメソッド<code>nativeScriptBootstrap</code>を利用します。具体的にエントリーポイント<code>main.ts</code>は次のように記述されます。</p>

<p></p><pre class="crayon-plain-tag">// main.ts
import {nativeScriptBootstrap} from "nativescript-angular/application";
import {AppComponent} from "./app.component";

nativeScriptBootstrap(AppComponent);</pre><p></p>

<p>Angular2では、NativeScriptのXMLを<code>@Component.template</code>にディレクティブとして定義します。ただ<code>@Component.template</code>ではXMLをそのまま利用できないので、少し書き換える必要があります。具体的には&lt;foo /&gt;を&lt;foo&gt;&lt;/foo&gt;に書き換えるといった作業です。</p>

<p>具体的にこのサンプルの場合、XML定義では</p>

<p></p><pre class="crayon-plain-tag">&lt;Label text='hello world' /&gt;</pre><p></p>

<p>ですが、Angular2ではコンポーネントとして定義します。</p>

<p></p><pre class="crayon-plain-tag">// app.component.ts
import {Component} from "@angular/core";

@Component({
  selector: "my-app",
  template: "&lt;Label text='hello world'&gt;&lt;/Label&gt;"
})
export class AppComponent {}</pre><p></p>

<p><code>Label</code>はHTMLタグではなくNativeScriptで定義されたディレクティブです。NativeScriptでは幾つかのUIコンポーネントを定義していますので一覧にまとめます。</p>

<h2>UIコンポーネントのマッピング</h2>

<p>NativeScriptのUIコンポーネントは、iOSやAndroidのウィジェットにマッピングさせています。ビルドするとNativeScript with Angular2で定義したコンポーネントがマッピングされたiOSやAndroidのウィジェット変換されます。具体的な利用方法に関しては、<a href="http://docs.nativescript.org/angular/ui/components" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Native Script UI Components</a>を見ていただきたいと思います。</p>

<table>
<thead>
<tr>
  <th>NativeScript with Angular2</th>
  <th>Android</th>
  <th>iOS</th>
</tr>
</thead>
<tbody>
<tr>
  <td>Button</td>
  <td>android.widget.Button</td>
  <td>UIButton</td>
</tr>
<tr>
  <td>Label</td>
  <td>android.widget.TextView</td>
  <td>UILabel</td>
</tr>
<tr>
  <td>TextField</td>
  <td>android.widget.EditText</td>
  <td>UITextField</td>
</tr>
<tr>
  <td>TextView</td>
  <td>android.widget.EditText</td>
  <td>UITextView</td>
</tr>
<tr>
  <td>SearchBar</td>
  <td>android.widget.SearchView</td>
  <td>UISearchBar</td>
</tr>
<tr>
  <td>Switch</td>
  <td>android.widget.Switch</td>
  <td>UISwitch</td>
</tr>
<tr>
  <td>Slider</td>
  <td>android.widget.SeekBar</td>
  <td>UISlider</td>
</tr>
<tr>
  <td>Progress</td>
  <td>android.widget.ProgressBar</td>
  <td>UIProgressView</td>
</tr>
<tr>
  <td>ActivityIndicator</td>
  <td>android.widget.ProgressBar</td>
  <td>UIActivityIndicatorView</td>
</tr>
<tr>
  <td>Image</td>
  <td>android.widget.ImageView</td>
  <td>UIImageView</td>
</tr>
<tr>
  <td>ListView</td>
  <td>android.widget.ListView</td>
  <td>UITableView</td>
</tr>
<tr>
  <td>HtmlView</td>
  <td>android.widget.TextView</td>
  <td>UILabel</td>
</tr>
<tr>
  <td>WebView</td>
  <td>android.webkit.WebView</td>
  <td>UIWebView</td>
</tr>
<tr>
  <td>TabView</td>
  <td>android.support.v4.view.ViewPager</td>
  <td>UITabBarController</td>
</tr>
<tr>
  <td>SegmentedBar</td>
  <td>android.widget.TabHost</td>
  <td>UISegmentedControl</td>
</tr>
<tr>
  <td>DatePicker</td>
  <td>android.widget.DatePicker</td>
  <td>UIDatePicker</td>
</tr>
<tr>
  <td>TimePicker</td>
  <td>android.widget.TimePicker</td>
  <td>UIDatePicker</td>
</tr>
<tr>
  <td>ListPicker</td>
  <td>android.widget.NumberPicker</td>
  <td>UIPickerView</td>
</tr>
</tbody>
</table>

<h2>NativeScript + Angular2でHello World</h2>

<p>はじめに作成した「NativeScriptで作るHello World」のAngular2版のテンプレートがあります。アプリケーションの動きはまったく同じですがAngular2で書かれています。</p>

<p></p><pre class="crayon-plain-tag">$ tns create MyNgNativeScriptApp --template tns-template-hello-world-ng 
$ cd MyNgNativeScriptApp
$ tns platform add android
$ tns platform add ios
$ tns run android --emulator
$ tns run ios --emulator</pre><p></p>

<p>テンプレート部分を見比べると、XMLで書かれていたテンプレートコードがAngular2スタイルで記載されていることが理解でき、結果見通しのよいコードになっています。</p>

<p></p><pre class="crayon-plain-tag">&lt;!-- app.component.html --&gt;
&lt;StackLayout&gt;
  &lt;Label text="Tap the button" class="title"&gt;&lt;/Label&gt;
  &lt;Button text="TAP" (tap)="onTap()"&gt;&lt;/Button&gt;
  &lt;Label [text]="message" class="message" textWrap="true"&gt;&lt;/Label&gt;
&lt;/StackLayout&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">// app.component.ts
import {Component} from "@angular/core";

@Component({
  selector: "my-app",
  templateUrl: "app.component.html",
})
export class AppComponent {
  public counter: number = 16;

  public get message(): string {
    if (this.counter &gt; 0) {
      return this.counter + " taps left";
    } else {
      return "Hoorraaay! \nYou are ready to start building!";
    }
  }
    
  public onTap() {
    this.counter--;
  }
}</pre><p></p>

<h2>Todosアプリケーション</h2>

<p>NativeScriptのサイトには、より多く機能が実装されたチュートリアル<a href="http://docs.nativescript.org/angular/tutorial/ng-chapter-0" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Building Apps with NativeScript and Angular 2</a>を提供しています。完成したアプリケーションは先ほどと同じリポジトリ<code>https://github.com/NativeScript/sample-Groceries</code>にありますので、是非見て下さい。</p>

<p></p><pre class="crayon-plain-tag">$ git clone https://github.com/NativeScript/sample-Groceries.git NgTodosNative
$ cd NgTodosNative
$ tns platform add ios
$ tns platform add android
$ tns run ios --emulator
$ tns run android --emulator</pre><p></p>

<p>Androidエミュレータでの実行結果</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/sample-Groceries-Android.gif" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/sample-Groceries-Android.gif" alt="sample-Groceries-Android" width="200" height="300" class="alignnone size-medium wp-image-20727" /></a></p>

<p>iOSエミュレータでの実行結果</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/09/sample-Groceries-iOS.gif" data-wpel-link="internal"><img src="/wp-content/uploads/2016/09/sample-Groceries-iOS.gif" alt="sample-Groceries-iOS" width="200" height="300" class="alignnone size-medium wp-image-20728" /></a></p>

<p>サンプルコードを読むと、NativeScriptで利用するnativeScriptBootstrapの使い方やNativeScript用のルーティング設定が記載されていたりとAngular2の特徴を活かした実装になっています。</p>

<p>今回は、環境設定からはじまり、NativeScriptを使ったもの、NativeScript wit Angular2へと進め、Hello World的なアプリケーションを動かすところまでをテンプレートを使いながら簡単に説明させていただきました。</p>

<h1>最後に</h1>

<p>NativeScriptの事例がないかと探してみましたが<a href="https://www.nativescript.org/showcases" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">NativeScript Showcases</a>にいくつかありました。このアプリケーションがAngular2をベースにしたものかはわかりませんが、NativeScriptを使ったものです。</p>

<p>NativeScriptのXMLで定義したUIコンポーネントが、コンパイル時にiOS、Androidのウィジェットにそれぞれマッピングされネイティブアプリにコンパイルされます（ちょっと古いですがXSLTを思い出しました）。Angular2の@Component.templateを利用することでNativeScriptがUIコンポーネントの定義を解釈し、ネイティブコードの生成を行っています。</p>

<p>ただし、NativeScript with Angular2用に作成したコンポーネントとNativeScriptを使わない通常のAngular2のコンポーネントとの相互再利用性は低いです。ですが、慣れたAngular2の構造を利用しTypeScript(もしくはJavaScript)で書けるというのは非常に興味が湧くところです。</p>

<p><strong>編集部よりお詫び</strong><br />
<small><strong>
2016/9/9 18:30 編集部が付けた以前のタイトルは、一部の方を不快にさせる可能性があるとの判断のもと、記事タイトルを変更いたしました。
執筆者の佐川さん、及び以前のタイトルを不快に感じた多くの方々に、深くお詫び申し上げます。
</strong></small></p>
]]></content:encoded>
		
		<series:name><![CDATA[Web技術でアプリ開発2016]]></series:name>
	</item>
		<item>
		<title>React/Angular2時代のUIフレームワーク考──Ionic2、Onsen UI2を語る</title>
		<link>/shumpei-shiraishi/20411/</link>
		<pubDate>Fri, 02 Sep 2016 00:00:21 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[Angular2]]></category>
		<category><![CDATA[Ionic2]]></category>
		<category><![CDATA[Onsen UI2]]></category>
		<category><![CDATA[React]]></category>

		<guid isPermaLink="false">/?p=20411</guid>
		<description><![CDATA[連載： React/Angular2時代のWeb開発 (2)読者の皆様こんにちは、編集長の白石です。 先日ふとしたきっかけで、本サイトの認定エキスパートでありアシアル株式会社の社長でもある田中 正裕さんと、Web技術につ...]]></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> (2)</div><p>読者の皆様こんにちは、編集長の白石です。</p>

<p>先日ふとしたきっかけで、本サイトの認定エキスパートでありアシアル株式会社の社長でもある<a href="https://html5experts.jp/masahiro/" data-wpel-link="internal">田中 正裕さん</a>と、Web技術について語り合う機会がありました。</p>

<p>ReactやAngular2といった次世代のアプリケーションフレームワークが存在感を増す中で、UIを構築するためのフレームワークはどう進化するのか？</p>

<p>これらのアプリケーションフレームワークをベースとした<a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>や<a href="https://onsen.io/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI2</a>と言ったUIフレームワークについて、それぞれの立場から語り合ってみました。
（田中さんは<a href="https://onsen.io/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI2</a>の開発者、白石は<a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>をかなりヘビーに使い倒しています）</p>

<p>Progressive Web Apps (PWApps)というキーワードが認知を広げる中で、ハイブリッドアプリやモバイルサイトを構築する手段として、これらのフレームワークは存在感を増しています。PWApps、React、Angular2、Cordovaといったキーワードに関心のある方は必読です！</p>

<p>では、本編をお楽しみください。</p>

<h2>対談参加者のプロフィール</h2>

<p><img src="/wp-content/uploads/2013/07/f9ae33ea6273febd996e092fca378753.jpg" alt="田中 正裕" />
<strong>田中 正裕</strong>(アシアル株式会社 代表取締役社長)</p>

<p>ユーザーインタフェース設計からインフラストラクチャー構築まで、最先端の技術を駆使したシステム構築を手がける。特にPHPをはじめとするOSSや、HTML5やJavaScriptといったオープンなアーキテクチャーを用いたシステムの構築に尽力している。モバイルアプリ開発プラットフォーム「Monaca」のプロダクトマネジャーを兼務。</p>

<p><img src="/wp-content/uploads/2015/01/bf985f8ff1bf6f607fcd1950db7ecac7-66x66.jpg" alt="白石 俊平" />
<strong>白石 俊平</strong>(HTML5 Experts.jp編集長)</p>

<p>株式会社オープンウェブ・テクノロジーCEO。2015年12月、「最先端は、ここにある。」を謳うテクノロジー情報キュレーションサービスTechFeedをリリース。Web技術者向け情報メディア「HTML5 Experts.jp」編集長。日本最大（6,500名超）のHTML5開発者コミュニティ「html5j」ファウンダー。Google社公認Developer Expert (HTML5)、Microsoft社公認Most Valuable Professional (IE) などを歴任。著書に「HTML5&amp;API入門」（2010, 日経BP）、「Google Gearsスタートガイド」（2007, 技術評論社）など。監訳に「実践jQuery Mobile」（2013, オライリー）など。</p>

<h2><a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>と<a href="https://onsen.io/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI2</a></h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/P7141021.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/P7141021-640x480.jpg" alt="P7141021" width="640" height="480" class="aligncenter size-large wp-image-20429" srcset="/wp-content/uploads/2016/08/P7141021.jpg 640w, /wp-content/uploads/2016/08/P7141021-300x225.jpg 300w, /wp-content/uploads/2016/08/P7141021-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><b>白石:</b> 本日はよろしくお願いします。今回はReact/Angular2時代のUIフレームワークということで、最先端のUIフレームワークについて語る場にしたいと思っています。</p>

<p><b>田中:</b> はい、よろしくお願いします！</p>

<p><b>白石:</b> まずは、<a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>や<a href="https://onsen.io/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI2</a>について馴染みのない読者も多いと思うので、それぞれのフレームワークとぼくらの関わりについて話しましょうか。まずは、両フレームワークの共通点としては、以下の様な点が挙げられるかと思います。</p>

<ul>
<li>どちらもコンポーネント指向のUIフレームワーク。独自のタグを元に、HTMLっぽいテンプレートを記述することでUIを構築していける。</li>
<li>どちらも最初から数多くのUIコンポーネントを備えており、モバイルネイティブに近い見た目のアプリを作れる。</li>
<li>どちらも、Cordovaをベースとしたモバイルアプリ開発（ハイブリッドアプリ）を前提としている。そのため、以下に示すようなCordovaの特徴を備えることになる。

<ul>
<li>ほぼ完全なクロスプラットフォーム性を備える</li>
<li>プラグインを通じて、ネイティブの機能を呼び出すことができる</li>
<li>WebView上で動作するので、ネイティブアプリに比べて動作が遅い</li>
</ul></li>
</ul>

<p><b>白石:</b> で、こうした認識をベースとして、それぞれのフレームワークの違いなどに踏み込んでいければと思います。
まずは田中さんとOnsen UIの関係ですが、田中さんはOnsen UIのメイン開発者ということでいいんでしょうか？</p>

<p><b>田中:</b> 正確に言うと、開発のリードをしている立場ですね。</p>

<p><b>白石:</b> では、開発の優先順位なども田中さんが決定してらっしゃるということですね。チームは何人くらいいるんですか？</p>

<p><b>田中:</b> 以前弊社に所属していた<a href="https://html5experts.jp/anatoo/" data-wpel-link="internal">久保田 光則さん</a>も含めると、4〜5人くらいがフルコミットしている感じですね。</p>

<p>そもそもOnsen UIとは何かというと、バージョン1の時はAngular1をベースとしたUIフレームワークでした。現在開発を続けている<a href="https://onsen.io/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI2</a>の大きな特徴は「<strong>アプリケーションフレームワーク非依存</strong>」ということです。</p>

<p></p><pre class="crayon-plain-tag">&lt;!--
Onsen UI2のコード例。
以下の例はAngular2だが、Angular1やReactと組み合わせることも可能
--&gt;
&lt;ons-page&gt;
  &lt;ons-input (change)="onChange()" type="text"&gt;&lt;/ons-input&gt;
  &lt;ons-button&gt;Click Me!&lt;/ons-button&gt;
&lt;/ons-page&gt;</pre><p></p>

<p><a href="https://onsen.io/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI2</a>自体はWeb Componentsに則って作られていて、それをReactやAngular2、Angular1、さらにはjQueryなどと組み合わせて利用できます。最近だとVue.jsとか今はMeteorとかいうバインディングも増えていますね。</p>

<p><b>白石:</b> そこがIonicとの大きな違いですね。</p>

<p>ぼくは、先日リリースした<a href="https://techfeed.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TechFeed</a>というアプリで、<a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>を全面的に採用しました。TechFeedはエンジニア向けのニュースアプリなのですが、Web/メール/モバイルアプリと、様々なクライアントがあります。そのモバイルアプリを開発するにあたって、プラットフォームごとにコードベースを分けたくなかったので、Cordova上で動作するモバイルアプリ用UIフレームワークを探していたんですね。</p>

<p>その際、まだβ版が出たばかりだったAngular2が割とアーキテクチャ的に美しくまとまっていたのと、<a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>が既にAngular2に対応していたので、採用することにしました。
なので、<a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>はAngular2をベースにしたUIフレームワークです。Angular2以外では動きません。</p>

<p></p><pre class="crayon-plain-tag">&lt;!--
  Ionic2のコード例。
  タグの名前などは異なるが、あまり変わらない。
--&gt;
&lt;ion-content&gt;
  &lt;ion-input (change)="onChange()" type="text"&gt;&lt;/ion-input&gt;
  &lt;button&gt;Click Me!&lt;/button&gt;
&lt;/ion-content&gt;</pre><p></p>

<p>この、UIフレームワークとアプリケーションフレームワークが密結合（<a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>）なのか、それとも疎結合（<a href="https://onsen.io/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI2</a>）なのかというところが、今日の対談のポイントになりそうですね。</p>

<p>ただこのまま、UIフレームワークありきの議論に入っていく前に、ぼくは一つ確認したいことがありまして。<strong>そもそもUIフレームワークって必要とされているんでしょうか？</strong></p>

<h2>UIフレームワークは必要か？</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/P7141034.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/P7141034-640x480.jpg" alt="P7141034" width="640" height="480" class="aligncenter size-large wp-image-20430" srcset="/wp-content/uploads/2016/08/P7141034.jpg 640w, /wp-content/uploads/2016/08/P7141034-300x225.jpg 300w, /wp-content/uploads/2016/08/P7141034-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><b>白石:</b> 「いらないだろう」という前提で話すわけではなくて、Webの世界にとってコンポーネント指向のUIフレームワークというのはまだ新しい存在なので、そもそも「なぜ必要なのか？」を確認したいのです。とりあえず、フレームワークが必要か不要かで言うと、Webデザイナーさんの中には、フレームワークを嫌がる方も多い気がするのですが。</p>

<p><b>田中:</b> 確かにそういう方もいらっしゃるとは思います。が、（Bootstrapなどのような）CSSフレームワークと、JavaScriptも含めたUIフレームワークは別に考えるべきじゃないかと思います。</p>

<p><b>白石:</b> 確かにそうですね。CSSフレームワークは、デフォルトでそれなりの見た目になるとか、コーディングスタイルが統一されるなどの利点はあると思いますが、フレームワークのスタイルを変更しようとすると途端に面倒だったりしますしね。フレームワーク独自のルールを覚えなくちゃいけないし、最終的には全部リセットしたくなったり（笑）。</p>

<p><b>田中:</b> その通りです。それに、ことモバイルアプリやサイトをWeb技術で作る場合に大事なのって、単なるCSSのプリセットがあることではありません。実際に操作してみた時のスムーズさだったり、アプリ全体から受ける印象だったりと、振る舞いも含めたもっと包括的なUXです。</p>

<p>そういう面で、アプリ全体のUXを統一して、なおかつプラットフォームに馴染んだものにするためには、やはり一貫した枠組みが必要です。それは実際に私がMonacaを運営する上で、お客様からご要望をいただいてきたところでもありますし、だからこそOnsen UIを作ることにも繋がりました。ということで、私はUIフレームワークは確実に必要だと思いますね。</p>

<p><b>白石:</b> なるほど。ただ、UIフレームワークって、寿命が短くないですか？昔はjQuery MobileやKendo UIなんてのもありましたが、今ではあまり使っているという話を聞きません。</p>

<h3>UIフレームワークとアプリケーションフレームワーク</h3>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/P7141008.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/P7141008-640x480.jpg" alt="P7141008" width="640" height="480" class="aligncenter size-large wp-image-20431" srcset="/wp-content/uploads/2016/08/P7141008.jpg 640w, /wp-content/uploads/2016/08/P7141008-300x225.jpg 300w, /wp-content/uploads/2016/08/P7141008-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><b>田中:</b> それは、それらのフレームワークがUI的に古びてしまったというわけではなく、アーキテクチャ的に古いと見なされたから使われなくなってしまったんだと思うんです。JavaScriptアプリケーションのアーキテクチャは、ここ数年目まぐるしく移り変わってきました。jQueryのあとAngular1、React、Angular2, 他にもRiot.jsとかVue.jsなども出てきている。</p>

<p>ですがそれはアーキテクチャの進化であって、UIが進化したわけではありません。例えばUIの進化って、iOS7からフラットデザインになりましたとか、マテリアルデザインが出てきましたとか、そういうことです。こうした進化がすごく早いかと言われると、正直そうは思いません。UIフレームワークが、アプリケーションアーキテクチャの進化に引きずられちゃってたんじゃないか、というのがぼくの思うところです。</p>

<p><b>白石:</b> なるほど、だから<a href="https://onsen.io/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI2</a>はアプリケーション・フレームワークに依存しない形で設計されているわけですね。ぼくはTechFeedを<a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>で作りましたが、それはAngular2の採用を先に決めていたから、というのもあります。というか、その時はまだ<a href="https://onsen.io/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI2</a>が今ほど開発が進んでいなかったので、モバイルアプリを包括的に作れるUIフレームワークと、コンポーネント指向のアプリケーションフレームワークの組み合わせが、<a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a> + Angular2しかなかったんですよね。</p>

<p><b>田中:</b> <a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>はAngular2に強く依存しているわけですが、<a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>を学ぶには先にAngular2を学ばなくてはならないわけですよね。私はそこを少しもったいないな、と思います。元々私がUIフレームワークで実現したかったことって、「JavaScriptのフレームワークを学ばなくても簡単に使える」ということだったので。</p>

<p><b>白石:</b> 確かに、Onsen UIはそういうところの配慮が行き届いている気がします。ぼくもOnsen UI1の時に使わせていただいていましたが、Webサイト上のサンプルコードが良くできていて、コピペするだけでUIが作れてしまうのが、とても楽ちんでした。</p>

<h3>それぞれのフレームワークが目指すもの</h3>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/P7141052.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/P7141052-640x480.jpg" alt="P7141052" width="640" height="480" class="aligncenter size-large wp-image-20432" srcset="/wp-content/uploads/2016/08/P7141052.jpg 640w, /wp-content/uploads/2016/08/P7141052-300x225.jpg 300w, /wp-content/uploads/2016/08/P7141052-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><b>田中:</b> あと、<a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>はどことなくUIフレームワークというよりは「プラットフォーム」を目指している気がします。</p>

<p><b>白石:</b> 確かに。Ionicはモバイルアプリを作る際はCordovaを使用するのですが、CordovaもあくまでIonicが規定するプラットフォームの一部というつもりなのか、<code>cordova</code>コマンドをラップした<code>ionic</code>コマンドを提供していますね。また、CordovaプラグインのAPIをラップした <code>ionic-native</code> というモジュールも提供しています。これは、各種プラグインをTypeScriptから使えるようにしてくれているので、結構ありがたくはあるんですが。</p>

<p><b>田中:</b> UIフレームワークを入り口として、プラットフォームに入ってきてください、というスタンスな気がしますよね。
Onsen UIはあくまでUIフレームワークであり、アプリケーションスタックの一部という位置付けなので、そこは思想の違いが現れている気がします。</p>

<p><b>白石:</b> <a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>はアプリケーションプラットフォームを限定していて、プラットフォームを志向している。<a href="https://onsen.io/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI2</a>はアプリケーションプラットフォーム非依存で、ライブラリを指向している。こういう対比になりますね。こうして並べると、個人的には<a href="https://onsen.io/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI2</a>の方が設計面で魅力を感じます。</p>

<p><b>田中:</b> ありがとうございます(笑)。</p>

<p><b>白石:</b> ただ、まだ結論を出すのは早い気もしますね。どちらも正式リリース前ですし(笑)。</p>

<p>TechFeedがAngular2と<a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>を採用しているからというわけではないですが、アプリケーションプラットフォームを限定しているからこその強みもあるかもしれません。ぼくはまだ<a href="https://onsen.io/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI2</a>を実際に触ってみたことがないので比較ができないのですが、<a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a>のほうがAngular2との相性とかはさすがにいいでしょうし。先ほど出てきた<code>ionic-native</code>パッケージとかもなかなか便利です。</p>

<p>またぼくらがIonicを採用した理由の一つには、コミュニティの大きさがIonicのほうが大きそうだった、という理由もあります。GitHubのStarの数が、Ionicは25,000、Onsen UIは3,000という違いがあったので。コミュニティの大きさは、Web上の情報量の差にもなって表れてくるので、困ったときに情報を得やすいと思ったのです。</p>

<p>このようにいろんな観点での比較ができそうなので、一概にどちらが優れているとここでは結論付けられなそうですが、こうした議論が読者の皆さんにとって判断の助けになるといいですね。</p>

<p>（編集部: 参考までに、ここまでに出てきた論点や、Web上で得られる内容を比較した表を掲載しておきます）</p>

<table>
<thead>
<tr>
  <th>項目</th>
  <th><a href="http://ionicframework.com/docs/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic2</a></th>
  <th><a href="https://onsen.io/v2/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Onsen UI2</a></th>
</tr>
</thead>
<tbody>
<tr>
  <td>依存するアプリケーションプラットフォーム</td>
  <td>Angular2</td>
  <td>非依存（現時点ではAngular1/2, Reactなど）</td>
</tr>
<tr>
  <td>フレームワークの実装言語</td>
  <td>TypeScript</td>
  <td>ES2015とTypeScript</td>
</tr>
<tr>
  <td>目指す地点</td>
  <td>プラットフォーム？</td>
  <td>ライブラリ</td>
</tr>
<tr>
  <td>GitHub上でのStar数 (2016/8/25時点)</td>
  <td>25,370</td>
  <td>3,216</td>
</tr>
</tbody>
</table>

<p>（UIコンポーネントは現在のところほぼ同数ですが、どちらかにしか実装されていないコンポーネントもいくつかありますし、今後大きく増えていく部分だと思われるため、表からは除外しています）</p>

<h3>今後のWeb技術の展望を語る</h3>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/P7141001.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/P7141001-640x480.jpg" alt="P7141001" width="640" height="480" class="aligncenter size-large wp-image-20434" srcset="/wp-content/uploads/2016/08/P7141001.jpg 640w, /wp-content/uploads/2016/08/P7141001-300x225.jpg 300w, /wp-content/uploads/2016/08/P7141001-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><b>白石:</b> 最後にお聞きしたいんですが、Onsen UIに限らず、今後のWeb技術って、どういう方向に進んでいくとお考えですか？</p>

<p><b>田中:</b> Web技術って、今どんどん開発のバリエーションが増えている状態だと思っています。それはフラグメンテーションと呼べるかもしれない。例えば、Angular2がTypeScriptを、ReactがJSXを使用しているように、です。これらが収束して一つの太い流れができていくのか、このまま個別の進化を続けていくのかは、まだ何ともいえません。</p>

<p><b>白石:</b> テクノロジーのスタックが積み上がっていくにつれ、それぞれの開発手法の間の差異が広がっているというわけですね。こうした状況は、なぜ起きていると考えられますか？</p>

<p><b>田中:</b> 私はMonacaを通じて「ハイブリッドアプリ」、つまりWeb技術でモバイルアプリを作るというところをずっとやってきました。その経験から言うと、モバイルアプリは大きく2パターンあります。一つは長期間のメンテナンスが必要なアプリ。もう一つはキャンペーンなどのワンタイムなアプリケーションですね。前者には強固な基盤が求められるので、Angular2のようなものが求められます。後者はそうではないですね。逆にさくっと作れるようなものが求められます。</p>

<p>こうしたニーズの二分化も理由の一つじゃないかなあとは思っています。</p>

<p><b>白石:</b> なるほど、ニーズが分かれていると。そういう意味でいうと、静的な文書中心の「Webサイト」と、Single Page Application化が進む「Webアプリ」の違いも、フロントエンド技術のフラグメンテーションに一役買っていそうです。「Webサイト」の制作においては、まだまだjQueryは現役ですし、無理にそこを変える必要もなさそうですし。</p>

<p>あと、Web技術の適用範囲が増えてきているというのもあるかもしれませんね。WebVRとか、JavaScriptで動かせる組み込み基板とか。ウェアラブルやロボティクスという分野にも、Web技術が広まっていくとは思います。実際にそれがどれくらい使われるかは未知数ですけども。</p>

<p><b>田中:</b> とはいえWeb技術って、情報技術全体から見るとエッジの技術ではありませんよね。かなりコモディティ化の進んだ、汎用的でメインストリームな技術。</p>

<p><b>白石:</b> 確かに。これだけ技術が進んでも、結局のところHTML/CSS/JavaScriptという基本的な部分はあまり変わっていません。</p>

<p><b>田中:</b> こうしたWeb技術の適用範囲をいかに広げていくか…というのは、個人的な興味として強くあります。いちエンジニアとして、Webのスキルセットをいろんなプラットフォームで使えるよう後支えしたいというのは、私の目指すところです。</p>

<p><b>白石:</b> それは、HTML5 Experts.jpでもぜひ進めていきたいところです。ではそろそろお時間ですね。本日はお付き合いいただき、どうもありがとうございました！</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/P7140983.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/P7140983-640x480.jpg" alt="P7140983" width="640" height="480" class="aligncenter size-large wp-image-20436" srcset="/wp-content/uploads/2016/08/P7140983.jpg 640w, /wp-content/uploads/2016/08/P7140983-300x225.jpg 300w, /wp-content/uploads/2016/08/P7140983-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
]]></content:encoded>
		
		<series:name><![CDATA[React/Angular2時代のWeb開発]]></series:name>
	</item>
		<item>
		<title>FirebaseとAngular2を使ってリアルタイムでデータのやり取り【導入編】</title>
		<link>/frontainer/19689/</link>
		<pubDate>Mon, 27 Jun 2016 00:00:18 +0000</pubDate>
		<dc:creator><![CDATA[林 優一]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[Angular2]]></category>
		<category><![CDATA[Firebase]]></category>

		<guid isPermaLink="false">/?p=19689</guid>
		<description><![CDATA[連載： Angular2で学ぶFirebase入門 (1)Firebaseはリアルタイム同期なデータベースを中心に、Auth認証やPushNotificationやユーザーの行動分析といったアプリケーションに最適な機能を...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/firebase/" class="series-379" title="Angular2で学ぶFirebase入門" data-wpel-link="internal">Angular2で学ぶFirebase入門</a> (1)</div><p>Firebaseはリアルタイム同期なデータベースを中心に、Auth認証やPushNotificationやユーザーの行動分析といったアプリケーションに最適な機能を提供するBasSです。先月行われたGoogle IOにて、PushNotificationや行動分析機能が追加されるなど話題となりました。</p>

<p>今回はFirebaseのリアルタイムベースとAngular2を用いて、リアルタイムにデータをやり取りする方法について解説します。</p>

<h2>Firebaseのリアルタイムデータベース</h2>

<p>Firebaseのリアルタイムデータベースはクラウドホスト型のNoSQLデータベースです。JSONの形式でデータは保存されます。
APIはもちろん、iOS/Android/Web用のSDKが提供されているので、非常に簡単に導入することができます。</p>

<p>また、ネットワークが途中で切れた場合は自動的に再接続を行い、復帰後に改めてデータが同期されます。同時100コネクション、1GBのデータ、10GBの転送量までは無料で使うことができるので、まず試してみるといったことができます。</p>

<p>今回はこの無料プランとAngular2を使って進めていきます。</p>

<h2>Angular CLIで環境構築</h2>

<p>Angular2の環境構築が初めての方でも簡単に導入できるように、Angular2ではCLIが公開されています。これを利用して環境を構築していきます。（※別途、Node.jsのインストールが必要です）</p>

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

<p>まずはnpmを使って、angular-cliをインストールします。</p>

<p></p><pre class="crayon-plain-tag">npm install -g angular-cli</pre><p></p>

<p>インストールが成功していれば、<code>ng version</code>でバージョンが表示されます。</p>

<p></p><pre class="crayon-plain-tag">angular-cli: 1.0.0-beta.5
node: 5.6.0
os: darwin x64</pre><p></p>

<p>続いて、<code>ng new</code>コマンドを用いてプロジェクトを作成します。newの後には任意のプロジェクト名を入力してください。（angularやfirebaseという名称を用いるとパッケージ名が重複してしまうため、関連ライブラリのインストールに失敗するのでご注意ください）</p>

<p></p><pre class="crayon-plain-tag">ng new sample
cd sample</pre><p></p>

<p>今回は<code>ng new sample</code>でプロジェクトを作成します。</p>

<p>sampleというフォルダができるので<code>cd sample</code>で移動し、この状態で <code>ng serve</code> コマンドを実行するとサンプルのアプリケーションがビルドされ、<code>http://localhost:4200/</code>にブラウザでアクセスすると<code>sample works!</code>と表示されます。</p>

<p>これで開発環境の準備が整いました。</p>

<h2>AngularFire導入</h2>

<p>本題のAngularFireを導入していきます。</p>

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

<p></p><pre class="crayon-plain-tag">npm install angularfire2 firebase@2.4.2 --save</pre><p></p>

<p>※ 6月14日現在の最新版は、firebase 2.4.2に対応しています。</p>

<p>続いて、firebase用の型定義ファイルをインストールします。
<code>typings</code>がインストールされていない場合は <code>npm i -g typings</code>を実行してインストールをしてください。</p>

<p></p><pre class="crayon-plain-tag">typings install dt~firebase --save --global</pre><p></p>

<p>※ 注意</p>

<p>typings 1系と0系では、コマンドやインストールされるファイルの構成が異なります。現在のバージョンのangular-cliでは0系でインストールされますが、npmでインストールされる最新版は1系になります。本稿では1系がインストールされている状態で解説を行います。0系の場合は以下のtypingsに追記する作業は必要ありません。</p>

<p><code>src/typings.d.ts</code>にインストールされたfirebaseの型定義ファイル群を追記します。</p>

<p></p><pre class="crayon-plain-tag">/// &lt;reference path="../typings/browser.d.ts" /&gt;
/// &lt;reference path="../typings/index.d.ts" /&gt;
declare var module: { id: string };</pre><p></p>

<p>angular-cli-build.jsを開き、<code>vendorNpmFiles</code>に<code>'angularfire2/**/*.js'</code> <code>'firebase/lib/*.js'</code> を追記します。</p>

<p></p><pre class="crayon-plain-tag">var Angular2App = require('angular-cli/lib/broccoli/angular2-app');

module.exports = function(defaults) {
  return new Angular2App(defaults, {
    vendorNpmFiles: [
      'systemjs/dist/system-polyfills.js',
      'systemjs/dist/system.src.js',
      'zone.js/dist/**/*.+(js|js.map)',
      'es6-shim/es6-shim.js',
      'reflect-metadata/**/*.+(js|js.map)',
      'rxjs/**/*.+(js|js.map)',
      '@angular/**/*.+(js|js.map)',
      'angularfire2/**/*.js', // &lt;- 追加
      'firebase/lib/*.js'      // &lt;- 追加
    ]
  });
};</pre><p></p>

<p>続いて、/src/system-config.tsに以下のようにfirebase,angularfire2の記述を追記します。</p>

<p></p><pre class="crayon-plain-tag">/** Map relative paths to URLs. */
const map: any = {
  'firebase': 'vendor/firebase/lib/firebase-web.js',
  'angularfire2': 'vendor/angularfire2'
};

/** User packages configuration. */
const packages: any = {
  angularfire2: {
    defaultExtension: 'js',
    main: 'angularfire2.js'
  }
}</pre><p></p>

<p>これでAngular2でFirebaseを使う準備が整いました。</p>

<h2>Firebaseの登録</h2>

<p>続いて、Firebaseの登録と設定を行っていきましょう。</p>

<p><a href="https://firebase.google.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">firebase</a></p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.46.07-640x194.png" alt="Screen Shot 0028-06-14 at 22.46.07" width="640" height="194" class="alignnone size-large wp-image-19695" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.46.07.png 640w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.46.07-300x91.png 300w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.46.07-207x63.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>FirebaseはGoogleアカウントで登録することができます。登録が完了すると、プロジェクトを作るためのボタンが表示されます。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.47.30-640x235.png" alt="Screen Shot 0028-06-14 at 22.47.30" width="640" height="235" class="alignnone size-large wp-image-19696" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.47.30.png 640w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.47.30-300x110.png 300w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.47.30-207x76.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>「新規プロジェクトを作成」ボタンをクリックして、アプリケーションを作成しましょう。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17.png" alt="Screen Shot 0028-06-14 at 22.48.17" width="449" height="445" class="alignnone size-full wp-image-19697" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17.png 449w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17-150x150.png 150w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17-300x297.png 300w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17-207x205.png 207w" sizes="(max-width: 449px) 100vw, 449px" /></p>

<p>アプリケーションが作成できたら「Database」ページを開きます。
以下のように、まだデータベースには何も入っていません。まずはこの画面から初期データを登録してみましょう。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.55.35.png" alt="Screen Shot 0028-06-14 at 22.55.35" width="294" height="57" class="alignnone size-full wp-image-19698" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.55.35.png 294w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.55.35-207x40.png 207w" sizes="(max-width: 294px) 100vw, 294px" /></p>

<p>このようにデータを作成しました。</p>

<p></p><pre class="crayon-plain-tag">{
  items: {
    0: {
      value: &#039;item0001&#039;
    },
    2: {
      value: &#039;item0002&#039;
    },
    2: {
      value: &#039;item0003&#039;
    }
  }
}</pre><p></p>

<p>Firebase上では、すべてオブジェクトの形式でデータが構成されるようにしておきます。</p>

<p>続いて、「ルール」のタブをクリックしてルールを設定します。
ルールはデータベースへの値に対してのアクセス権の設定を行うことができます。JSONの形式でデータを定義していきます。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.58.07-640x333.png" alt="Screen Shot 0028-06-14 at 22.58.07" width="640" height="333" class="alignnone size-large wp-image-19699" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.58.07.png 640w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.58.07-300x156.png 300w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.58.07-207x108.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>詳しいルールの記載は、以下のページに説明があります。
<a href="https://html5exp-sample.firebaseio.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://html5exp-sample.firebaseio.com/</a></p>

<p>ここではサンプルということで、読み書きともに誰からでもできるように設定しておきましょう。</p>

<p></p><pre class="crayon-plain-tag">{
  "rules": {
    "items": {
      ".read": "true",
      ".write": "true"
    }
  }
}</pre><p></p>

<p>これによってデータベースの<code>items</code>以下は、読み書きともに誰でも許可されるようになりました。では、これで登録したデータが読み取れるか試してみましょう。/src/main.tsを開きます。</p>

<p></p><pre class="crayon-plain-tag">import { bootstrap } from '@angular/platform-browser-dynamic';
import { enableProdMode } from '@angular/core';
import { SampleAppComponent, environment } from './app/';
import { FIREBASE_PROVIDERS, defaultFirebase } from 'angularfire2'; // &lt;- add

if (environment.production) {
  enableProdMode();
}

bootstrap(SampleAppComponent,[
  FIREBASE_PROVIDERS, // &lt;- add
  defaultFirebase('https://&lt;your-firebase-app&gt;.firebaseio.com/') // &lt;- add
]);</pre><p></p>

<p><code>main.ts</code> にangularfire2のファイルをimportし、bootstrap関数の第２引数に<code>FIREBASE_PROVIDERS</code>と <code>defaultFirebase('https://.firebaseio.com/')</code> を配列で渡しておきます。</p>

<p>こうすることによって、今後Angular2のコンポーネント内でFirebaseに必要な設定とプロバイダが提供されるようになります。</p>

<p>続いて、画面にデータを表示するためのコンポーネントに変更を加えます。</p>

<p></p><pre class="crayon-plain-tag">import { Component } from '@angular/core';
import { AngularFire, FirebaseListObservable } from 'angularfire2'; //&lt;- add

@Component({
  moduleId: module.id,
  selector: 'sample-app',
  templateUrl: 'sample.component.html',
  styleUrls: ['sample.component.css']
})
export class SampleAppComponent {
  title = 'sample works!';
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
		this.items = af.database.list('/items');
  }
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    {{item.value}}
  &lt;/li&gt;
&lt;/ul&gt;</pre><p></p>

<p><code>*ngFor="let item of items | async"</code> のasyncはAsyncPipeと呼ばれるAngular2にはじめから組み込まれているPipeのひとつです。これはitemsのObservableをsubscribeしたときの引数を自動的に取得して表示してくれるPipeです。詳しい使い方や解説は以下のページにありますので、こちらをご一読ください。</p>

<p><a href="https://angular.io/docs/ts/latest/guide/pipes.html#!#async-pipe" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Async Pipe</a></p>

<p><code>ng serve</code> コマンドを改めて実行すると、Firebaseで登録されたデータが表示されるようになります。</p>

<h2>データの追加</h2>

<p>次にブラウザからデータを追加する処理を実装していきましょう。</p>

<p></p><pre class="crayon-plain-tag">export class SampleAppComponent {
  title = 'sample works!';
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
    this.items = af.database.list('/items');
  }
  addItem(value:string) {
    this.items.push({value:value});
  }
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    {{item.value}}
  &lt;/li&gt;
&lt;/ul&gt;

&lt;form (ngSubmit)="addItem(newItem.value);newItem.value=''"&gt;
  &lt;input type="text" #newItem&gt;
  &lt;button&gt;send&lt;/button&gt;
&lt;/form&gt;</pre><p></p>

<p><code>FirebaseListObservable</code>にデータを<code>push</code>するだけで配列データにデータを追加することができます。</p>

<h2>データの更新</h2>

<p>今度はリストのデータを更新してみましょう。</p>

<p></p><pre class="crayon-plain-tag">export class SampleAppComponent {
  title = 'sample works!';
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
    this.items = af.database.list('/items');
  }
  addItem(value:string) {
    this.items.push({value:value});
  }
  updateItem(key:string,value:string) {
	  this.items.update(key,{value:value});
  }
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    {{item.value}}
    &lt;input [(ngModel)]="item.value" (keyup)="updateItem(item.$key,item.value)"/&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;form (ngSubmit)="addItem(newItem.value);newItem.value=''"&gt;
  &lt;input type="text" #newItem&gt;
  &lt;button&gt;send&lt;/button&gt;
&lt;/form&gt;</pre><p></p>

<p><code>this.items.update(key,{value:value});</code>のように更新したいデータの$keyと値を渡すことで更新ができます。
Firebaseのオブジェクトには$keyというプロパティがあり、各データのKey名を取得することができます。
pushで追加されたデータは、一意なKeyが自動で振られるようになっています。</p>

<h2>データの削除</h2>

<p>続いて、リストのデータを削除してみましょう。</p>

<p></p><pre class="crayon-plain-tag">export class SampleAppComponent {
  title = 'sample works!';
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
    this.items = af.database.list('/items');
  }
  addItem(value:string) {
    this.items.push({value:value});
  }
  updateItem(key:string,value:string) {
	  this.items.update(key,{value:value});
  }
  deleteItem(key:string) {
	  this.items.remove(key);
  }
  deleteAll() {
	  this.items.remove();
  }
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    {{item.value}}
    &lt;input [(ngModel)]="item.value" (keyup)="updateItem(item.$key,item.value)"/&gt;
    
    &lt;button (click)="removeItem(item.$key)"&gt;削除&lt;/button&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;form (ngSubmit)="addItem(newItem.value);newItem.value=''"&gt;
  &lt;input type="text" #newItem&gt;
  &lt;button&gt;send&lt;/button&gt;
&lt;/form&gt;

&lt;button (click)="removeAll()"&gt;全削除&lt;/button&gt;</pre><p></p>

<p>更新と同様に<code>this.items.remove(key);</code>と削除したいデータのKeyを渡すことで、そのデータのみを削除することができます。</p>

<p><code>this.items.remove();</code>とKeyを渡さずにremoveするとリスト全体が削除されるので注意してください。</p>

<p>このように非常に簡単にデータの読み書きが実装できてしまいます。</p>

<h2>オブジェクトデータの取り扱い</h2>

<p>続いて、今度はリストデータでなく単一のオブジェクトのデータを扱ってみましょう。Firebaseの管理画面でDatabaseのデータに以下のような<code>constants</code>を追加しました。</p>

<p></p><pre class="crayon-plain-tag">{
  constants: {
    title: "My first firebase app"
  },
  items: {
    ...
  }
}</pre><p></p>

<p>ルール設定ページにいき、constantsは読み込み専用に設定しておきます。</p>

<p></p><pre class="crayon-plain-tag">{
  "rules": {
    "constants": {
      ".read": "true",
      ".write": "false"
    },
    "items": {
      ".read": "true",
      ".write": "true"
    }
  }
}</pre><p></p>

<p>src/app/sample.component.tsを、以下のように修正します。</p>

<p></p><pre class="crayon-plain-tag">import { Component } from '@angular/core';
import { AngularFire, FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2'; //&lt;- add

@Component({
  moduleId: module.id,
  selector: 'sample-app',
  templateUrl: 'sample.component.html',
  styleUrls: ['sample.component.css']
})
export class SampleAppComponent {
  constants: FirebaseObjectObservable&lt;any&gt;;
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
    this.constants = af.database.object('/constants');
    this.items = af.database.list('/items');
  }
  addItem(value:string) {
    this.items.push({value:value});
  }
  updateItem(key:string,value:string) {
    this.items.update(key,{value:value});
  }
  deleteItem(key:string) {
    this.items.remove(key);
  }
  deleteAll() {
    this.items.remove();
  }
}</pre><p></p>

<p>そして、ビューのタイトル部分をconstantsから取得して表示させるようにします。</p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{(constants | async)?.title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    &lt;input [(ngModel)]="item.value" (keyup)="updateItem(item.$key,item.value)"/&gt;

    &lt;button (click)="deleteItem(item.$key)"&gt;削除&lt;/button&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;form (ngSubmit)="addItem(newItem.value);newItem.value=''"&gt;
  &lt;input type="text" #newItem&gt;
  &lt;button&gt;send&lt;/button&gt;
&lt;/form&gt;

&lt;button (click)="deleteAll()"&gt;全削除&lt;/button&gt;</pre><p></p>

<p>こうすることで、オブジェクトのデータを読み込んで画面に表示させることができました。</p>

<h2>オブジェクトの更新</h2>

<p>オブジェクトの更新をする際は、リストと同様にupdate関数を用いて変更を行うことができます。その時にはルールで書き込みが許可されている必要があります。</p>

<p></p><pre class="crayon-plain-tag">this.constants.update({title:"new title"});</pre><p></p>

<h2>オブジェクトの削除</h2>

<p>オブジェクトの削除を行う際にはremove関数を用いますが、以下のようにremoveするとconstantsごと削除されます。</p>

<p></p><pre class="crayon-plain-tag">this.constants.remove(); // constantsごと削除</pre><p></p>

<p>１つのプロパティのみを削除したい場合は、以下のように削除したいプロパティまで取得した上でremove関数を実行します。</p>

<p></p><pre class="crayon-plain-tag">af.database.object('/constants/title').remove(); //titleだけ削除</pre><p></p>

<h2>まとめ</h2>

<p>このようにAngular2とFirebaseを使うことで、簡単にリアルタイムにデータのやり取りを行うことができるようになります。</p>

<p>今回はサンプルということで誰でも読み書きできる形にしていますが、ユーザー認証をFirebaseで作ったり、既にあるログイン情報を利用して認証させたりできるので、新規でも追加でも導入しやすくなっています。</p>

<p>次回はその認証機能を用いてログインすると書き込みができるようにしていきたいと思います。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Angular2で学ぶFirebase入門]]></series:name>
	</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>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>
		<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>
	</channel>
</rss>
