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
Hatena Engineer Seminar #14 Next.js 編 / hatena-...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
AIエージェント時代のコードレビューを設計する
nogu66
6
2.5k
Swift愛好会100回記念 第1回を振り返る
jollyjoester
0
120
「つくるAI」だけではバグは見つからない ~テストに必要な「見つけるAI」を分離させる戦略~
mfunaki
0
230
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
3
520
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
680
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
2
500
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
0
460
Press start. Python's next generation.
willingc
PRO
3
320
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
110
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
110
AI駆動開発にグラフDBを重ねてみた
satoshi256kbyte
2
760
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
110
Featured
See All Featured
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
320
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Prompt Engineering for Job Search
mfonobong
0
440
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
Crafting Experiences
bethany
1
300
Mobile First: as difficult as doing things right
swwweet
225
10k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
260
Testing 201, or: Great Expectations
jmmastey
46
8.3k
A Soul's Torment
seathinner
7
3.6k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
410
We Are The Robots
honzajavorek
0
350
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