Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Hatena Engineer Seminar #14 Next.js 編 / hatena-...
Search
mfzy
July 15, 2020
Programming
1.8k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Hatena Engineer Seminar #14 Next.js 編 / hatena-engineer-seminar-14-nextjs
mfzy
July 15, 2020
More Decks by mfzy
See All by mfzy
Hatena Engineer Seminar #19 フロントエンド編
mfzy
0
2.2k
Other Decks in Programming
See All in Programming
Jetpack Compose Mechanisms
skydoves
3
820
Domain-Driven Transformation
hschwentner
2
2.3k
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
790
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
180
IBM Bob でAI駆動開発『QC-Playbook』
ichirokano2
0
110
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
290
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.1k
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
290
ChromeでローカルLLM
ryu1013
0
140
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
32k
Event is what happens
moro
2
770
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
140
Featured
See All Featured
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
530
How to build a perfect <img>
jonoalderson
1
6.1k
GraphQLとの向き合い方2022年版
quramy
50
15k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
The agentic SEO stack - context over prompts
schlessera
0
970
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
410
Large-scale JavaScript Application Architecture
addyosmani
516
110k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
The browser strikes back
jonoalderson
0
1.8k
For a Future-Friendly Web
brad_frost
184
10k
Transcript
id:mfzy 2020/7/15 Next.js ฤ ~ ϢʔβʔͱΫϩʔϥʔΛڞʹͯͳٕ͢ज़ ~ Hatena Engineer Seminar
#14
ൃදͷྲྀΕ ຐ๏ͷJΒΜͲ /FYUKT ϞόΠϧϑΝʔετ ίϯϙʔωϯτग़͚͠
·ͱΊ 2
ຐ๏ͷiΒΜͲ
ϑΟʔνϟʔϑΥϯ͔࣌Βͷ͍ྺ࢙ ϞόΠϧ͔ΒͷΞΫηεׂ͕ εϚʔτϑΥϯͷγϑτ͋ΓͭͭґવϞόΠϧ͕ࢧత ৢ͞ΕͨจԽ ࡞ͷϖʔδ͝ͱͷจྔগͳΊ͕ͩϖʔδ͕ଟ͍
ಛ 4
ϦχϡʔΞϧ ࣌ͷҠΓมΘΓͱڞʹϢʔβʔͷං͖͑ͯͨ چγεςϜͷϨΨγʔͳٕज़ελοΫ ϞμϯͳମݧΛ࣮ݱ͢Δʹແཧ͕͋Δ ٕज़ελοΫͷ৽
ϑϩϯτΤϯυΛࢧ͑Δٕज़ͱͯ͠αʔϏεͷಛʹ߹ͬͨ/FYUKTΛબఆ 5
Next.js
ٕज़ελοΫ Next.js Server (BFF) GraphQL API DB 7 Feather is
licensed under the MIT License. SPA
React 6*ߏஙϥΠϒϥϦ ίϯϙʔωϯτϕʔε ΧϓηϧԽ͞Εͨ෦ΛΈ߹Θͤͯ6*Λߏங 4JOHMF1BHF"QQMJDBUJPO 41"
ϖʔδભҠʹࡍͯ͠શମΛ࠶औಘͤͣඞཁͳใ͚ͩಡΈࠐΉ ϒϥβͰωΠςΟϒΞϓϦͷΑ͏ͳૢ࡞ײΛ 8
Next.js 3FBDUΞϓϦέʔγϣϯΛ࡞ΔͨΊͷPQJOJPOBUFEͳϑϨʔϜϫʔΫ ࣅͨͷʹDSFBUFSFBDUBQQ $3" ͕͋Δ ओͳڧΈ
`next`ίϚϯυҰͭͰϓϩδΣΫτͷجૅ͕ग़དྷ্͕Δ όϯυϥʔ 8FCQBDL ͷπʔϧ͕ॳΊ͔ΒΈࠐ·Ε͍ͯΔ ࡶͳઃఆΛඞཁͱ͠ͳ͍ڧྗͳ1SFSFOEFSJOHػߏ 9
Pre-rendering ͠ͳ͍߹ 10 Server Server Server API Λୟ͍ͨΓ͋Δ͍ ੩తͳϦιʔε (JSON
) Λཁٻ͢Δ ίϯςϯπΛ͍ܽͨ ϕʔεͷ HTML ͕ฦ٫͞ΕΔ ϨεϙϯεΛղऍͯ͠Α͏͘ ίϯςϯπ͕ར༻Մೳʹ
Pre-rendering ͢Δ߹ 11 Server (BFF) API / Storage ॳΊ͔Β HTML
ʹ ίϯςϯπ͕ຒΊࠐ·Ε͍ͯΔ
Pre-rendering ͷछྨ 4UBUJD(FOFSBUJPO Ϗϧυ `next build` ࣌ʹੜ͓͍ͯͨ͠)5.-Λฦ͢
6($ͷΑ͏ͳಈతίϯςϯπʹద͞ͳ͍ 4FSWFS4JEF3FOEFSJOH 443 ϦΫΤετ͝ͱʹ)5.-Λੜ ຐ๏ͷJΒΜͲͰ1SFSFOEFSJOHΛհ͢ΔՕॴશͯ443 12
ͳͥ Next.js ͳͷ͔ 6*69ͷ৽ ࡞ͷੑ্࣭ϖʔδભҠ͕ଟ͍ˠ41" %FWFMPQFS&YQFSJFODF %9
Ϟνϕʔγϣϯͱڞʹ্࣭ ࡞ͬͯऴΘΓͰͳ͍ɺӡ༻্ͷෛ୲ܰݮظ 4&0ཁ݅ˠ443 ී௨ͷ41"ͩͱΫϩʔϥʔଆ͕ղऍ͠ʹ͍͘ 13
Ϋϩʔϥʔͱ JavaScript ΫϩʔϥʔϖʔδͷίϯςϯπΛಡΈऔͬͯΠϯσοΫεΛ࡞͢Δ ૉͳ41"ͰϨεϙϯε )5.- ࣗମʹίϯςϯπؚ͕·Εͳ͍ +BWB4DSJQUΛղऍ͠ͳ͍ݶΓίϯςϯπ͕ར༻Ͱ͖ͳ͍
ϞμϯͳΫϩʔϥʔ+BWB4DSJQUΛղऍͰ͖Δ ҰےೄͰ͍͔ͳ͍Β͍͠ͷ͕ݱঢ় (PPHMFґવͱͯ͠ԿΒ͔ͷϨϯμϦϯάख๏Λ࠾ΔΑ͏קΊ͍ͯΔ IUUQTEFWFMPQFSTHPPHMFDPNTFBSDIEPDTHVJEFTEZOBNJDSFOEFSJOH 14
SEO ͱ SSR ΫϩʔϥʔଆͷਐาʹΑͬͯ443ෆཁʹͳͬͨͷͰ ͦ͏Ͱͳ͍ͷ͕ݱঢ় લड़
୯७ͳ41"ͰదʹεςʔλείʔυΛฦ٫Ͱ͖ͳ͍ͳͲͷΔ 443Λ࠾༻͢Δ্Ͱҙ͢Δ͜ͱ $MJFOU4JEF3FOEFSJOH $43 Ͱͷग़ྗͱҟͳΔͱϚζ͍ ޙड़ ϞόΠϧɾͦΕҎ֎Ͱͷ6*ग़͚͠ʹۤઓ͢Δ͜ͱʹʜ 15
ϞόΠϧϑΝʔετ
ϞόΠϧϑΝʔετ ࠶ܝϞόΠϧ͔ΒͷΞΫηε͕ࢧత ϞόΠϧͰͷϢʔβʔମݧ͕ॏཁʹ ຐ๏ͷJΒΜͲʹݶΒͣੈؒతʹϞόΠϧ͕େ ݕࡧΤϯδϯͰϞόΠϧϑϨϯυϦʔͳΣϒαΠτ͕༏۰͞ΕΔ 17
։ൃͷྲྀΕ ඞવతʹϞόΠϧ͔Β։ൃ͕ਐΉ ͱ͍͑વϞόΠϧҎ֎ͷ͚ͷରԠඞཁ ϞόΠϧϑΝʔετ͔ͩΒͱ͍ͬͯ㚽Ζʹ͠ͳ͍ Ͳ͏ͬͯ1$ରԠΛਐΊ͍͔ͯ͘ 18
RWD 3FTQPOTJWF8FC%FTJHO 38% ओʹελΠϧγʔτΛۦͯ͠͏·͘ݟͨΛௐ͢Δ͜ͱʹͳΔ &UIBO.BSDPUUFࢯͷهࣄ͕ॳग़ͱ͞ΕΔ
ίϯϙʔωϯτϕʔεͷࢥ͕·Δલͷ࣌ͷߟ͑ํ ίϯϙʔωϯτϕʔε͕ओྲྀͷ41"ͰͲ͏͔ʁ 38%Λ࣠ʹͯ͠͠·͏ͷྑ͘ͳͦ͞͏ 19
SPA ͱ RWD IUUQTTDSBQCPYJPTIPLBJ$44ϨεϙϯγϒσβΠϯΛ41"Ͱ͏ͱഁ໓͢Δ ελΠϧγʔτ͚ͩͷௐͰࡁ·ͤΔʹແཧΛ͏έʔεଟ͍ දݱྗ͕๛͔ʹͳͬͨঢ়ଶɾΠϯλϥΫγϣϯෳࡶʹ
͝ͱͷࠩݟͨʹݶΒͳ͍ ͱ͍͑ܰඍͳݟͨͷௐʹґવͱͯ͠༗༻ 38%ิॿతʹ͏ͱͯ͠ΘΓʹ࣠ͱͳΔΈ͕ඞཁ 20
ίϯϙʔωϯτग़͚͠
جຊతͳΞΠσΞ ελΠϧγʔτͰͷௐͰͲ͏ʹͳΒͳ͍ݟͨҎ֎ͷࠩΛѻ͍͍ͨ ελΠϧγʔτͰͳ͘ϓϩάϥϜ +BWB4DSJQU ͷੈքʹ࣠ΛҠ͢ ҰͭͷίϯϙʔωϯτͰແཧʹࠩΛѻ͓͏ͱ͢ΔͱόάΛຒΊࠐΈ͔Ͷͳ͍
͝ͱʹผͷίϯϙʔωϯτΛ༻ҙ͢Δ ͦΕͧΕʹඞཁͳϩδοΫͷΈʹूதͰ͖ਖ਼ؾ͕อͯΔ Ͳ͏࣮ݱ͢Δʁ 22
੍ ͜͜Ͱ4&0ཁ͕݅ἝΛṞ͘ ૉʹ$44ͷ.FEJB2VFSZΛ฿ͬͯϏϡʔϙʔτΛཔΓʹͨ͘͠ͳΔ ࠶ܝ443ͱ$43ͷ݁ՌҰக͠ͳͯ͘ͳΒͳ͍ ϓϩάϥϜʹ࣠ΛҠ͢ͱ͍͏͜ͱ%0.ʹ࡞༻Ͱ͖Δͱ͍͏͜ͱ
ΫϥΠΞϯτଆͰ͔͠ར༻Ͱ͖ͳ͍ใΛ͋ͯʹͰ͖ͳ͍ʂ 23
SSR ͱ CSR ݁Ռʹ૬ҧ͕͋Δ߹ 24 Server PC ͔ΒͷϦΫΤετʹରͯ͠ ϞόΠϧ͚ͷ༰Λ SSR
ͯ͠ฦͯ͠͠·͏ CSR Ͱ PC ͚ͷ༰ʹ ࠶ߏங͞ΕΔ͜ͱʹ SEO తʹϖφϧςΟΛ৯Β͏͜ͱ͕͋Δ (Cloaking ͱݟ၏͞ΕΔڪΕ͕͋Δ) &ɹ ը໘͕νϥ͍ͭͯମݧ͕ѱ͍
Ұ؏ੑ αʔόʔଆͰΫϥΠΞϯτଆͰҰ؏ɾ҆ఆͯ͠ར༻Ͱ͖Δใͱ͍͑ 6TFS"HFOU͘Β͍͔͠ͳ͍ 6"จࣈྻݻఆԽ͞ΕΔͱ͍͏ $MJFOU)JOUT͕࣮༻Խ͞ΕΕͦͪΒΛ͏͜ͱʹͳΔͩΖ͏
ͦΕ·Ͱ6"จࣈྻΛݟΔ͔͠ͳ͍ 25
UA จࣈྻ͔Βͷผ Ͳ͏ͬͯΛผ͢Δ͔ 6"จࣈྻʹ`Mobile`ͱ͍͏จࣈྻ͕ଘࡏ͢Δ͔֬ೝ େࡶʹϞόΠϧ͔ͦΕҎ֎͔ʹ͚Δ͜ͱ͕Ͱ͖Δ ͦΜͳ୯७ͳϩδοΫͰ͏·͍͘͘ͷ͔
ϝδϟʔͳϒϥβͷຆͲ͕͜ͷ҉తͳϧʔϧʹै͍ͬͯΔ༷ ͪΖΜ(PPHMFCPU ϚΠφʔͳͷͦͦαϙʔτ֎ͱ͍͏͜ͱ͋Δ 26
Tier `Mobile`͕ଘࡏ͢Ε`compact`ɺͦ͏Ͱͳ͚Ε`regular` ͜ΕΛ5JFSͱݺͿ͜ͱʹ͢Δ ϫʔυνϣΠε#PPUTUSBQͷ(SJE5JFSJ04ͷ4J[F$MBTTFTΛࢀߟʹ ϢϏΩλεݴޠͱͷ݉Ͷ߹͍ߟྀͭͭ͠୯७Ͱ໌ྎͳ໋໊Λ৺͕͚ͨ 27
ྫ: iPad (Split View) 28 `compact` `regular`
࣮ ΞϓϦέʔγϣϯϫΠυͳঢ়ଶͱͯ͠5JFS͕ࢀরͰ͖ΔΑ͏ʹ 4JOHMF4PVSDFPG5SVUI 4405 ͱͳΔΑ͏ߏ ࣮ࡍʹ3FEVYͷঢ়ଶͱͯ͠ཧ 3FBDUͷ$POUFYUͰͳ͍
5JFSͷࢉग़ج४؆୯ʹࠩ͠ସ͑ΒΕΔΑ͏ʹ 6"จࣈྻ͕ݻఆԽ͞ΕͨΒସͷใ͔Β5JFSΛಋग़͢ΕΑ͍͚ͩ ग़͚͠Λखܰʹ࣮ݱ͢ΔͨΊͷϔϧύʔίϯϙʔωϯτΛ༻ҙ 29
ίϯϙʔωϯτग़͚࣮͠ྫʢ1ʣ // ڞ௨Ͱར༻͢Δ props ͷܕΛఆ͓ٛͯ͘͠ interface CommonFooProps { bar: string;
} const CompactFoo: React.FC<CommonFooProps> = () => {/* ... */}; const RegularFoo: React.FC<CommonFooProps> = () => {/* ... */}; export const Foo = switched({ compact: CompactFoo, regular: RegularFoo, }); export const Page: NextPage = () => ( <SomeContainer> <Foo bar="baz" /> {/* ΤʔδΣϯτʹԠͯ͡উखʹΓସΘΔ */} </SomeContainer> ); Tier ͝ͱͷίϯϙʔωϯτΛ·ͱΊͯ ୯७ͳίϯϙʔωϯτͱͯ͠ѻ͑ΔΑ͏ʹ
ίϯϙʔωϯτग़͚࣮͠ྫʢ2ʣ export const Foo: React.FC<{}> = () => { const
{ isCompact } = useTier(); return ( <> <RegularOnly> {/* regular ͷ߹ͷΈݱΕΔ */} </RegularOnly> <div className="bar"></div> <style jsx>{` .bar { width: ${isCompact ? '100px' : '300px'}; } `}</style> </> ); }; એݴతΞϓϩʔνΛ׆͔͢ ίϯϙʔωϯτΛग़͚͠Δ·Ͱͳ͍ ܰඍͳௐ݅ذͰ
·ͱΊ
·ͱΊ ͳͥ/FYUKTͳͷ͔ 6*69ͱ4&0ཁ݅Λຬ্ͨͨ͠Ͱ%9ͷ্·Ͱ͕ݟࠐΊ͔ͨΒ 5JFSʹΑΔίϯϙʔωϯτग़͚͠Ͱ͓ͯͳ͠ ϢʔβʔʹσόΠεʹదͨ͠ϞμϯͰϦονͳମݧΛ
Ϋϩʔϥʔʹ6"ʹదͨ͠Ұ؏ੑͷ͋Δग़ྗΛ 33