Spine入門

24
2012/07/11 31HTML5とか勉強会 Acroquest Technology Co.,Ltd. Kenichiro Murata(@muraken720)

description

2012/07/11 第31回 HTML5とか勉強会 JavaScriptMVCフレームワーク「Spine入門」 (2012/07/12改版)ファイルサイズの比較について、比較条件が同じではないとのコメントを頂き、条件をmin+gzip時に統一して該当箇所を改版しました。

Transcript of Spine入門

Page 1: Spine入門

2012/07/11 第31回 HTML5とか勉強会 Acroquest Technology Co.,Ltd.

Kenichiro Murata(@muraken720)

Page 2: Spine入門

目次

1.  はじめに 2.  Spineに興味を持った経緯 3.  Spineとは? 4.  Spineの3つの特徴 5.  何はともあれ、Todos App! 6.  Spineの7つのお気に入りなポイント 7.  まとめ

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 2

Page 3: Spine入門

1. はじめに

自己紹介 = 氏名: ‘村田 賢一郎’ twitter: ‘@muraken720’ 所属: ‘Acroquest Technology Co.,Ltd.’ 仕事:

‘ライフライン系ネットワーク集中監視システム開発’ ‘フレームワーク開発’

言語: ‘Java’ #JavaScriptはWebアプリケーション開発で少々 興味:

‘node.js’ ‘CoffeeScript’

‘機関車トーマス!’ Copyright © Acroquest Technology Co., Ltd. All rights reserved.

3

Page 4: Spine入門

2. Spineに興味を持った経緯

n  WGP(Web Graphical Platform)を「JavaScriptMVCフレームワーク」を使って改良せよ! Ø  WGPはグラフィカルなWebUI開発用のJavaScriptなOSS。

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 4

http://wgp.sourceforge.net/

Page 5: Spine入門

3. Spineとは?

1.  Backbone.jsにインスパイアされて開発。

2.  開発者: Alex MacCaw (@maccam)氏 Ø  著書:

– ステートフルJavaScript(原書:JavaScript Web Applications) –  The Little Book on CoffeeScript

3.  「ステートフルJavaScript」で提案する手法を体現することを目指して、執筆時に開発。

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 5

本に出てくるSpine.jsは、CoffeeScriptに出会う前の純粋なJavaScript実装版です。

Page 6: Spine入門

4. Spineの3つの特徴

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 6

1. Simple

2. Lightweight

3. CoffeeScript

Page 7: Spine入門

4-1. SimpleなMVCモデルアーキテクチャ

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 7

Controller

View Model

Event Event

Bind

①  Data Model ②  Data storage and manipulation

①  Event Handling

②  Rendering ③  Routing

①  Layout ②  Template

Page 8: Spine入門

4-2. Lightweightなフレームワーク

1.  ライン数: 約500 Line 2.  サイズ(min+gzip): 8.1k( 小構成4.1k)

ü  Backbone.js(5.6k)+Underscore.js(4k) ü  Ember.js(42k) ü  AngularJS(29k)

3.  依存ライブラリ: なし Ø  JQuery or Zepto.js は推奨

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 8

0 10 20 30 40 50

Spine.js

Backbone.js+Underscore.js

AngularJS

Ember.js

※ 勉強会後、サイズについて比較条件が同じではないとのコメントを頂き、条件をmin+gzip時のサイズに統一して改版しました。

Page 9: Spine入門

4-3. CoffeeScriptは簡潔で分かりやすい!?

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 9

class Model extends Module …

 @select: (callback) ->    result = (record for id, record of @records when callback(record))    @cloneArray(result)

 @each: (callback) ->    for key, value of @records      callback(value.clone())

Javaエンジニア的には分かりやすい!

Good-bye! prototype.

https://github.com/maccman/spine/blob/master/src/spine.coffee

Page 10: Spine入門

5. 何はともあれ、Todos App!

n  Spineで、有名なTodos Appを使って作ってみよう!

n  全ソースはGithubにて公開しています。 Ø  https://github.com/muraken720/todos-spineapp-hem-eco Ø  https://github.com/muraken720/todos-spineapp-hem-jqtmpl

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 10

Page 11: Spine入門

5. Todos Appの構成

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 11

TaskController

TaskApp(Controller)

Task(Model)

task.eco(View)

The Element pattern

Page 12: Spine入門

 Spine.js

6. Spineの7つのお気に入りポイント

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 12

Controller

View Model

Spine.app app generator

Hem dependency manager

& server

⑤Ecoテンプレートをpre-compile

①定形作業を自動化 ⑥楽々デバッグ ⑦ビルドで頭スッキリ!

②Storage機能を併せ持つ③Adapterの切り替えが簡単

④Event、Elementのマッピングが簡単

Page 13: Spine入門

6-①. Spine.appで定形作業を自動化

n  Spine.app とは、アプリケーションの自動生成ツール n  インストール

n  各種コマンド

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 13

spine app todos       # アプリケーションのひな形を生成

spine model task # Modelのひな形を生成

spine controller taskctrl # Controllerのひな形を生成

> npm install spine.app hem # インストール

Page 14: Spine入門

6-②. ModelはStorage機能を併せ持つ

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 14

Spine = require('spine')

class Task extends Spine.Model @configure 'Task', "name", "done” … @active: -> @select ( (item) -> !item.done ) …

module.exports = Task

Modelが提供する関数(抜粋)

create find save select exsits updateAttribute each all bind

configureで、Model名とプロパティ名を定義するだけ。 Storageに対する操作は標準で提供

app/models/task.coffee

Page 15: Spine入門

6-③. Model Adapterの切り替えが簡単

ü  @LocalでHTML5のLocalStorageに永続化 ü  @AjaxでRESTでサーバサイドを呼び出し

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 15

Spine = require('spine')

class Task extends Spine.Model @configure 'Task', "name", "done”

@extend @Local

@active: -> @select ( (item) -> !item.done ) … module.exports = Task

app/models/task.coffee

extendでLocalStrorage用のAdapterを指定

Page 16: Spine入門

6-④. ControllerでEventのマッピングが簡単

ü  events hashでユーザ操作によるイベントを関数にマッピング可能。

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 16

class TaskApp extends Spine.Controller …

events: "submit form": "create" "click .clear": "clear” … create: (e) -> e.preventDefault() Task.create(name: @input.val(), done: false) @input.val("")

app/index.coffee

Eventと関数の関連付け定義は以下の形式 events: “イベント名 Selector”: “関数名”

Page 17: Spine入門

6-④. ControllerでElementのマッピングが簡単

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 17

class TaskApp extends Spine.Controller … elements: ".items": "items" ".countVal": "count" ".clear": "clearlink" "form input": "input” … addOne: (task) => taskctrl = new TaskController(item: task) @items.append(taskctrl.render().el) app/index.coffee

Elementと変数の関連付け定義は以下の形式 elements: “Selector”: “変数名”

ü  elements hashでDOMを変数にマッピング可能。

Page 18: Spine入門

6-⑤. ViewにてEcoテンプレートをpre-compile

ü  Viewに関しては特に規定なし。 ü  後述のHemにてEcoテンプレートをpre-compileしてくれるので、

requireで簡単に利用可能。

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 18

<div class="item <%= "done" if @done %>"> <div class="view" title="Double click to edit..."> <input type="checkbox" <%= "checked='checked'" if @done %>> <span><%= @name %></span> <a class="destroy"></a> </div> <div class="edit"> <input type="text" value="<%= @name %>"> </div> </div> Controllerにて以下のように利用する

render: => @replace require('views/task')(@item)

app/views/task.eco

Page 19: Spine入門

6-⑥. Hemで楽々デバッグ

n  Hem とは、開発用サーバ&依存関係管理ツール n  開発用サーバの起動

ü  “*.coffee”, “*.styl” をapplication.js, application.cssに変換 ü  “*.eco”をpre-compile ü  ファイルの更新を監視しており、サーバの再起動なしで変

更を自動反映

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 19

hem server # 開発用のサーバを起動

Page 20: Spine入門

6-⑦. Hemのビルドで頭スッキリ

n  デプロイ用のビルド ü  requireを解釈して、JavaScript間の依存関係を解

消したデプロイ用の統合ファイル(application.js, application.css)を生成

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 20

hem build # application.js, application.cssを生成

Page 21: Spine入門

6-⑦. Hemのビルドで頭スッキリ

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 21

<head> <title>Todos</title> <link rel="stylesheet" href="css/todos.css" type="text/css" charset="utf-8"> <script src="lib/json2.js" type="text/javascript" charset="utf-8"></script> <script src="lib/jquery.js" type="text/javascript" charset="utf-8"></script> <script src="lib/jquery.tmpl.js" type="text/javascript" charset="utf-8"></script> <script src="lib/spine.js" type="text/javascript" charset="utf-8"></script> <script src="lib/local.js" type="text/javascript" charset="utf-8"></script> <script src="lib/todos.js" type="text/javascript" charset="utf-8"></script> </head>

<head> <title>Todos</title> <link rel="stylesheet" href=”/application.css" type="text/css" charset="utf-8"> <script src=”/application.js" type="text/javascript" charset="utf-8"></script> </head>

Page 22: Spine入門

7. まとめ:Spineの3つの特徴

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 22

1. Simple

2. Lightweight

3. CoffeeScript

Page 23: Spine入門

 Spine.js

7. まとめ:Spineの7つのお気に入りポイント

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 23

Controller

View Model

Spine.app app generator

Hem dependency manager

& server

⑤Ecoテンプレートをpre-compile

①定形作業を自動化 ⑥楽々デバッグ ⑦ビルドで頭スッキリ

②Storage機能を併せ持つ③Adapterの切り替えが簡単

④Event、Elementのマッピングが簡単

Page 24: Spine入門

24

ご清聴、ありがとうございました。

Infrastructures  Evolution

Copyright © Acroquest Technology Co., Ltd. All rights reserved.