もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~

Post on 17-May-2015

3.026 views 3 download

description

Ruby勉強会@札幌-27 での発表資料です。 * http://rubysapporo.doorkeeper.jp/events/5190 Rubyist が Ember.js を始めるための参考に。

Transcript of もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~

佐藤 竜之介(Ryunosuke SATO)Sapporo.jsRuby勉強会@札幌-27

はじめるEmber.js!!

~ Getting started with Ember.js ~

2013.09.28

もっと!

提供

Sapporo.js

Community for people who like JavaScript.

自己紹介

@tricknotesI am a software developer who love JavaScript and Ruby.

http://tricknotes.hateblo.jp/

I love OSS

I am a contributerof Ember.js

/* * advertising * about Ember.js * * !!Important!! *

2013.11.11Ember.js ハンズオン

http://www.deos.co.jp/SK010.html

https://idobata.ioIdobata

東京Node学園祭20132013.10.26

http://nodefest.jp/2013/

Comming soon...

札幌市中央区Ruby会議012014.02.08 13:00~

*/

よろしくお願いします

佐藤 竜之介(Ryunosuke SATO)Sapporo.jsRuby勉強会@札幌-27

はじめるEmber.js!!

~ Getting started with Ember.js ~

2013.09.28

もっと!

http://emberjs.com/

Ember.js 1.0 released!

今日の目標

* Ember.js が何かわかる* Ruby と一緒に使うことができる

Ember.js について...

今日の話* Ember.js って何?* Ember.js と Ruby

今日の話* Ember.js って何?* Ember.js と Ruby

最近の web アプリでは、画面遷移がなく一画面でリアクティブに操作できるアプリケーションを見る機会が増え

ました

例えば...

Travis CI

Discourse

Idobata

なんでこんなリッチなアプリケーションを作るのか?

ユーザ体験

でも、作るのは大変...

jQuery でのアプローチ

* HTML + CSS + JS の密結合* データの多重管理問題* DOM based architecture* global な jQuery 関数による view の密結合* Event の開放漏れ* DOM の開放漏れ

などなど...

大変なところ

破綻した経験があるでのは?

jQuery based architecture

そう、とても変更に弱いのです

責務による分割

メンテナンス性!!

TodoMVChttp://todomvc.com/

Ember.js のアプローチ

RouterControllerViewTemplateModel

URL とアプリケーションの対応づけアプリケーションコンテキストを保持画面表示ブラウザに表示される部分永続化されているオブジェクト

Router

ControllerView

Template

Model

URL

ブラウザ

1. オブジェクトを取得2. コントローラを用意

4. テンプレートを描画

ユーザ入力

遷移

3. オブジェクトとテンプレートをバインド

Router

ControllerView

Template

Model

URL

ブラウザ

1. オブジェクトを取得2. コントローラを用意

4. テンプレートを描画

ユーザ入力

遷移

3. オブジェクトとテンプレートをバインド

開発者は必要な部分だけを作る

Ember.js がやっていること

必ず必要になる処理をサポート強力な命名規約オブジェクトと表示のバインド

DOM 管理 -> フレームワークオブジェクトの監視 -> フレームワーク

使ってて気持ちいいか -> 開発者

適切な役割分担

プログラマがアプリの本質に集中できるよう、それ以外の部分をサポートしてくれる!!

ここまでが、Ember.js の基本的な考え方

チェックポイント

* すごいアプリケーションを作るための フレームワークです* プログラマーが快適に開発することを サポートしてくれます

「Ember.js って何?」

今日の話* Ember.js って何?* Ember.js と Ruby

さぁ、ここからは実際に Ember.js をはじめてみよう!

Ruby と一緒に

対象バージョン

Ember.js 1.0.0

2013.09.28 現在、最新の安定版

ざっくりと基礎について

-- ここから --

http://emberjs.com/Starter kit

関連ライブラリのセットアップ前準備

jQuery 1.10.2Handlebars 1.0.0Ember.js 1.0.0

アプリケーションの初期化

Account = Ember.Application.create();

http://emberjs.com/続きは demo を

ざっくりと基礎について

-- ここまで --

http://tricknotes.github.io/demo-for-osc2013do/

Demo アプリケーション

一から始める方はこちらを!!

http://www.slideshare.net/tricknotes/getting-started-with-emberjs

はじめる Ember.js

今日は Ruby と一緒に始めます

なんで Ruby と??

コミュニティ 文化

今日は、このデモアプリをさらに実践的にしていきましょう

ファイルを適切に分割したい

case 1

1 ファイルだとちょっと...

https://gist.github.com/tricknotes/6556505

ファイル数が増え過ぎるのも...

コンポーネントが分割されていても、ファイルを分けられないと、

あんまり嬉しくない

とくに template !!

ember-railshttps://github.com/emberjs/ember-rails

for rails application

Asset Pipeline$ tree.!"" application.js!"" controllers#   !"" sheet_index_controller.js#   $"" sheet_new_controller.js!"" models#   !"" order_line.js#   $"" sheet.js!"" router.js!"" routes#   !"" sheets_index.js#   $"" sheets_new.js$"" templates $"" sheets !"" index.js.handlebars $"" new.js.handlebars

Asset Pipeline$ tree.!"" application.js!"" controllers#   !"" sheet_index_controller.js#   $"" sheet_new_controller.js!"" models#   !"" order_line.js#   $"" sheet.js!"" router.js!"" routes#   !"" sheets_index.js#   $"" sheets_new.js$"" templates $"" sheets !"" index.js.handlebars $"" new.js.handlebars

自動で全部のファイルが結合される(application.js)//= require_tree .

Asset Pipeline$ tree.!"" application.js!"" controllers#   !"" sheet_index_controller.js#   $"" sheet_new_controller.js!"" models#   !"" order_line.js#   $"" sheet.js!"" router.js!"" routes#   !"" sheets_index.js#   $"" sheets_new.js$"" templates $"" sheets !"" index.js.handlebars $"" new.js.handlebars

<scripe src=”application.js”></script>

HTML からは 1 ファイルを読むだけ

(application.js)//= require_tree .

Asset Pipeline$ tree.!"" application.js!"" controllers#   !"" sheet_index_controller.js#   $"" sheet_new_controller.js!"" models#   !"" order_line.js#   $"" sheet.js!"" router.js!"" routes#   !"" sheets_index.js#   $"" sheets_new.js$"" templates $"" sheets !"" index.js.handlebars $"" new.js.handlebars

handlebars はファイル(+ディレクトリ)名を

テンプレート名としてコンパイル

Asset Pipeline$ tree.!"" application.js!"" controllers#   !"" sheet_index_controller.js#   $"" sheet_new_controller.js!"" models#   !"" order_line.js#   $"" sheet.js!"" router.js!"" routes#   !"" sheets_index.js#   $"" sheets_new.js$"" templates $"" sheets !"" index.js.handlebars $"" new.js.handlebars

<h1>帳票一覧</h1>

{{#unless this}} まだ帳票は作成されていません{{/unless}}

<ul> {{#each}} <li> #{{id}}: {{date createdAt}} {{#link-to 'sheet' this}} 内容を見る {{/link-to}} </li> {{/each}}</ul>

テンプレート単位でファイルに分割できる

ember-middlemanfor static site

https://github.com/tricknotes/ember-middleman

だいたい同じ感じ

途中で飽き 作成中なので一緒にやりたいひと募集中

Asset pipeline 強力ですね!!

ここからは Rails 前提で進めていきます

関連ライブラリのバージョンを管理したい

case 2

ember-sourcehandlebars-source

(jquery-rails)

ember-rails に含まれている!!

(application.js)//= require jquery//= require handlebars//= require ember//= require_tree .

application.js に追記するだけ

アップデートが簡単!!

bundle update でEmber.js が更新される

Asset pipelin ++

handlebars 以外の選択肢がほしい

case 3

「HTML のタグ書くのが面倒!!」

というひと向けに...

haml で handlebars を記述

hamlbarshttps://github.com/jamesotron/hamlbars

<h1>帳票一覧</h1>

{{#unless this}} まだ帳票は作成されていません{{/unless}}

<ul> {{#each}} <li> #{{id}}: {{date createdAt}} {{#link-to 'sheet' this}} 内容を見る {{/link-to}} </li> {{/each}}</ul>

%h1 帳票一覧

= hb ‘unless this’ do まだ帳票は作成されていません

%ul = hb ‘each’ %li #{hb ‘id’}: = hb ‘date createdAt’ = hb ‘link-to “sheet” this’ do 内容を見る

jade 風に handlebars を記述

emblem-railshttps://github.com/alexspeller/emblem-rails

<h1>帳票一覧</h1>

{{#unless this}} まだ帳票は作成されていません{{/unless}}

<ul> {{#each}} <li> #{{id}}: {{date createdAt}} {{#link-to 'sheet' this}} 内容を見る {{/link-to}} </li> {{/each}}</ul>

h1 帳票一覧

unless this まだ帳票は作成されていません

ul each li #{id}: #{date createdAt} #{link-to “sheet” this’} 内容を見る

erb 派は handlebars のままで!

Backend サーバをrails で作りたい

case 4

Ember.js と API をつなぐ部分

Ember DataEmber.Model

(他にもいろいろあるけど...)

Ember Data空前の魔改造ブーム

生まれ変わっている途中これからに期待!!

https://github.com/emberjs/data

API とのやりとりで、JSON の scheme と JS の scheme をいちいち考えるのは

けっこう手間

ActiveModel::Serializershttps://github.com/rails-api/active_model_serializers

Ember Data+

ActiveModel::Serializers=

なんとなくいい感じに JSON の scheme を扱ってくれる

class SheetSerializer < ActiveModel::Serializer attributes :id, :created_at

has_many :order_lines, embed: :objects, include: trueend

Account.SheetSerializer = DS.ActiveModelSerializer.extend({ attrs: { orderLines: {embedded: 'always'} }});

Ruby 側のシリアライザ

JS 側のシリアライザ

{ “sheet”: { “id”: 6, “created_at”: "2013-09-21T15:59:24.001Z", “order_lines”: [{ “id”: 10, “product_name”: "ガラナ", “unit_price”: 120, “count”: 10 }, { “id”: 11, “product_name”: "豆乳", “unit_price”: 98, “count”: 30 }] }}

やりとりされる JSON の scheme

JS 側でのオブジェクトの保存

var sheet = Account.Sheet.createRecord();

sheet.save();

Ember Date が backend サーバにリクエストを投げて保存する

Ember アプリをテストしたい

case 5

Capybara.├── capybara-webkit├── Poltergeist│ └── teaspoon├── selemiun-webdriver└── (konacha)

Ruby の JS テストツールたち

Capybara.├── capybara-webkit├── Poltergeist│ └── teaspoon├── selemiun-webdriver└── (konacha)

Ruby の JS テストツールたち

Poltergeisthttps://github.com/jonleighton/poltergeist

Poltergeist

* PhantomJS の Capybara driver* JS の debugger が使える* テスト実行時に JS のエラーを検知できる* スクリーンショットが撮れる

feature 'sheet を管理できる', js: true do scenario 'sheet を作成できる' do visit root_path

expect(page).to have_css('h1', text: '帳票登録')

within all('#new-sheet tr')[1] do fill_in 'productName', with: 'ガラナ' fill_in 'unitPrice', with: '120' fill_in 'count', with: '3' end

expect(page).to have_css('.total', text: '360')

click_button '登録する'

expect(page).to have_css('h1', text: '帳票一覧') expect(page).to have_css('li', text: '#1') endend

単体テストは...?konacha teaspoon

ember-testing

うーん、よくわかりません

rails 版のソースコードはこちらにhttps://github.com/tricknotes/ruby-sapporo-workshop-27-demo

今日のまとめ* Ember.js はすごいアプリケーションを 作るためのフレームワークです* 快適に開発する手助けをしてくれます* Ruby のツールと相性がいいです* 開発ツールはかなり整っているで、 この機会に始めてみましょう!

今日話さなかったこと

* Ember.js 自体について* サーバからエラーのハンドリング* Ember Data の闇

難しいところ

* 学習コストが高い* 日本語の情報が少ない* そもそも 1.0 の情報が少ない

for more information...

http://emberjs.com/guides/

http://discuss.emberjs.com/

ぜひみなさんも、Ember.js を使った

快適なアプリケーション開発を体感してみてください!!