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
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
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
170
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
130
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.5k
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
110
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.8k
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
関数型プログラミングのメリットって何だろう?
wanko_it
0
180
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
140
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
860
えっ!!コードを読まずに開発を!?
hananouchi
0
220
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.7k
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
34
9.5k
Ruling the World: When Life Gets Gamed
codingconduct
0
280
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
530
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Making Projects Easy
brettharned
120
6.7k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
590
It's Worth the Effort
3n
188
29k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
How GitHub (no longer) Works
holman
316
150k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
190
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