HTML5 Conference 2017のLTで発表した資料です。オチがありますが、ご了承くださいm(_ _)m http://events.html5j.org/conference/2017/9/
SPAΛύϑΥʔϚϯενϡʔχϯάͨ͠HTML5 Conference (2017/09/24)ฏণ࢜ / @shisama
View Slide
{"about": {"name": "Masashi Hirano","works": "Weblio, Inc.","twitter": "@shisama_","github": "shisama"}}
εϥΠυެ։͠·͢
Agenda• ύϑΥʔϚϯεͷܭଌπʔϧ• ࣮ફͨ͠ύϑΥʔϚϯεɾνϡʔχϯάશ෦ReactͷͰ͢ʂʂ
ΦϯϥΠϯӳձϨοεϯը໘• ϏσΦɾԻ௨৴ → WebRTC(SkyWay)• νϟοτ → Firebase Realtime Database• UI → React, ReduxΛͬͨSPA
ʮಈ࡞͕ॏ͍ʯʮϑϦʔζ͢Δʯͱ͍͏͍߹Θ͕ͤʂʂ
ReactͷڍಈMFGU SJHIU5FYU 7JEFP $IBU 7JEFPSPPU͜͜Ͱঢ়ଶΛߋ৽͢ΔΠϕϯτ͕ൃੜɻίϯϙʔωϯτʹ௨
ReactͷڍಈMFGU SJHIU5FYU 7JEFP $IBU 7JEFPSPPUશମʹ௨ɻ௨Λड͚औͬͨࢠίϯϙʔωϯτͷ࠶ϨϯμϦϯά͕Δ
SFOEFS ࣮ߦ7JSUVBM%0.ࠩܭࢉࠩΛϨϯμϦϯάQSPQTTUBUFͷ͕มߋ
SFOEFS ࣮ߦ7JSUVBM%0.ࠩܭࢉࠩΛϨϯμϦϯάQSPQTTUBUFͷ͕มߋ͜ͷॲཧίετ͕όΧʹͳΒͳ͍
ReactͷύϑΥʔϚϯεܭଌπʔϧ• React DevTools• Chrome Extension• react_perf• ΫΤϦύϥϝʔλ• ԿΠϯετʔϧ͠ͳ͍͍ͯ͘• react-addons-perf• Πϕϯτ͝ͱͷܭଌ͕ߦ͑Δશ෦Facebookެࣜʂ
react-addons-perfΛ͏import Perf from 'react-addons-perf';window.Perf = Perf;XJOEPXʹೖ͢ΔͱϒϥβͷίϯιʔϧͰ͏͜ͱ͕Ͱ͖·͢ʂ
react-addons-perfΛ͏ແବʹSFOEFSؔΛݺͼग़͍ͯ͠ΔίϯϙʔωϯτΛදࣔ
ࢼ͠ʹ͜ͷԻΛϛϡʔτ͢ΔϘλϯΛΫϦοΫ
SFOEFSؔΛ࣮ߦͨ͠ίϯϙʔωϯτͷҰཡw ࣮ߦ࣌ؒw Πϯελϯεw SFOEFS࣮ߦճ
ը໘Ͱද͢ͱɾɾɾ
Πϕϯτʹؔͳ͍ίϯϙʔωϯτ·Ͱ࠶ϨϯμϦϯά͠Α͏ͱͯ͠Δʂʂ
ແବʹrender͕ؔݺΕͳ͍Α͏ʹ͠·ͨ͠ʂ
Component LifecycleMount Update UnmountDPOTUSVDUPSSFOEFSDPNQPOFOU8JMM.PVOUDPNQPOFOU%JE.PVOUDPNQPOFOU8JMM3FDFJWF1SPQTIPVME$PNQPOFOU6QEBUFDPNQPOFOU8JMM6QEBUFSFOEFSDPNQPOFOU%JE6QEBUFDPNQPOFOU8JMM6ONPVOUtrue false
shouldComponentUpdateclass Icon extends React.Component {shouldComponentUpdate(nextProps, nextState) {if (this.props.height !== nextProps.height) {return true;}if (this.state.width !== nextState.width) {return true;}return false;}}ߋ৽લޙͷQSPQTͱTUBUFͷΛൺֱʹมߋ͕͋ΕUSVFมߋ͕ແ͚ΕGBMTF
Λ̍ͭ̍ͭൺֱ͢ΔίʔυΛશίϯϙʔωϯτʹॻ͘ͷେมͳͷͰɾɾ
PureComponent͍·ͨ͠ʂ
ࡢͷHTML5 ConferenceͰkoba04͞Μ͕ൃදͯͨ͠ʂ
PureComponentshallowͳൺֱ͔͠͠·ͤΜʂʂ
DeepͳൺֱΛߦ͍·ͨ͠ʂ
DeepEqual• npmʹ͍͔ͭ͘ϥΠϒϥϦ͕͋ΔʢҎԼҰ෦ʣ• deep-equal• deep-eql• fast-deep-equal• ଞΑΓ࣮ߦ͕ૣ͍ʂ
deepEqualΛͬͨshouldComponentUpdateimport deepEqual from ‘fast-deep-equal’;class Icon extends React.Component {shouldComponentUpdate(nextProps, nextState) {return !deepEqual(this.props.obj, nextProps.obj) ||!deepEqual(this.state.obj, nextState.obj);}}QSPQTTUBUFͷ0CKFDUͷதൺֱ͠·͢
͏Ұ͜ΕΛΫϦοΫͯ͠Έͨ
݁Ռ
ରࡦલ
ରࡦޙ
ଞʹվળ͠·ͨ͠• ༻ස͕͍ػೳΛআ• stateʹ֨ೲ͢Δඞཁͷແ͍ΛΠϯελϯεม• ReduxཧͷൣғΛখ͘͢͞Δ
ͳͥ։ൃதʹؾ͔ͮͳ͔ͬͨʁ
ສ͑ͷ$50Ϟσϧ.BDCPPL1SPઈշదʂ$PSFJϝϞϦ(#
εϖοΫߴͯ͘ؾ͔ͮΜ͔ͬͨ
ϦϦʔεલʹεϖοΫϚγϯͰݕূ͢ΔΑ͏ʹ͠·ͨ͠
·ͱΊ• ύϑΥʔϚϯεͷܭଌΛଵΒͳ͍Α͏ʹ͠·͠ΐ͏• ແବͳॲཧ͕ͳ͍Α͏ʹ৺͕͚·͠ΐ͏• εϖοΫϚγϯ(·ͨthrottling)Ͱͷݕূ͠·͠ΐ͏ʂʂଞͷϑϨʔϜϫʔΫͰ্هΛߦ͍·͠ΐ͏ʂ
ࢀߟ• facebook.github.io/react• Reactͷ࠷৽ಈͱϕετϓϥΫςΟε bykoba04• React Performance Tune-Up · InVisionEngineering Blog
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ
ͱऴΘΔͣͰ͕ͨ͠ɾɾ
ຊհͨ͠react-addons-perfReact v16Ͱ͑ͳ͘ͳΔͬͯΑ
koba04͞Μʹ͍͖ͭͬ͞ڭ͑ͯΒͬͨɾɾ
react_perf͓͏