Share
Embed
Webパフォーマンス高速化とこれからのアーキテクチャ
CoreWebVitalsにINP(Interaction to Next Paint)が追加され、Webパフォーマンスに関するする技術は年々進化を遂げています。
このセッションでは、INPへの対策の他、BFCache、Private Prefetch Proxy、Priority Hintsなど、現在WebAPIとしてで検討されているパフォーマンスに関する内容をご紹介します。
また、これらを活かすことができるFEアーキテクチャとはどのような設計になるでしょうか?現在ヤフーで取り組んでいる内容も含め、今後のWebパフォーマンス改善の展望をお話できればと思います。
narirou
December 02, 2022
Transcript
57 slides
-
Agenda 1. Core Web Vitals ͷਐԽ 2. ߟྀ͓͖ͯ͘͠WebύϑΥʔϚϯεٕज़ 3. Yahoo!
JAPANͰ࣮ફ͍ͯ͠ΔऔΓΈ -
CoreWebVitals ͷ͓͞Β͍ $PSF8FC7JUBMTɺ8FCύϑΥʔϚϯεΛܭଌ͢ΔͨΊͷϝτϦΫεɻύϑΥʔϚ ϯεͷෳࡶͳΛɺ୭Ͱ؆ܿʹཧղ͠ɺࢦඪʹͰ͖ΔΑ͏ʹࡦఆ͞Ε·ͨ͠ɻ ॳظը໘ͷ͏ͪɺ࠷େͷྖҬΛ ΊΔίϯςϯπ͕දࣔ͞ΕΔ·Ͱ ͷ࣌ؒ LCP 2.5ඵ 4ඵ
ॳճͷϢʔβʔૢ࡞/ೖྗ͕Մೳ ʹͳΔ·Ͱͷ࣌ؒ FID 100ϛϦඵ 300ϛϦඵ ࢹ֮తͳ҆ఆੑΛܭଌ͢ΔͨΊͷ ϨΠΞτγϑτ (͍ΘΏΔΨλπΩ) CLS 0.1 0.25 -
Chrome 60 FCPՃ ࣮ࡍϢʔβʔͷχʔζٕज़ਐԽʹ߹ΘͤͯɺԿΛ$PSFϝτϦΫεͱ͢Δ͔ ɺৄࡉͳऔಘํ๏͕มԽௐ͞Ε·͢ɻ 77 CLSՃ 75 FIDՃ ??
CoreWebVitals ɺมԽΛલఏͱͨ͠Ͱ͋Δ -
Smoothness Β͔͞ ը໘ͷϑϨʔϜϨʔτʹ߹Θͤͯɺ ΞϓϦέʔγϣϯ͕εϜʔζʹԠ ͍ͯ͠Δ͔Ͳ͏͔Λܭଌɻ ͷ$ISPNF%FW4VNNJUͰʮΒ͔͞ʯͱʮԠੑʯͷ̎ͭΛ࣍ͷϝτϦΫεʹө͢ Δ༧ఆͰ͋Δͱͷ͜ͱ͕ޠΒΕ·ͨ͠ɻ Ϣʔβʔͷೖྗʹରͯ͠ɺΞϓϦ έʔγϣϯ͕Ԇͳ͘Ԡ͢Δ͔Λ ܭଌɻ
Responsiveness Ԡੑ Β͔͞ͱԠੑ ग़య: https://web.dev/better-responsiveness-metric/ -
Interaction to Next Paint (INP) ͷՃ ͦͷʮԠੑʯͷ͑ͱͯ͠ɺʹ$PSF8FC7JUBMTʹ৽ͨͳϝτϦΫεͰ͋ ΔINP(Interaction to Next
Paint) ͕Ճ͞Εͨ͜ͱʹͳΓ·͢ɻ Chrome 60 FCPՃ 77 CLSՃ 75 FIDՃ INPՃ! -
*/1 *OUFSBDUJPOUP/FYU1BJOU ɺϢʔβʔͷೖྗʹ ରͯ͠ΞϓϦ͕దʹԠΛฦ͢·Ͱͷ࣌ؒΛද͢ࢦ ඪͰ͢ɻ Interaction to Next Paint (INP)
ͱ ͨͱ͑ • Ωʔೖྗͯ͠จࣈ͕ө͞ΕΔ·Ͱͷ࣌ؒ • ϘλϯΛλοϓͯ͠Ϟʔμϧ͕։͘·Ͱͷ࣌ؒ -
ग़య: https://web.dev/inp/ Interaction to Next Paint (INP) ͱ දࣔ ೖྗ
ponterup mouseup click Ϩεϙϯε࣌ؒ ϨϯμϦϯά render paint composit input delay Ϣʔβʔͷೖྗ͔Βɺ࠷ऴग़ྗ·Ͱ༷ʑͳॲཧ͕ೖΔɻ͜ͷॲཧΛ્͢ΔΑ͏ͳ Πϕϯτϋϯυϥ͕͋ͬͨ߹ɺ࠷ऴදࣔ·Ͱͷ͕࣌ؒԆ͢Δ͜ͱʹͳΓ·͢ɻ -
ೖྗԆΛՄࢹԽ͢ΔྫΛݟͯΈΔͱ Θ͔Γ͍͢Ͱ͢ɻΫϦοΫॲཧΛҙ ਤతʹॏͨ͘͠߹ɺ࿈ଓ͢Δͱಈ࡞ ͕ॏ͘ͳ͍ͬͯදࣔʹͳΔͷ͕Θ͔ Γ·͢ɻ ݱࡏͷ*/1ͷج४Ͱɺܭଌ ͞ΕͨλΠϧͷείΞͰɺNT ҎԼͷΛྑͱ͞Ε͍ͯ·͢ɻ Interaction to
Next Paint (INP) ͱ https://inp-demo.glitch.me/ -
0ʙ16ms ΞχϝʔγϣϯΛεϜʔζʹಈ࡞͍ͯ͠Δͱײ͡Δɻ 0ʙ100ms ૉૣ͘Ԡͨ͠ͱײ͡Δɻ͜ΕҎ্ͷ͕͔͔࣌ؒΔͱɺԠʹ͕͔͔࣌ؒͬͨͱೝࣝ͢Δɻ 100ʙ1000ms ͕͔͔࣌ؒͬͨ͜ͱ͕ೝࣝͰ͖ΔͷͷɺܧଓతͳॲཧͷҰ෦ͱͯ͠ײ͡Δɻ 1000msҎ্ 1ඵΛ͑ΔͱɺఀΛײ͡ɺܧଓͨ͠ॲཧͱͯ͠ײ͡ΒΕͳ͘ͳΔɻ 10000msҎ্ 10ඵΛ͑ΔͱɺϢʔβʔෆຬΛײͯ͢͡ΔՄೳੑ͕ߴ͘ͳΔɻ
INPFIDΑΓϢʔβʔͷײ֮ʹ͍ۙ */1ɺ'*%ΑΓϢʔβʔ͕͍ͱײ͡ΔϙΠϯτ͕ࢦඪͱͳ͍ͬͯ·͢ɻ·ͨɺॳظදࣔ ͚ͩΛܭଌ͢ΔͷͰͳ͘ɺΞϓϦέʔγϣϯ͕ଘࡏ͢Δؒͣͬͱܭଌ͞Εଓ͚Δ͜ͱʹͳΓ· ͢ɻ ࢀߟ: RAILϞσϧ -
Ϣʔβʔʹ͍ۙҐஔͰͷΩϟογϡ CDN App service worker storage local cache ϒϥβ CDNΤοδ
ΞϓϦέʔγϣϯ cache db memory DB -
Ϣʔβʔʹ͍ۙҐஔͰͷΩϟογϡ CDN App service worker storage local cache ϒϥβ CDNΤοδ
ΞϓϦέʔγϣϯ cache db memory DB -
Ϣʔβʔʹ͍ۙҐஔͰͷΩϟογϡ CDN App service worker storage local cache cache db
memory DB ͳΔ͘Ϣʔβʔʹ͍ۙҐஔͰΩϟογϡͯ͠ߴʹฦ٫͢Δ͜ͱͰɺύϑΥʔϚϯεΛ্ɻ -
Edge Workers cacheͷॊೈੑ্ ཧతʹϢʔβʔʹ͍ۙɺ$%/&EHFͰ σʔλΛฦ͢͜ͱ͕Ͱ͖ΕɺΞϓϦέʔ γϣϯʹ౸ୡ͢ΔલʹϨεϙϯεͰ͖ߴ Խ͕ظͰ͖Δɻ CDN &EHF8PSLFSTͷొʹΑͬͯɺ)551ϔο μͷηϚϯςΟΫεͷಈ࡞͚ͩͰͳ͘ɺ
&EHFͰؔΛ࣮ߦͯ͠ɺॊೈͳಈ࡞Λఆٛ ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳͬͨɻ Cloud fl are Workers AWS Cloudfront Function Fastly Compute@Edge -
BFCache cacheͷॊೈੑ্ ϒϥβͰΔਐΉΛߦͬͨͱ͖ʹɺಛఆ ͷ݅ԼͰΩϟογϡ͔ΒಡΈࠐΉ͜ͱ ͰɺΦϦδϯʹ௨৴͢Δ͜ͱͳ͘ॲཧΛܧ ଓͰ͖Δɻ service worker storage local
cache ࣾͰௐࠪͨ͠ͱ͜Ζɺ͕ϒϥβ ͷΔਐΉͷϦΫΤετɻ αʔϏεಛੑʹΑΓ·͢ 4BGBSJͱ'JSFGPY͕ઌߦ͍ͯ͠Δ͕ɺࠓޙ$ISPNJVNͰ$BDIF$POUSPMOPTUPSFͷ߹ ͰΩϟογϡͰ͖ΔͳͲɺൣғΛ͛ΔରԠ͕ਐΜͰ͍Δɻ ϠϑʔͰରԠΛਐΊ͍ͯΔͷͰɺޙड़ɻ -
Private Prefetch Proxy cacheͷॊೈੑ্ ࣍ʹൃల͕ظͰ͖ΔͷɺػతͳઌಡΈͷٕज़ɻϖʔδͷભҠઌΛಡΈࠐΜͰ͓͚ɺ࣍ ʹભҠ͢Δͱ͖ʹߴͳද͕ࣔظͰ͖·͢ɻ(VFTTKTͳͲɺಉҰΦϦδϯؒͷٕज़ൃల͠ ·͕ͨ͠ɺΫϩεΦϦδϯͷ߹ηΩϡϦςΟ͕՝Ͱͨ͠ɻ ΞΫηεઌϖʔδ html, CSS,
JavaScript ୯७ʹΫϩεΦϦδϯͰઌಡΈ͢Δͱ IPͳͲݸਓใ͕Θͬͯ͠·͏ -
Private Prefetch Proxy cacheͷॊೈੑ্ 1SJWBUF1SFGFUDI1SPYZɺ$ISPNF͕ಠࣗʹߦͳ͍ͬͯΔઌಡΈͷΈͰɺ*1ͳͲΛӅṭ ͨ͠ঢ়ଶͰભҠલͷσʔλΛઌʹಡΈࠐΜͰ͓͖ɺΫϩεΦϦδϯؒͷϖʔδͷભҠΛߴԽ ͠·͢ɻ CONNECT Proxy ΞΫηεઌϖʔδ
html, CSS, JavaScript ֤ࠃͷαʔόʔ͔Βಗ໊Խͯ͠औಘ Ωϟογϡ͓ͯ͘͠ -
Private Prefetch Proxy cacheͷॊೈੑ্ ηΩϡϦςΟͷ͕͋ΔͨΊɺ$PPLJF 6TFS"HFOUͳͲͷϢʔβʔใΛ΄ͱΜͲ࣋ͨͳ͍ ܗͰΞΫηε͞ΕΔɻޮతͳΩϟογϡΛ͢Δʹ ɺͦΕΛલఏͱͨ͠Έ͕ඞཁʹͳΓ·͢ɻ purpose: prefetc
h sec-purpose: prefetch; anonymous-client-i p user-agent: <reduced > accept: <default value > accept-encoding: gzip, deflate, b r accept-language: <user's languages > sec-ch-ua: <latest stable release > sec-ch-ua-mobile: ?<0 or 1 > https://github.com/buettner/private-prefetch-proxy Ωϟογϡ࣌ʹૹ৴͞ΕΔϔομ -
Priority Hints Ϧιʔεऔಘ༏ઌͷ࠷దԽ ཁૉͷGFUDIQSJPSJUZଐੑɺ+4ͷGFUDIͷ PQUJPOΛ༻ͯ͠ɺϦιʔεͷऔಘ༏ઌΛࣔ͢ ͜ͱͰɺϒϥβʹਖ਼֬ʹϦιʔεͷऔಘॱংΛ ͑ɺಡΈࠐΈॱΛ࠷దԽ͢Δ͜ͱ͕Ͱ͖Δɻ 3FTPVDF)JOUT MJOLSFMlQSFMPBEz ͱ૬ҧ
- HTMLଐੑfetchʹΦϓγϣϯΛઃఆͰ͖ɺσʔλऔಘʹ ରͯ͠ར༻Ͱ͖Δɻ - ϒϥβͷࣗಈ࠷దԽΛͭલʹɺΑΓ࠷దͳ༏ઌΛ͑ Δ͜ͱ͕Ͱ͖Δɻ Χϧʔηϧͷը૾ʹࢦఆ͢Δྫ -
103 Early Hints Ϧιʔεऔಘ༏ઌͷ࠷దԽ &BSMZ)JOUTɺαʔόʔ͕࣮ࡍͷϨεϙϯεΛฦ͢લʹɺͦͷதͰ༻͞ΕΔϦιʔεͷઌಡ ΈใΛฦ٫͢ΔͨΊͷϦΫΤετΛฦ͢8FCඪ४༷Ͱ͢ɻଟ͘ͷ$%/͕αϙʔτΛ։࢝ɺ 8$Ͱ4VQFS&BSMZ)JOUTͷ͕ٞ͞Ε͍ͯΔɻ Server GET /
index.html 103 Early Hints 200 OK MJOLNBJODTTSFMQSFMPBEBTTUZMF https://w3c.github.io/web-performance/meetings/2022/2022-09-TPAC/#h.8u6iseul8x8x -
React18: ετϦʔϛϯάαʔόʔϨϯμϦϯά ϝΠϯεϨου͔Βͷ 3FBDU͔Βɺ4VTQFOTFͱ3FBDU4FSWFS $PNQPOFOUTΛͬͯɺΞϓϦέʔγϣϯΛ෦ తʹϨϯμϦϯάͯ͠දࣔ͢Δख๏͕औΓೖΕΒΕ ͍ͯ·͢ɻ 3FBDU4FSWFS$PNQPOFOUTɺ3FBDUίϯϙʔω ϯτΛ෦తʹ443 αʔόʔαΠυͰग़ྗ
ͯ͠Ξ ϓϦέʔγϣϯʹө͠·͢ɻΫϥΠΞϯτͰඞཁ ͩͬͨ+4ॲཧɺαʔόʔαΠυʹӅṭ͢Δ͜ͱ ͕Ͱ͖·͢ɻ -
1. Priority Hints ͷಋೖ ॳظϖʔδʹδϟϯϘτϩϯ ϝΠϯը૾ Λ༗͍ͯ͠Δ͍͘ ͔ͭͷαʔϏεͰɺ1SJPSJUZ)JOUTΛಋೖ͠ɺ"#ςετͰͦ ͷαʔϏεͷ-$1͕վળ͢Δ͔Λूܭ͠·ͨ͠ɻ "ύλʔϯ
-$1ରը૾ʹJNQPSUBODFIJHIΛ༩ $5ύλʔϯ -$1ରը૾ΛMJOLSFMlQSFMPBEzͰઌಡΈ -
ಋೖޙͷ݁Ռ 1. Priority Hints ͷಋೖ λΠϧͰ-$1ͷൺֱΛͨ͠ͱ ͜Ζɺ༗ҙࠩͳ͠ͱͷ݁Ռʹɻ ΑΓߴ͍ޮՌ͕Ͱ͖Δ͜ͱΛظͯ͠ ͍ͨҰํͰɺ݁Ռ͔ΒΑΓ࠷దԽԼ ॲཧͰ3FTPVSDF)JOUTͱ΄΅ಉͷޮ
Ռ͕ಘΒΕΔ͜ͱ͕Θ͔Γ·͢ɻ ϒϥβͷ࣮͕ਐΈ࣍ୈɺશࣾͰ औΓೖΕͯ࠷దԽΛਐΊ͍ͯ͘༧ఆɻ -
ࠓޙͷํੑʹ͚ͨΞʔΩςΫνϟΛߟ͑Δ Ϣʔβʔʹ͍ۙ Ωϟογϡઓུ ΩϟογϡϑΝʔετͳσʔλઃܭ ϢʔβʔσʔλΛԆಡΈࠐΈ͢Δ͜ͱͰ੩తͳߏΛͱΔͳͲ ભҠઌͷઌಡΈ QSJWBUFQSFGFUDIQSPYZ HVFTTKTʜͳͲ
ϒϥβͷϥΠϑαΠΫϧ ΔਐΉ Λҙࣝ͠ ͨઃܭ $%/Τοδͷ4FSWJDF8PSLFSΛલఏͱͨ͠Ξϓ Ϧέʔγϣϯઃܭ -
ϝΠϯεϨου ͔Βͷ ࠓޙͷํੑʹ͚ͨΞʔΩςΫνϟΛߟ͑Δ ϝΠϯཁૉͰͳ͍ॲཧɺαʔυύʔςΟεΫϦ ϓτͷ࣮ߦεϨουλΠϛϯάͷ࠶ߟ ෦తʹαʔόʔαΠυͰܭࢉ͢Δઃܭ 3FBDU4VTQFOTF
4FSWFS$PNQPOFOUTͳͲ ཁૉ͝ͱʹಡΈࠐΉઃܭ 3FMBZ(SBQI2-ʹΑΔΫΤϦίϩέʔγϣϯͳͲ