SlideShare uma empresa Scribd logo
1 de 55
Baixar para ler offline
pushState で作る
Web アプリケーション
2013/05/29
Tech Lab 4
Agenda
•お前だれよ
•pushState って何よ
•Kazitori.js
•作ってみる
お前だれよ
•Yamaguchi Eikichi
•@__kageyama__, @__hage__
•キュアニート
•http://kageya.ma
•js は 気づいたらやってた
前回のあらすじ
https://twitter.com/yuchimiri/status/312351688382111745/photo/1
pushState
pushState
•HTML5 ファミリー
•ブラウザの履歴を管理
•ハッシュではなく、ごく普通の URL として扱えるため
サーチエンジンも推奨
•多少サーバー側の処理が必要となる。
生でやろうとすると
結構めんどくさい
単に URL 変えるだけなら簡単
window.history.pushState({}, title, url)
ちゃんとやろうと思ったら
考えなきゃいけないこと
•いきなり下層コンテンツへアクセスがあった時の処理
•どの URL が pushState の対象なのかわかりづらい
•push があるなら pop もあるのでその扱い
•素材の読込など、 URL を変える前に実行したい処理
•pushState に対応していないブラウザへの対応
•ブラウザのヒストリーバック/進む機能への対応
_人人人人人_
> Kazitori.js <
 ̄Y^Y^Y^Y^Y^ ̄
Kazitori.js
•pushState をいい感じに処理してくれるライブラリ
•ver 0.2.3 -> 1.0 を開発中
•jQuery などへの依存が無いため単体で使える
•基本は CoffeeScript で書くことを推奨
•派生で CreateJS との相性がいい Milkpack.js というラッ
パーがある
ルーター + コントローラー
実例
https://github.com/alumican/Milkpack.js
http://webgl.hageee.net
https://github.com/glassesfactory/webgl-example
http://long.hageee.net
https://github.com/glassesfactory/kazitori-long-example
前回のこれ
Kazitori.js で出来ること
•見通しの良いルーティング
•URL 変数
•事前処理ができる
•URL クエリ
•IE7+, iPhone, Android などマルチ環境
•各処理段階ごとに色々イベント飛ばしてくれる
•一応実戦投入済み。
基本的な使い方
•Kazitori.js を継承したクラスを作る
•ルーティングを定義
•定義した URL に対応するハンドラを
登録
•インスタンス化
class Router extends Kazitori
routes :
'/':'index'
'/<int:id>':'show'
index:()->
console.log “index”
show:(id)->
console.log id
$(()->
window.App = new Router({root:'/'})
)
下準備
•事前資料でお願いしたものは入ってる前提。
•github から techlab4-template をダウンロード or git clone
•venv 作って pip install -r requirements.txt, npm install, grunt init を実行
今回は全部やると
長い & pushState とあんまり関係ない
のでほとんど書いてあります。
作っていく手順
•何はともあれルーティングを定義
•モデルを定義、実装
•コントローラーで各 URL を割り振る
•細かい動きとかフォーム処理とかを実装していく
わりとサーバーサイドのプログラムと
同じような感覚でやっていける
処理の流れ
•URL から適切なメソッドを判断
•サーバーからデータが読込まれているかチェック
•URL に対応した処理を実行する
ルーティング
class Router extends Kazitori
routes:
'/':'index'
'/<string:id>':'show'
 
index:()->
return
 
show:(id)->
return
ルーティング
•‘/’ , ‘/foo’
•ベタ書きの URL。優先度高い
•‘/foo/bar’ など URL のネストにも対応
•‘/<username>’
•変数として処理。コントローラーの引数として与えられる。
•‘/<int:id>’, ‘/<string:username>’
•変数に型指定をつけることが可能。
•‘/foo/<int:id>’ など ネストした状態でも指定できる
•root
•root を設定することで URL に prefix をつけることが出来る
•NotFound
•登録のない URL にアクセスされた時の処理
モデルがロード済みかチェック
class Router extends Kazitori
beforeAnytime: ["checkModel"]
routes:
'/':'index'
'/<string:id>':'show'
 
index:()->
return
 
show:(id)->
return
checkModel:()->
if not TweetModel.isLoaded()
#モデルの読み込みと Kazitori の一時停止
@suspend()
モデルがロード済みかチェック パターンその2
class Router extends Kazitori
routes:
'/':'index'
'/<string:id>':'show'
 
index:()->
return
 
show:(id)->
return
loadModel:()->
TweetModel.load()
@suspend()
 
 
$(()->
window.App = new Router()
window.App.addEventListener KazitoriEvent.FIRST_REQUEST,
window.App.loadModel
)
事前処理用の API は2種類
•beforeAnytime
•どの URL でも必ず処理する
•befores
•特定の URL だけ処理する
•書式は routes と同じ
•内部的にはタスクキューイングとして処理しているので
与えた順番で処理される。
処理の中断、再開、中止
•suspend
•現在の処理で中断(一時停止)する
•resume
•suspend したところから再開する
•reject
•処理を中止する
豊富なイベント
•KazitoriEvent.CHANGE
•URL が変わった時
•KazitoriEvent.EXECUTED
•URL に登録されたメソッドがちゃんと実行された
•KazitoriEvent.BEFORE_EXECUTED
•ビフォアー処理が完了した
•KazitoriEvent.PREV
•ヒストリーバックした時
•KazitoriEvent.NEXT
•ヒストリーネクストした時
豊富なイベント
•KazitoriEvent.REJECT
•中断
•KazitoriEvent.NOT_FOUND
•見つからなかった
•KazitoriEvent.START
•スタート
•KazitoriEvent.STOP
•ストップ
•KazitoriEvent.SUSPEND
•一時停止した
•KazitoriEvent.RESUME
•再開
•KazitoriEvent.FIRST_REQUEST
•初めてのアクセス
URL を変える(pushState)
$('.brand').on 'click', (event)->
event.preventDefault()
window.App.change '/'
URL を変える(replaceState)
$('.brand').on 'click', (event)->
event.preventDefault()
window.App.replace '/'
URL のチェック
window.App.match '/foo'
この辺り覚えてれば勝つる
Kazitori ファミリー
Kai
Kai について
•画像や js など、静的ファイルのパスを吐いてくれる君
•サーバーサイドでよくあるアレ
•無駄に相対パスにも対応
Kai の使い方
#初期化
Kai.init()
 
#CSS のパスを返す
console.log Kai.GET_CSS_PATH()
 
#script のパスを返す
console.log Kai.GET_SCRIPT_PATH()
 
#画像のパスを返す
console.log Kai.GET_IMAGE_PATH()
Kai のパスを変える
console.log Kai.GET_SCRIPT_PATH()
# デフォルトは /assets/scripts
Kai.init
scripts: "js"
console.log Kai.GET_SCRIPT_PATH()
# /assets/js にかわる
何がうまいのか
•デバイスごとに静的ファイルを分けて用意する場合
•UA 判断後、JS で動的に CSS や image の src 属性を設定する
•箇所が多い場合、ベタ打ちすると後から変更があった場合大変なことに…
•Kai から常にパスを取得するようにすれば一箇所だけの変更で済む。
Kazitori ファミリー
Hunanori.js
Hunanori.js について
•JS のログ機能を強化
•Hunanori.debug フラグのオン/オフで出力の可否をコントロール
•ログの前や後ろに区切り線などを出力するように出来る
https://github.com/glassesfactory/Hunanori.js
Hunanori.js の使い方
Hunanori.log("ソイヤ!")
#results
#ソイヤ!
Hunanori.debug = false
Hunanori.log("ソイヤソイヤ!")
#results...
Hunanori.js の使い方
class Sencho extends Hunanori
constructor:()->
hoge:()->
@log “はらへ”
sencho = new Sencho()
sencho.log("お腹すいた")
sencho.hoge()
#results...
#お腹すいた
#はらへ
Hunanori.js の使い方
class Sencho extends Hunanori
separator: "▂▅▇!▓"░('ω')░"▓!▇▅▂うわあああああああ"
prefix: ":( ゙゚'ω゚'):ウウウオオオアアアーーー!!!"
constructor:()->
sencho = new Sencho()
sencho.log("航路間違えた")
#results...
#:( ゙゚'ω゚'):ウウウオオオアアアーーー!!!
#航路間違えた
#▂▅▇!▓"░('ω')░"▓!▇▅▂うわあああああああ
Kazitori は更に進化する
0.9.9
1.0 のプレリリース版
•ルーターのネスト
•サイレントモード
ルーターのネスト
class FooRouter extends Kazitori
root: '/foo/'
routes:
'/': 'index'
'/<int:id>': 'show'
index:()->
console.log "foo index"
show:(id)->
console.log "foo show", id
class Router extends Kazitori
routes :
'/':'index'
'/foo': FooRouter
index:()->
console.log "indeeeeeex"
サイレントモード
App = new Router({'silent': true})
URL は変わらず、Kazitori の内部で保持している
fragment だけが変更される
プチハンズオン
class Router extends Kazitori
    routes:
      '/':'index'
      '/<string:id>':'show'
class Router extends Kazitori
    routes:
      '/':'index'
      '/<string:id>':'show'
    index:()->
      index.hide()
      contents.hide()
      return
    show:(id)->
      if not contents
        contents = new TECH.ShowController()
      if @.lastFragment isnt '/'
        contents.hideAndShow(id)
      else
        contents.show(id)
      index.slide()
      return
class Router extends Kazitori
    beforeAnytime: ["checkModel"]
    checkModel:()->
      if not index.hasModelLoaded()
        index.load()
        @suspend()
require ['app'], ()->
    $(()->
      index = new TECH.IndexController()
      newController = new TECH.NewController()
      contents = new TECH.ShowController()
      do(TECH)->
        TECH.App = new Router()
        $('.brand').on 'click', (event)->
          event.preventDefault()
          TECH.App.change '/'
    )
ご清聴ありがとうございました

Mais conteúdo relacionado

Semelhante a Teclab4

Python と Xpath で ウェブからデータをあつめる
Python と Xpath で ウェブからデータをあつめるPython と Xpath で ウェブからデータをあつめる
Python と Xpath で ウェブからデータをあつめるShuhei Iitsuka
 
20190531 「運用自動化」のモデルを考える
20190531 「運用自動化」のモデルを考える20190531 「運用自動化」のモデルを考える
20190531 「運用自動化」のモデルを考えるYoshikazu GOTO
 
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理Takafumi Yoshida
 
#phpmatsuri LT大会システムの中身
#phpmatsuri LT大会システムの中身#phpmatsuri LT大会システムの中身
#phpmatsuri LT大会システムの中身Hisateru Tanaka
 
新しくなったPg monzでpostgre sqlのクラスタを監視しよう
新しくなったPg monzでpostgre sqlのクラスタを監視しよう新しくなったPg monzでpostgre sqlのクラスタを監視しよう
新しくなったPg monzでpostgre sqlのクラスタを監視しようYoshinori Nakanishi
 
20190531 「運用自動化」に失敗してみた
20190531 「運用自動化」に失敗してみた20190531 「運用自動化」に失敗してみた
20190531 「運用自動化」に失敗してみたYoshikazu GOTO
 
HTML で自己紹介ページをつくる
HTML で自己紹介ページをつくるHTML で自己紹介ページをつくる
HTML で自己紹介ページをつくるShuhei Iitsuka
 
etckeeperをopenSUSEの公式リポジトリに入れたいぞ!
etckeeperをopenSUSEの公式リポジトリに入れたいぞ!etckeeperをopenSUSEの公式リポジトリに入れたいぞ!
etckeeperをopenSUSEの公式リポジトリに入れたいぞ!Mitsutoshi Nakano
 
GoでシュッとWebスクレイピングする
GoでシュッとWebスクレイピングするGoでシュッとWebスクレイピングする
GoでシュッとWebスクレイピングするYuta Ohashi
 
MF GeeksNight pplogの話
MF GeeksNight pplogの話MF GeeksNight pplogの話
MF GeeksNight pplogの話Naoto Koshikawa
 
プロセスの永続化でコスト削減 #perlbeginners
プロセスの永続化でコスト削減 #perlbeginnersプロセスの永続化でコスト削減 #perlbeginners
プロセスの永続化でコスト削減 #perlbeginners鉄次 尾形
 
BigQueryで集計するシステムを作って分かったKPI集計ツール作成
BigQueryで集計するシステムを作って分かったKPI集計ツール作成BigQueryで集計するシステムを作って分かったKPI集計ツール作成
BigQueryで集計するシステムを作って分かったKPI集計ツール作成(shibao)芝尾 (kouichiro)幸一郎
 
Elasticsearch at CrowdWorks
Elasticsearch at CrowdWorksElasticsearch at CrowdWorks
Elasticsearch at CrowdWorks佑介 九岡
 

Semelhante a Teclab4 (15)

Python と Xpath で ウェブからデータをあつめる
Python と Xpath で ウェブからデータをあつめるPython と Xpath で ウェブからデータをあつめる
Python と Xpath で ウェブからデータをあつめる
 
20190531 「運用自動化」のモデルを考える
20190531 「運用自動化」のモデルを考える20190531 「運用自動化」のモデルを考える
20190531 「運用自動化」のモデルを考える
 
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理
 
#phpmatsuri LT大会システムの中身
#phpmatsuri LT大会システムの中身#phpmatsuri LT大会システムの中身
#phpmatsuri LT大会システムの中身
 
新しくなったPg monzでpostgre sqlのクラスタを監視しよう
新しくなったPg monzでpostgre sqlのクラスタを監視しよう新しくなったPg monzでpostgre sqlのクラスタを監視しよう
新しくなったPg monzでpostgre sqlのクラスタを監視しよう
 
20190531 「運用自動化」に失敗してみた
20190531 「運用自動化」に失敗してみた20190531 「運用自動化」に失敗してみた
20190531 「運用自動化」に失敗してみた
 
HTML で自己紹介ページをつくる
HTML で自己紹介ページをつくるHTML で自己紹介ページをつくる
HTML で自己紹介ページをつくる
 
etckeeperをopenSUSEの公式リポジトリに入れたいぞ!
etckeeperをopenSUSEの公式リポジトリに入れたいぞ!etckeeperをopenSUSEの公式リポジトリに入れたいぞ!
etckeeperをopenSUSEの公式リポジトリに入れたいぞ!
 
GoでシュッとWebスクレイピングする
GoでシュッとWebスクレイピングするGoでシュッとWebスクレイピングする
GoでシュッとWebスクレイピングする
 
[Dots.]taiga
[Dots.]taiga[Dots.]taiga
[Dots.]taiga
 
MF GeeksNight pplogの話
MF GeeksNight pplogの話MF GeeksNight pplogの話
MF GeeksNight pplogの話
 
Hachiojipm31
Hachiojipm31Hachiojipm31
Hachiojipm31
 
プロセスの永続化でコスト削減 #perlbeginners
プロセスの永続化でコスト削減 #perlbeginnersプロセスの永続化でコスト削減 #perlbeginners
プロセスの永続化でコスト削減 #perlbeginners
 
BigQueryで集計するシステムを作って分かったKPI集計ツール作成
BigQueryで集計するシステムを作って分かったKPI集計ツール作成BigQueryで集計するシステムを作って分かったKPI集計ツール作成
BigQueryで集計するシステムを作って分かったKPI集計ツール作成
 
Elasticsearch at CrowdWorks
Elasticsearch at CrowdWorksElasticsearch at CrowdWorks
Elasticsearch at CrowdWorks
 

Último

プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 

Último (7)

プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 

Teclab4