2015-05-27にLINE社で行われた、Data Binding JS Nightでの発表内容です。
ίϯϙʔωϯτࢦʹΑΔɺReactͷϕετϓϥΫςΟεͱόουϓϥΫςΟε@axrossData Binding JS Night
View Slide
Hi :)• Kohei Asai• @axross• Software Engineer• React.js, express.js
ίϯϙʔωϯτࢦ
ίϯϙʔωϯτࢦΛਪ
Reactͷʹ͓͚ΔComponentconst SomeComponent = React.createClass({render() {return ({this.state.valueA}{this.props.valueB});},});෦ঢ়ଶ֎͔ΒͷComponent = DOMͱJSͷηοτɺUI෦
-> DOM มث• stateΛΘͣɺpropsΛ͏Α͏ʹ͢ΕɺComponentʮ -> DOM มثʯʹͳΔComponentprops DOM( or Virtual DOM)
JS͕DOMΛࢧ͢Δੈք• XHRͱHistory APIͰSPA͕Մೳʹͳͬͨ• ͯ͢ͷঢ়ଶΛJavaScript͕ཧͰ͖Δ• JavaScript͕DOMΛࢧ͢Δੈք
Data-bindedͳʮDOMʯͱ• σʔλόΠϯυ͞Εͨͯ͢ͷDOMɺJavaScriptͷʹΑͬͯు͖ग़͞ΕΔ• ͳΒɺDOMίϯύΠϧ݁Ռ• σʔλόΠϯσΟϯάͷخ͜͜͠͞ʹ͋Δ
Reactͷࢥ͔Βٯࢉ͢ΔϕετϓϥΫςΟεͱόουϓϥΫςΟε
ίϯϙʔωϯτࢦ 3ͭͷ๏ଇ• ΛDOMʹม͢ΔஔͰ͋Δ͜ͱΛప͢Δ• ࠶ར༻͞ΕΔ͜ͱΛલఏʹ͢Δ• ίϯϙʔωϯτͱͦ͏Ͱͳ͍ͷΛ໌֬ʹ͚Δ
ΛDOMʹม͢ΔஔͰ͋Δ͜ͱΛప͢Δ
ႈੑΛकΔ• ௨ৗʮ -> DOM มثʯͰ͋Δͣ• ड͚ೖΕ͕ͨಉ͡Ͱ͋Εɺు͖ग़͞ΕΔDOMৗʹಉͣ͡• ͭ·Γɺႈੑ͕͋Δͣ
༨ܭͳࣄͤ͞ͳ͍• ͦΕҎ্ͷࣄΛͤ͞Δͱɺ٘ਜ਼ΛੜΉ• ඞཁҎ্ͳstateͷอ࣋ɾར༻• ίϯϙʔωϯτͷதͰXHR• = ႈੑΛࣦ͏• = ૄ݁߹Ͱͳ͘ͳΔ
ඞཁҎ্ʹঢ়ଶΛ࣋ͨͤͳ͍• ඞཁҎ্ʹঢ়ଶΛ࣋ͨͤΔͱ• ಉ͡Λ֎͔Β༩͑ͨͱͯ͠ɺు͖ग़͞ΕΔDOM͕ҧ͏ͷʹͳΔՄೳੑ͕͋Δ• = ςετ͕ࠔʹͳΔ
෭࡞༻ͷ͋ΔߦҝΛؚΊͳ͍• ෭࡞༻ͷ͋Δߦҝίϯϙʔωϯτͷ֎Ͱ͖͢• XHRɺWeb StorageͷΞΫηεͳͲ• FluxͷStoreΛsubscribe͢ΔͳͲ• = ݁Ռతʹঢ়ଶΛ࣋ͬͯ͠·͏• = ґଘ͕૿͑ɺςετ͕ࠔʹͳΔ
ίϯϙʔωϯτ͕࠶ར༻͞ΕΔ͜ͱΛલఏʹ͢Δ
componentDidMountʹҙ• componentDidMountͰɺwriteͳ࡞༻ͷ͋ΔFlux ActionΛݺΜͰ͍Δ• ίϯϙʔωϯτΛmount͚ͨͩ͠Ͱɺଞͷίϯϙʔωϯτʹ࡞༻ͯ͠͠·͏• = ίϯϙʔωϯτͷ෭࡞༻
ʮͲ͏͏͔ʯʮ͏࣌ʯʹ• ίϯϙʔωϯτࣗମͷҐஔαΠζΛࢦఆ͢ΔCSSΑΖ͘͠ͳ͍• ͦΕʮίϯϙʔωϯτΛͲ͏͏͔ʯͱ͍͏Ͱ͋ͬͯɺʮίϯϙʔωϯτͷఆٛʯͱίϯςΩετ͕ҟͳͬͯ͠·͏• = ผͷॴʹͦͷ··ஔ͚ͳ͍
ίϯϙʔωϯτͱͦ͏Ͱͳ͍ͷΛ໌֬ʹ͚Δ
ʮͦ͏Ͱͳ͍ͷʯඞཁ• ႈੑͷ͋ΔίϯϙʔωϯτͷΈͰΫϥΠΞϯταΠυͷΞϓϦέʔγϣϯ࡞Εͳ͍• ୭͔͕ঢ়ଶΛ࣋ͬͨΓɺXHR͢Δඞཁ͕͋Δ• ແཧͷͳ͍Α͏ʹઃܭ͢Δʹɺʮͦ͏Ͱͳ͍ͷʯඞཁ
ςετՄೳൣғΛ͛ΔͨΊʹ• ComponentͷͱͳΔఘΊΔ• ঢ়ଶΛ࣋ͪɺFlux StoreΛsubscribe͢Δ• ίϯϙʔωϯτʹpropsΛ͢• Ϣχοτςετ͕ෆՄೳͳ།Ұͷଘࡏ• = ΘΓʹଞͷͯ͢ͷςετ͕༰қʹͳΔ
CSSઃܭͷΞϯαʔ
୯ҐΛ߹ΘͤΔ• 1 ίϯϙʔωϯτ = 1 BEM Blockͱ͔ʹ͢Δ• ϑΝΠϧ໊ɺηϨΫλ໊߹ΘͤΔ• ໊લͷڝ߹͕͕ΕΔ• ଞͷηϨΫλͷґଘӨڹ͕ͳ͘ͳΔ• = ΧδϡΞϧʹআͰ͖Δɾ࠶ར༻Ͱ͖Δ
·ͱΊ
Reactͱίϯϙʔωϯτ• Reactίϯϙʔωϯτࢦ• ίϯϙʔωϯτɺ -> DOM มث ͱͯ͠ػೳ͢Δ
ίϯϙʔωϯτࢦ 3ͭͷ๏ଇ• -> DOM มث Ͱ͋Δ͜ͱΛప͢Δ• ࠶ར༻͞ΕΔ͜ͱΛલఏʹ͢Δ• ίϯϙʔωϯτͱͦ͏Ͱͳ͍ͷΛ໌֬ʹ͚Δ
ϝϦοτ• ςελϒϧ• ႈੑͱૄ݁߹Ͱ͋Δ͜ͱ͕୲อ͞ΕΔ• ΧδϡΞϧͳมߋɾআͱ࠶ར༻͕Մೳ• ߴͳPDCAαΠΫϧʹऑ͘ͳ͍• CSSઃܭॿ͚Δ
ΈΜͳReact͓͏ʂ
Thank youfor listening :)