Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JSフレームワークを振り返る
Search
Teruo Kunihiro
February 12, 2017
Programming
0
2.2k
JSフレームワークを振り返る
合同勉強会 in 福岡で発表した資料
https://connpass.com/event/49117/
Teruo Kunihiro
February 12, 2017
Tweet
Share
Other Decks in Programming
See All in Programming
Elixir で IoT 開発、 Nerves なら簡単にできる!?
pojiro
1
120
Cursor AI Agentと伴走する アプリケーションの高速リプレイス
daisuketakeda
1
110
XSLTで作るBrainfuck処理系
makki_d
0
190
C++20 射影変換
faithandbrave
0
440
「ElixirでIoT!!」のこれまでとこれから
takasehideki
0
350
「兵法」から見る質とスピード
ickx
0
260
コードに語らせよう――自己ドキュメント化が内包する楽しさについて / Let the Code Speak
nrslib
6
1.4k
Julia という言語について (FP in Julia « SIDE: F ») for 関数型まつり2025
antimon2
3
920
ktr0731/go-mcpでMCPサーバー作ってみた
takak2166
0
160
イベントストーミングから始めるドメイン駆動設計
jgeem
4
820
技術懸念に立ち向かい 法改正を穏便に乗り切った話
pop_cashew
0
1.4k
Rails産でないDBを Railsに引っ越すHACK - Omotesando.rb #110
lnit
1
160
Featured
See All Featured
RailsConf 2023
tenderlove
30
1.1k
Reflections from 52 weeks, 52 projects
jeffersonlam
350
20k
Git: the NoSQL Database
bkeepers
PRO
430
65k
Code Review Best Practice
trishagee
68
18k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
228
22k
Testing 201, or: Great Expectations
jmmastey
42
7.5k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.5k
Transcript
JSϑϨʔϜϫʔΫΛ ৼΓฦΔ IN 2017 2017/02/11 Teruo Kunihiro
➤ ࡢ9݄͔Β גࣜձࣾNulab & Ԭ ➤ ۀ: HTML5ͷCacooͷ։ൃͱ͔ ➤ ࠓ·ͰJS։ൃҊ͕݅ଟ͔ͬͨͷͰओʹJSॻ͍
ͯ·͢ Twitterͱ͔Qiitaͱ͔ͨ·ʹGithub @knhr__ ➤ I love JavaScript!!But I want to study another languages. ࣗݾհ
CACOOʹ͍ͭͯ
͡Ίʹ ϑϩϯτΤϯυʹ͓͍ͯͷॲཧͷϓϩηε Event + DataStore => DOM ͔͠͠DOMͷมͷࡍʹViewʹ߹ΘͤͨDataͷՃ͕ඞཁ Event or
DataStore => DataStore + Data(For View) => DOM ͜ͷॲཧΛղ͘ͷ͕ϑϨʔϜϫʔΫ
͡Ίʹ ➤ ༻ޠ Model = DataStore, DataͷೖΕɺϏδωεϩδοΫ Controller = Πϕϯτड͚ͨΓɺ߹ʹΑͬͯView༻ͷσʔλ
ՃɺEvent Handleɻ ViewModel = View༻ͷσʔλՃɺEventͷϋϯυϦϯάɺσʔ λͷอ࣋ View = ͨͩͷςϯϓϨʔτ, JSXͱ͔ => ͨͩͷݴ༿ͳͷͰదͳ֓೦ͱͯ͠ଊ͑Δ
JSϑϨʔϜϫʔΫԿΛ͍·͔ͨ͠ʁ ➤ Backbone.js ➤ Knockout.js ➤ angular ➤ React ➤
Polymer ➤ riot.js ➤ angular2 ➤ Vue
ͦͷมԽʁ ➤ Componentࢦ ➤ jQueryʹΑΔDOMૢ࡞͔ΒVirtualDOM ➤ Stateཧํ๏ͷมԽ
WEBCOMPONENTͱ ➤ 2011ʹఏҊ͞ΕͨΞΠσΞ ➤ ωΠςΟϒͳAPIݱࡏChormeͷΈʹ࣮͞Ε͍ͯΔ ➤ ༷ࡦఆʹߤ͓ͯ͠Γͣͬ͜͜ͱDraftঢ়ଶ
WEBCOMPONENTͱ DOMͰݴ͑ҎԼͷΑ͏ͳλάΛࢦ͢ <hello-world></hello-world> => <div>hello world</div> DOMɺৼΔ͍ɺState(JS)ɺσβΠϯ(CSS)ɺ(JS)͕ΧϓηϧԽ͞ Εͨλά Data(for View)
+ DOM ϑϩϯτΤϯυͷViewͱಠཱͨ͠ίϯϙʔωϯτͷू߹ମͱଊ͑ Δ͜ͱ͕Ͱ͖Δ
COMPONENTͷ(ͩͬͨ) ➤ DOMͷߋ৽ͷॲཧ͕ॏ͍ DOMؙ͝ͱΛೖΕସ͑ΔͨΊDOMͷߋ৽ॲཧ͕ॏ͔ͬͨɻ ͔͠͠Componentͷߋ৽ҰׅͰߦΘͳ͍ͱෆ߹͕ى͖Δ ࠓ·Ͱͦ͜ΛjQueryͰؤுΔɻ ͘͠Two-way-data-bindingͰؤு͍ͬͯͨ jQueryͰؤுΓͨ͘ͳ͍ɻɻɻ
COMPONENTͷվળ DOMͷߋ৽ΛͰࠩߋ৽(Virtual DOMͳͲʹΑΓ)Ͱߦ͏ϑϨʔϜϫʔΫ͕ ಄͖ͯͨ͠ ࠩߋ৽ϥΠϒϥϦͤʹͰ͖Δ͜ͱʹΑͬͯɺରͷComponentͷߋ৽ ΛҰׅͰߦ͑ΔΑ͏ʹͳͬͨ ͨͩ͠WebComponent࣏తʹ࣮ݱ·ͩ·ͩͬΆ͍ͷͰ֤छϑϨʔϜ ϫʔΫ͕ݸผʹؤு͍ͬͯΔঢ়گ ͳͷͰWebComponentͷํͱׂͱҧ͏ͷ͋ΔɻReactͱ͔ https://github.com/reactjs/react-future/tree/master/02%20-
%20Web%20Components
COMPONENTࢦʹ͍ͭͯ ͰෳͷComponentͲͷΑ͏ʹ࿈ܞ͢Δͷ͔ ࢠͷίϯϙʔωϯτ͕ࢠίϯϙʔωϯτʹରͯ͠σʔλΛྲྀ͠ɺΠϕ ϯτΛड͚औΔΑ͏ʹಈ࡞ͤ͞Δ Component͕૿͑ͨΒঢ়ଶͷཧେมɻɻɻ
ΞϓϦέʔγϣϯͷSTATEཧ ➤ ෳͷComponentͷStateΛݸผʹ࿈ܞͤͯ͞ཧͤ͞Δͷ ݁ߏେม ➤ ͢ΔͱStateཧ·ͨผͰߦ͍͍ͨ!!ͬͯͳΔ ➤ શମͷStateཧݱࡏFluxϥΠΫ(͍͍ͩͨRedux)ͳͷ ͕ओྲྀͱͳ͍ͬͯΔ
STATEͷมભ ➤ MVCϑϨʔϜϫʔΫ ➤ ํόΠϯσΟϯά ➤ Elm / Flux /
Redux ͷΑ͏ͳؔܕϥΠΫͳStateཧ
MVCͱ ➤ Model - ΞϓϦݻ༗ͷσʔλ, ϏδωεϩδοΫ ➤ View - HTML,
ModelͷΛදࣔ ➤ Controller - ViewͷೖྗΛड͚औΔ, ModelΛૢ࡞ View͕ModelΛࢀরͯ͠ඳը͢Δɻ
MVCͱ ➤ ҰํํͳσʔλͷྲྀΕ ➤ ViewModelΛࢹ͍ͯ͠Δ ➤ ControllerΠϕϯτΛड͚ औͬͯModelΛߋ৽͢ΔͷΈ ➤ දతͳϑϨʔϜϫʔΫ
Backbone.js
MVCͱ VitrualDOMҎલͷMVCʹ͍͔͕ͭ͋ͬͨ͘ɻ ➤ DOMঢ়ଶΛอ͍࣋ͯ͠ΔͨΊʹ͠DOMΛશʹ࠶ඳը͢ ΔͱࣦΘΕΔσʔλ͕ଘࡏ͢ΔɻEventListernerͳͲ ➤ DOMͷૢ࡞ͱ͍ͯͨΊʹɺஞҰ࠶ඳըΛߦ͏ͷύ ϑΥʔϚϯεΛ͔ͳΓࣦ͏͜ͱʹͳΓ͏Δ ➤ ࠶ඳըͤͨ͘͞ͳ͍ͷͰɺControllerʹσʔλΛอ࣋ͤͯ͞Ξ
ϓϦέʔγϣϯͷঢ়ଶ͕͙ͪΌ͙ͪΌʹͳͬͨʢମݧஊʣ
MVVMͱ ➤ MVCΛݩʹͨ͠σβΠϯύλʔϯ ➤ ViewΛϏδωεϩδοΫΞϓϦέʔγϣϯͷৼΔ͍͔Β MVCΑΓ໌֬ʹͤ͞Δ ➤ Model - MVCͱಉ͡ɻViewModelͱ݁߹
➤ ViewModel - ModelͱViewͷσʔλͷՃɺσʔλͷอ࣋ ➤ View - ViewModelͱͷ݁߹ɻData-bindings, Event
MVVMͱ ➤ ViewModelͱͷؔ࿈Λ࣋ͨ ͳ͍ɻViewৗʹViewModelͱ ಉظ͢Δ ➤ σʔλͷํҰํํͰͳ͍ ➤ Ͳ͏ΒTwo-way-binding͕͋Δ ͷΛMVVMͱݴͬͯΔͬΆ͍
➤ ComponentࢦʹࣅͯViewʹର ͢ΔStateΛอ࣋͢Δ ➤ දతͳϥΠϒϥϦ Knockout.js
MVVMͱ ➤ όΠσΟϯά͞Ε͍ͯΔσʔλ෦ͷΈͷDOMΛߋ৽͢Δ͜ ͱͰɺMVVMMVCͷஞ࣍શ࠶ඳըͷΛղܾͨ͠ ➤ UI͝ͱʹViewModelΛ࡞͢Ε͍͍ͷͰUIͷฒྻ։ൃΛ؆ ୯ʹͨ͠ʢComponentࢦʣ ͔͠͠MVVMҎԼͷΛҾ͖ى͜͠·ͨ͠ ➤ εςʔτϑϧͳ֊ͷ૿ՃʹΑΓσʔλͷෳࡶ্͕ͬͨ
FLUX(REDUX)ͱ ➤ 2014͝ΖʹFacebook͕ൃදͨ͠Ұํํσʔλϑϩʔ ➤ ؔܕνοΫͳStateཧϑϨʔϜϫʔΫ ➤ ReduxFluxϥΠΫͳσʔλϑϩʔͷछྨͷҰͭ https://facebook.github.io/flux/docs/in-depth-overview.html#content
ͦͯ͠FLUX ➤ React͕ग़͖ͯͯDOMͷஞ࣍ߋ৽ͷίετ͕ݮͬͨ => σʔλͷมߋΛݕؙͯ͠͝ͱViewΛೖΕସ͑ΔॲཧΛؾ ܰʹߦ͑ΔΑ͏ʹͳͬͨ ➤ MVVM(Component)εςʔτϑϧͳ෦Λ૿ͯ͠͠ ·ͬͨ ➤
ͦͯ͠ModelҎ֎εςʔτϨεͳҰํํσʔλϑϩʔͰ͋ ΔMVCతͳΞʔΩςΫνϟ͕ඞཁͱͳͬͨ
TODO MVCΛݟͯΈΑ͏ ➤ TodoͷMVCͷྫΛݟͯݟ·͠ΐ͏
TODO MVCΛݟͯΈΑ͏ ➤ Model͕૿͑Δ ➤ View, Modelͷґଘ͕ؔෳ ࡶʹͳΔ ➤ ༷ʑͳσʔλͷߋ৽ʹରͯ͠
͜ͷΞϓϦέʔγϣϯ༧ଌ Մೳͳঢ়ଶΛҡ࣋Ͱ͖ΔͰ͠ΐ ͏͔
FLUXͳΒ ➤ Storeͷґଘؔ֊ߏʹ อͨΕɺͯ͢ͷStoreͷߋ৽ ͕ߦΘΕΔ·ͰViewʹө͞ Εͳ͍ ➤ StoreΛ৮Δ͜ͱ͕Ͱ͖ͳ ͍ɻಛఆͷAction͔Βৗʹ ಉ݁͡ՌΛಘΔ͜ͱ͕Ͱ͖Δ
ͨΊʹΞϓϦέʔγϣϯͷঢ় ଶΛ༧ଌՄೳʹͰ͖Δ
FLUXͱ ➤ Α͘ݟΔͱMVCͷম͖͠Ͱશ͘৽͍֓͠೦ͱ͍͏͜ͱͰ ͳ͍͕ɺΑΓڧ͍نͰറΒΕΔΠϝʔδ ➤ ΞϓϦέʔγϣϯͷঢ়ଶStoreʢͱComponentʣʹ͚ͩด͡ ࠐΊΒΕΔͨΊʹMVVMͷ࣌ΑΓ༧ଌՄೳͳΞϓϦέʔγϣ ϯ ➤ Stateͷߋ৽ৗʹ
f(State, Actions) => NewState
FLUX(REDUX)ͷ ➤ ݁ߏɻҰͭͷػೳΛՃ͢ΔͨΊʹView࡞ͬͯAction ࡞ͬͯStoreͷߋ৽࡞ͬͯStoreͷใΛComponentʹͭͳ͍Ͱ ͱͨ͘͞ΜͷϑΝΠϧΛฤू͢Δඞཁ͕͋Δɻ ➤ ඇಉظͷॲཧɺFormͷσʔλɺRoutingͷσʔλͳͲΛ্ख͘ ѻ͓͏ͱࢥ͏ͱ͍ΖΜͳϥΠϒϥϦΛೖΕΔ͜ͱʹͳͬͯͱ ʹ͔͘ർΕΔ
ྫ͑REDUX
·ͱΊɾݱঢ় ➤ ίϯϙʔωϯτԽ(WebComponentؔͳ͘)Λߟྀ͞Ε͍ͯ Δ ➤ VirtualDOMతͳDOMΛࠩͰඳըΛߦ͏ͷ͕ଟ͍ ➤ MV*తͳΞϓϩʔν͕ѱ͍Θ͚Ͱͳ͍ ➤ ݱঢ়Reduxʹ͕͋ΔͷͰɺ͍ΖΜͳσʔλϑϩʔͷ
StateཧϑϨʔϜϫʔΫ͕ཚཱ͍ͯ͠Δɻ ➤ ͱ͍͑࠷ۙReduxϥΠΫͳͷ͕ଟ͍ͷͰษڧ͍ͨ͠ਓ ਓ·ͣReduxΛͬͯΈΑ͏!!
༨ஊ(CACOOͷHTML5Խͷ) ➤ HTMLͷViewriotͬͯΔ ➤ riotcomponentࢦͷϑϨʔϜϫʔΫɻVirtualDOMͰͳ ͍͕DOMͷࠩߋ৽Λߦͬͯ͘ΕΔ ➤ StateཧࣗલͰͬͯΔɻComponent͝ͱͷStateͱΞϓϦ શମͷStateΛཧ ➤
ΞϓϦશମͷStateindexedDBʹ֨ೲ͍ͯ͠Δ