<?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>又川 尚樹 &#8211; HTML5Experts.jp</title>
	<atom:link href="/n_matagawa/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>
	</channel>
</rss>
