angular jsとsinatraでturbolinks

29
AngularJS+Sinatra で Turbolinks Minori Tokuda

Upload: minori-tokuda

Post on 27-May-2015

2.181 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Angular jsとsinatraでturbolinks

AngularJS+Sinatra でTurbolinks

Minori Tokuda

Page 2: Angular jsとsinatraでturbolinks

AngularJS とは

▪Google 製の Java Script フレームワーク▪要はクライアントサイドで MVC をやる▪データバインディング強力

Page 3: Angular jsとsinatraでturbolinks

クライアントサイド MVC ?

▪要は View が DOM で Model が JavaScript のオブジェクト▪DOM と Model の状態を同期させたいなーというときに AngularJS がよしなにしてくれる▪データバインディング

Page 4: Angular jsとsinatraでturbolinks

データバインディング

View

<div ng-controller="MyCtrl">

{{message}}

</div>

Controller

function MyCtrl($scope){

$scope.message = "Hello, World!";

}

Page 5: Angular jsとsinatraでturbolinks

もっとデータバインディング

View

<div ng-controller="MyCtrl">

count = {{count}}

</div>

<button ng-click= "countup()">

Controller

function MyCtrl($scope){

$scope. count = 0;

$scope.coutup=function(){

$scope.count++;

}

}

Page 6: Angular jsとsinatraでturbolinks

ここから本題

▪ JavaScript でゴリゴリアプリをかける!▪ので、習作として自分のブログをAngularJS ベースに置き換え▪ブログ記事は全部 API 経由で動的に読み込み▪あれ、アクセスが減ってる・・・

Page 7: Angular jsとsinatraでturbolinks

問題は・・・

検索エンジン( Google )からの流入が減っていた

Page 8: Angular jsとsinatraでturbolinks

Google のクローラは JavaScript を実行できないため、 コンテンツを読み込んでくれなかった!

Page 9: Angular jsとsinatraでturbolinks

JavaScript アプリで SEO = 無理ゲー

Page 10: Angular jsとsinatraでturbolinks

一応、サーバサイドでレンダリングしてHTML を出すという手もある

=>めんどい…

Page 11: Angular jsとsinatraでturbolinks

対応策

▪ 最初にページをロードした時はサーバサイドで生成したビューを表示

▪ ページ内リンクは Ajax イベントに置き換えて、リンク移動するときはコンテンツだけ動的に書き換え

▪ 書き換えるコンテンツは API から取得して JavaScript 側で生成

PushState= URL 変更のイベントを JavaScript 側で管理できる

Page 12: Angular jsとsinatraでturbolinks

そんなんできるの? => YES

ngView

<div ng-view> </div>

ngRoute

app.config(

function($routeProvider){

$routeProvider. when("/page1", {

templateUrl: "/page1. html"

});

}

);

Page 13: Angular jsとsinatraでturbolinks

そんなんできるの? => YES

ngView

<div ng-view> </div>

ngRoute

app.config(

function($routeProvider){

$routeProvider. when("/page1", {

templateUrl: "/page1. html"

});

}

);

ここに page1. html の内容が挿入される

ページ遷移を乗っ取って、Ajax イベントに置き換える

Page 14: Angular jsとsinatraでturbolinks

Header

Body

Title

Content

テキストを入力

最初に開いたページだけはサーバ側で生成し、 他のページに移動するときは、中身のコンテンツだけ動的に読み込む!

ここと、

ここを、

AngularJS のngRoute を使って、入れ替える

Page 15: Angular jsとsinatraでturbolinks

あれ、これって・・・

Rails の Turbolinks じゃね?

Page 16: Angular jsとsinatraでturbolinks

Turbolinks

▪ Rails で pjax(pushState + Ajax) するためのプラグイン

▪ Rails4 でデフォルトで入るように

▪ JavaScript ページ遷移したように見せかける– ボディとタイトルを Ajax でごっそり入れ替え– URL は pushState で置き換え

▪ JavaScript 、 CSS の再読み込みが発生しない

▪ DOM も再読み込みしない

Page 17: Angular jsとsinatraでturbolinks

Header

Body

Title

Content

テキストを入力

要するにこれここと、

ここを、

JavaScript で入れ替える

Page 18: Angular jsとsinatraでturbolinks

同じ・・・

Rails でよくね?

Page 19: Angular jsとsinatraでturbolinks

結論が出ました!それはそれとして・・・

▪ AngularJS は便利なので使っていきたい– Turbolinks と AngularJS の同時使用は相性悪い

▪ Sinatra で作ってしまったので作りなおすのめんどい

▪ Rails 重い

Page 20: Angular jsとsinatraでturbolinks

というわけで、Sinatra+AngularJS で、Turbolinks モドキを作ってみた

Page 21: Angular jsとsinatraでturbolinks

続きは Live Demo で!

Page 22: Angular jsとsinatraでturbolinks

問題は・・・

▪ ここに最初の箇条書きを追加

▪ ここに 2 番目の箇条書きを追加

▪ ここに 3 番目の箇条書きを追加

Page 23: Angular jsとsinatraでturbolinks
Page 24: Angular jsとsinatraでturbolinks
Page 25: Angular jsとsinatraでturbolinks
Page 26: Angular jsとsinatraでturbolinks
Page 27: Angular jsとsinatraでturbolinks
Page 28: Angular jsとsinatraでturbolinks
Page 29: Angular jsとsinatraでturbolinks

アイコンをクリックして画像を追加