入り口としてのKnockout.js
by
TAK WAT
×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
入り口としてのKnockout.js
Slide 2
Slide 2 text
自己紹介 ● ソフトウェアエンジニア ● 勉強会ではフロントエンドよりの話をしますがもともとバックエンド側の人です
Slide 3
Slide 3 text
実際に仕事や個人プロジェクトで使っているもの ● Vue.js / React.js / Knockout.js ● 日付関係の処理 moment.js / 日付範囲はmoment.rangeで ● その他かゆいところに手が届く lodash ● WebStorage 関連 Store.js ○ WebStorageに絡む細かい差異の吸収 (Safariのプライベートモードで localStorage使えない問題も 代替手段で解決してくれるようで ) ● IndexedDB は lovefield ○ WebSQLさんは犠牲になったのだ
Slide 4
Slide 4 text
フロント側のJavaScript ライブラリやフレームワーク
Slide 5
Slide 5 text
● Angular ● React ● Backbone ● Vue ● Riot ● 生JSやjQueryで頑張る いろいろありますが今回はKnockout.jsです
Slide 6
Slide 6 text
むかしむかし(2011年 震災直後) 当時は社内SEをしていて 社内システム構築をするプロジェクト jQuery + jQuery UI + jQuery 何とかをいっぱい使って、当時としてはかなりリッチなフロン トエンド(グラフィカルなスケジューラつき) PHP(CodeIgniter 2)を使ってバックエンドを構築 じきにこいつはJSONのクエリをSQLに変換して結果をJSONで書き出すだけのBOT化した 無事リリースしてユーザ部門も使い方に慣れて新機能の要望も出てきたあたりで
Slide 7
Slide 7 text
あの・・・ いい加減jQueryでDOMいじるの辛いです・・・
Slide 8
Slide 8 text
jQueryだと辛いこと(1) どんだけ頑張ってもフロントからのデータ処理とそのデータをHTML上に反映させるため のDOM操作を書く部分が冗長 var data = {text: ‘Hello’, world: true}; var span = $(‘
’).text(data.text); if(data.world){ span.addClass(‘hello-world’); } span.appendChild()・・・
Slide 9
Slide 9 text
jQueryだと辛いこと(2) (1)のせいで、UI部分はデザイン専門の方に奇麗にデザイン→ コーディングしてもらっても、結局プログラマのほうで自力やスクリ プト内でidやclassふるしかない →そのうち要素のidがかぶる、クラス名が長くなる事象が頻発する →かくしてデザイン専門の方がいじれない HTMLのようなおぞましい何かと名状し難い JavaScriptで 書かれたと思われる何かが出来上がり →デザイン用HTMLとプログラム用HTMLの差分が酷く二重管理というアンチパターン
Slide 10
Slide 10 text
それでも まだjQuery関係だけで頑張れる範囲ではあったので細々とメンテ してました ただ、さすがにそろそろアカン・・・ということでこの辺の煩わしさか ら解放されるべく色々と調べてみたのが2012年末頃
Slide 11
Slide 11 text
第一期 テンプレートエンジンの活用 jQuery.tmpl とか jsRender / jsViewあたり テキスト埋め込みの問題は楽にはなったものの、フォームとの連携 document.on(‘change’, ‘input[name=”foo”]’, function(){ … }); まだ手書きでイマイチ楽になった気がしなかった
Slide 12
Slide 12 text
Knockout.js ● このテのライブラリとしてはかなり古参 ● DOMとJavaScript内部のオブジェクトを紐づけること以外は干渉してこない ● リアルなDOMとJS内のオブジェクトとの2way binding ○ Observable(監視対象)なオブジェクトの値が変更されると直接リアルDOMにも 反映しようとする ■ 最近のフレームワークはここをVirtualDOM経由にして差分のみ描画とか ● このリアルDOM直接というのが実はすごく大事で、同じくリアルDOM 直接派のjQuery系と握手できる
Slide 13
Slide 13 text
そんなKnockout.jsの2017年現在での立ち位置 Microsoftの中の人が開発していてVisual Studio 2012 で多少日の目をみましたがとか くマイナーでリリース年から見ても「古く機能も少ない」イメージを持たれているのは確か ● SPA(Single Page Application)やRouter ● Virtual DOM ● Flux ● SSR(Server Side Rendering) 今をときめくフレームワークやライブラリには当たり前のように存在しているだろうこの辺の 要素があまりないわけで・・・
Slide 14
Slide 14 text
だが、それがいい
Slide 15
Slide 15 text
当時欲しかったものの要件 ● 手っ取り早くはじめられるもの ● 当時はSPAにするつもりはあまりなかったので、ルーティングは要らない ○ URLごとにリロードする普通のWebサイト ● 既存のHTMLへの「ちょい足し」からはじめられる
Slide 16
Slide 16 text
Demo Hello World
Slide 17
Slide 17 text
Pros(1) ● 敷居が低く学習コストも低い ○ 基本的に超シンプル ○ チュートリアルが充実してる ● 大上段からコンポーネントやディレクティブといったものを作るのではなく既 存のHTMLにちょい足しするというアプローチから ○ Componentsの概念もあるけど他ほど必須ではない
Slide 18
Slide 18 text
Pros(2) ● HTML上もdata-bindなどのdata-*属性なのでvalid ○ そこまで気にするご時勢でもない気もしますが一応 ● 書式指定(カスタムバインディング)を作るのも簡単な流儀に沿ったオブジェ クトを生やすだけ ○ 流儀=createとupdate時のコールバックをプロパティとして持つ(どっち もoptional) ● jQueryプラグインを使いたいときは普通に使える ○ ちなみにknockout.jsはjQueryには依存しないPureJS実装です
Slide 19
Slide 19 text
Cons(1) ● RouterがないのでこれだけでSPAは無理 ● 最低限のお約束以外は特にこれといった制約がないので大規模プロジェク トだと収拾がつかなくなる恐れがある ○ 泥縄式にこみいったことをやろうとするとdata-bind属性の中に延々と JSON文字列や挙句の果ては関数をリテラルで書いてることもあるので うまく ViewModel のメソッド化することが肝要
Slide 20
Slide 20 text
Cons(2) ● たかだかテキストを表示させるだけに
タグを用意してあげなきゃいけない ケースがあったりするなどDOMの制約をうける(HTMLのコメント形式な書き方や Knockout.Punchesという {{value}} な感じのテンプレート構文が使えるSyntax Sugerがプラグインであるのでだいぶマシになる) ● ko.observable() / ko.observableArray()という謎の物体 ○ observableな値の代入は関数呼び出しなので直感的にわかりにくい ○ knockout-es5というプラグインでもう少し楽に書けるようになる
Slide 21
Slide 21 text
実際に手を動かしてみましょう https://github.com/takwat/knowledgeBBQ-Session-8
Slide 22
Slide 22 text
何を訴えたいか ● XMLHttpRequestで出し入れするデータの保存先 ● データの画面(DOM)上の反映 Knockout.jsに限らず後者を自動的にやってくれる便利なツールは世の中にあふれてい ますので、そこを手書きはやめたほうがいいです Knockout.jsで感じがつかめると、Riot.jsやVue.jsも違和感なく入っていきやすくなります jQueryが辛くなってきたときの選択肢は持っておくべき
Slide 23
Slide 23 text
ありがとうございました