106
佐藤 竜之介(Ryunosuke SATO) Sapporo.js Ruby勉強会@札幌-27 はじめる Ember.js!! ~ Getting started with Ember.js ~ 2013.09.28 もっと!

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

はじめるEmber.js!!

~ Getting started with Ember.js ~

2013.09.28

もっと!

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

提供

Sapporo.js

Community for people who like JavaScript.

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

自己紹介

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

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

http://tricknotes.hateblo.jp/

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

I love OSS

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

I am a contributerof Ember.js

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

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

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

2013.11.11Ember.js ハンズオン

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

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

https://idobata.ioIdobata

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

東京Node学園祭20132013.10.26

http://nodefest.jp/2013/

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

Comming soon...

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

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

*/

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

よろしくお願いします

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

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

はじめるEmber.js!!

~ Getting started with Ember.js ~

2013.09.28

もっと!

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

http://emberjs.com/

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

Ember.js 1.0 released!

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

今日の目標

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

Ember.js について...

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

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

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

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

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

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

ました

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

例えば...

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

Travis CI

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

Discourse

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

Idobata

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

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

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

ユーザ体験

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

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

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

jQuery でのアプローチ

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

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

などなど...

大変なところ

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

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

jQuery based architecture

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

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

責務による分割

メンテナンス性!!

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

TodoMVChttp://todomvc.com/

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

Ember.js のアプローチ

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

RouterControllerViewTemplateModel

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

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

Router

ControllerView

Template

Model

URL

ブラウザ

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

4. テンプレートを描画

ユーザ入力

遷移

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

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

Router

ControllerView

Template

Model

URL

ブラウザ

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

4. テンプレートを描画

ユーザ入力

遷移

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

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

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

Ember.js がやっていること

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

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

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

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

適切な役割分担

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

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

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

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

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

チェックポイント

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

「Ember.js って何?」

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

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

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

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

Ruby と一緒に

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

対象バージョン

Ember.js 1.0.0

2013.09.28 現在、最新の安定版

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

ざっくりと基礎について

-- ここから --

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

http://emberjs.com/Starter kit

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

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

jQuery 1.10.2Handlebars 1.0.0Ember.js 1.0.0

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

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

Account = Ember.Application.create();

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

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

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

ざっくりと基礎について

-- ここまで --

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

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

Demo アプリケーション

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

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

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

はじめる Ember.js

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

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

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

なんで Ruby と??

コミュニティ 文化

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

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

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

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

case 1

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

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

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

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

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

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

あんまり嬉しくない

とくに template !!

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

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

for rails application

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

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

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

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 .

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

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 .

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

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 はファイル(+ディレクトリ)名を

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

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

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>

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

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

ember-middlemanfor static site

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

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

だいたい同じ感じ

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

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

Asset pipeline 強力ですね!!

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

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

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

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

case 2

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

ember-sourcehandlebars-source

(jquery-rails)

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

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

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

application.js に追記するだけ

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

アップデートが簡単!!

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

Asset pipelin ++

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

handlebars 以外の選択肢がほしい

case 3

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

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

というひと向けに...

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

haml で handlebars を記述

hamlbarshttps://github.com/jamesotron/hamlbars

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

<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 内容を見る

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

jade 風に handlebars を記述

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

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

<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’} 内容を見る

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

erb 派は handlebars のままで!

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

Backend サーバをrails で作りたい

case 4

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

Ember.js と API をつなぐ部分

Ember DataEmber.Model

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

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

Ember Data空前の魔改造ブーム

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

https://github.com/emberjs/data

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

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

けっこう手間

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

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

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

Ember Data+

ActiveModel::Serializers=

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

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

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 側のシリアライザ

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

{ “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

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

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

var sheet = Account.Sheet.createRecord();

sheet.save();

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

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

Ember アプリをテストしたい

case 5

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

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

Ruby の JS テストツールたち

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

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

Ruby の JS テストツールたち

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

Poltergeisthttps://github.com/jonleighton/poltergeist

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

Poltergeist

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

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

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

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

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

ember-testing

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

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

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

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

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

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

今日話さなかったこと

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

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

難しいところ

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

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

for more information...

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

http://emberjs.com/guides/

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

http://discuss.emberjs.com/

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

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

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