サーバーサイドの人にも知ってほしいJAM Stackと静的サイトのイマ APIやらMicroServiceが充実してきた現代における静的サイトのお話
https://mottox2.com/posts/150/
JAM Stackͱ੩తαΠτͷΠϚ2018.07.06 Webք۾LTձ - @mottox2αʔόʔαΠυͷਓʹ͍͑ͨ
View Slide
੩తαΠτͱಈతαΠτ• Ϩεϙϯε͕ૣ͍• མͪͳ͍͠εέʔϧ͢Δ• ηΩϡϦςΟOK• ࣗ༝ͦ͏• ࣮ʹΑͬͯ͘ͳΔ͜ͱ• େྔͷΞΫηεʹऑ͍• ηΩϡϦςΟతʹͭΒΈ• େମͳΜͰͰ͖Δ੩తαΠτ ಈతαΠτ
੩తαΠτδΣωϨʔλʔ• ੩తαΠτδΣωϨʔλʔΛͬͯੜ͢Δ͜ͱ͕ଟ͍• ಈతʹ੩తαΠτΛੜ͢ΔδΣωϨʔλ• جຊతʹGitHubͷpushͱ࿈ಈͯ͠Ϗϧυ͢ΔΑ͏ͳײ͡
Web։ൃΛऔΓר࣌͘ͷมԽ
࣌ͷมԽϞϊϦγοΫ͔ΒϚΠΫϩαʔϏεʹGitHubத৺ͷ։ൃڥʹPC͔ΒεϚϗத৺ͷWebʹ123
ϞϊϦγοΫ͔ΒϚΠΫϩαʔϏεʹ• Micro Service͕ҰൠతʹͳΓɺαʔόʔαΠυͷͱ͔͘ɺStipeʢ՝ۚʣContentfulʢHeadless CMSʣɺSentryʢΤϥʔऩूʣͳͲͷ֎෦αʔϏεͱAPIΛܦ༝ͯ͠ར༻͢Δํ๏͕ҰൠԽͨ͠ʢͣʣɻ• backendผαʔϏεͷAPIΛͬͨΓɺࣗલͰ࣮͢ΔͳΓͯ͠ɺϑϩϯτΤϯυ͚ͩผϓϩδΣΫτʹΓग़͢ͷࣗવɻ• WebHookʹΑΔαʔϏεؒ࿈ܞेʹීٴͨ͠ɻ
GitHubத৺ͷ։ൃڥʹ• ιʔείʔυཧ͕GitHub্ͰߦΘΕΔΑ͏ʹͳΓɺCIͱ࿈ܞ͢Δ͜ͱ͕Ұൠతʹɻ• GitHub PagesͰ؆୯ʹαΠτ͕ެ։Ͱ͖ͨΓɺGitHubͱ࿈ܞͯ͠੩తαΠτΛެ։Ͱ͖ΔNetlifyͷొ• ϏϧυίϚϯυͷࢦఆɺGlobal CDNɺPR PreviewͳͲ͕σϑΥϧτͰ͑ΔɻਆαʔϏεɻ▶ ੩తαΠτͷσϓϩΠ͕ͲΜͲΜָʹ
PC͔ΒεϚϗத৺ͷWebʹ• 3G͔Β4Gʹͳͬͨͱ͍͑ɺࢢ෦͔ΒΕΔͱ3Gྼѱͳ௨৴ڥ͕ଘࡏ͢Δɻ• GoogleͷΞϧΰϦζϜͰ͍αΠτϥϯΫ͕Լ͕Δɻ• ΑΓૣ͘ϨεϙϯεΛฦͯ͠ɺ௨৴ྔΛ͑Δඞཁੑ͕ߴ·͍ͬͯΔɻ• ಈతαΠταʔόʔαΠυͰͷॲཧͷతʹෆརɻ• ·ͨɺόζΓ͘͢ͳͬͯҰؾʹτϥϑΟοΫ͕૿͑Δ߹ɻ▶ εέʔϧ͘͢͠ɺTTFB͕ૣ͍੩తαΠτʹΞυ͕
੩తαΠτδΣωϨʔλʔมԽ• Ҏલͷ੩తαΠτδΣωϨʔλ• جຊతʹϦϙδτϦ্ʹ͋ΔMarkdownΛݩʹ੩తϖʔδΛੜ• ࠷ۙͷ੩తαΠτδΣωϨʔλ• APIΛୟ͍ͯͦͷσʔλΛݩʹ੩తϖʔδΛੜ• APIΛୟ͘͜ͱΛલఏͱ͍ͯ͠ΔͷɻMarkdownΦϓγϣϯͷҰͭ▶ ࢥͬͨΑΓࣗ༝͕ߴ͍ͱࢥ͍·ͤΜ͔ʁ
ओཁͳ੩తαΠτδΣωϨʔλʔ▶ ελʔͰෛ͚͍ͯΔ͕ɺJavaScriptͷͷΛ࠾༻͖͢34728 / RubyJekyll26870 / GolangHugo23123 / JavaScript(React)Next23123 / JavaScript(React)Gatsby13371 / JavaScript(Vue)Nuxt
JavaScriptͷδΣωϨʔλʔΛબ͖͢ཧ༝• ServerͰੜͨ͠HTMLΛJSͰ͍͡ΔͷͦΖͦΖࣙΊ͍ͨɻ• APIΛୟ͍ͯViewʹදࣔ͢Δॲཧ͕JSͰ݁͢Δɻ• ߟ͑Δ͜ͱ͕૿͑ͳ͍··SPAʹͰ͖Δ͔ɻ• ϑϩϯτΤϯυͷࢿ࢈Ͱ͋Δ։ൃڥ͕ศརɻ• ϏϧυڥΛ͑ΔͷʹNode͚ͩ༻ҙ͢ΕΑ͍ɻ
JAM Stack͜ΕΒͷཁૉΛຬͨ͢ελοΫΛJAM Stackͱ͍͏ɻhttps://jamstack.org/JavaScriptͰߏ͞Ε͍ͯΔAPIΛར༻͢Δ͜ͱࣄલʹϏϧυ͢Δ͜ͱ
Կ͕࡞ΕΔͷʁ• Headless CMSΛͬͨΦϯυϝσΟΞ• ্ཱ͕ͪ͛രͰग़དྷΔɻ• esa.ioQiita:Teamͱ࿈ܞͯ͠ߋ৽Ͱ͖ΔίʔϙϨʔταΠτ• ཧαΠτΛϗεςΟϯά͢Δඞཁͳ͍ͷͰศརɻ• ձࣾͷϝϯόʔͷQiitanoteɺϒϩάΛ·ͱΊͨϙʔλϧαΠτ• స৬ଟͯ͘։ൃϒϩάʹॻ͘ͷ͕ਏ͍ͷͰɺใͷϙʔλϏϦςΟ্͕͕Δɻ• StripeMoltinΛۦ͢ΕECαΠτग़དྷΔɻ• ਖ਼ҙຯ͕Θ͔Βͳ͍ɻ
֤ϑϨʔϜϫʔΫͷհ
ओཁͳ੩తαΠτδΣωϨʔλʔ34728 / RubyJekyll26870 / GolangHugo23123 / JavaScript(React)Next23123 / JavaScript(React)Gatsby13371 / JavaScript(Vue)Nuxt
Next• SSR͖ͷReactΞϓϦέʔγϣϯ༻ͷSPAϑϨʔϜϫʔΫɻ• RoutingSSRʹؔͯ͠ϨʔϧΛෑ͍ͯ͘ΕΔɻ• easyΑΓsimpleدΓɻυΩϡϝϯτ؆ૉɻ• ੩తαΠτͷΤΫεϙʔτػೳ͕͋Δɻ
Nuxt• ຊʹྲྀߦͬͯΔʢؾ͕͢ΔʣVueͷSPAϑϨʔϜϫʔΫɻ• Next.jsΠϯεύΠΞܥͷϑϨʔϜϫʔΫ͚ͩͬͨͲɺϑϧελοΫํ໘ʹ͔͍ͬͯΔɻ• ઃఆΑΓنͳϑϨʔϜϫʔΫɻϑϩϯτΤϯυͷRailsʢݸਓͷݟղʣ• SSRϞʔυɺSPAϞʔυɺ੩తϑΝΠϧϞʔυ͕͋Δɻ• ࠷ۙຊ൪ͰNuxtΛ࠾༻͍ͯ͠ΔྫΛԿճ͔ݟͨɻʢͨͩ͠SSRϞʔυʣ
Gatsby• ReactͰ੩తαΠτΛॻͨ͘ΊͷϑϨʔϜϫʔΫɻ• ී௨ʹॻ͚ૣ͘ͳΔΑ͏ʹઃܭ͞Ε͍ͯΔɻ• ෳͷσʔλιʔεΛѻ͍͍͢ઃܭʹͳ͍ͬͯΔɻ• ΞϓϦέʔγϣϯͬΆ͍ͷΛॻ͘ͷͰͳ͍ɻ
ϑϨʔϜϫʔΫΛબͿͱ͖ͷϙΠϯτ• Next, Nuxt, Gatsbyʹؔͯ͠ɺ֎෦ͷAPIΛୟ͍ͯͳʹ͔͢Δ߹ʹɻ͋͘·ͰJAM Stackʹ͔ͬΔͳΒ͜ͷ3ͭͰʁͱ͍͏ɻ• ͜ͷ3ͭͷϑϨʔϜϫʔΫ੩తαΠτͱͯ͠ग़ྗ͢ΔͱɺJS͕ಡΈࠐ·ΕͨޙʹSPAͱͯ͠ಈ࡞͢Δɻ• ͨͩNext, NuxtΞϓϦέʔγϣϯϑϨʔϜϫʔΫͷଆ໘͕ڧ͍ͷͰɺ͜͜Ͱൺֱ͢ΔͷదͰͳ͍• ٯʹMarkdownͰϒϩάΛ࡞Γ͍ͨ߹ɺͦ͏͍ͬͨࢥͷϑϨʔϜϫʔΫΛબͿ͖ɻ• ϑϨʔϜϫʔΫຖͷࢥ͕͋ΔͷͰݴޠΘͣʹݟͯΈΔͱ͍͍͔
Α͋͘Δ͔͠Εͳ͍࣭
ϑΥʔϜͱ͔Ͳ͏͢ΜͷΑʁ• Ұ൪؆୯ͳͷ͕Google FormͷຒΊࠐΈɻ• FormܥͷSaaSNetlify FormΛ͏બࢶ• Netlify FunctionsLambdaͱ࿈ܞͯ͠؆қతͳαʔόʔαΠυͱΈͳ͢͜ͱͰ͖Δɻ
Ϗϧυ࣌ؒͱ͔Ͳ͏ͳͷʁ• HTML෦ΑΓ֎෦APIΛୟ͘෦͕ωοΫʹͳΓ͕ͪɻ• WordPress+GatsbyͰ࡞ͬͯΔαΠτ2000ϖʔδ͙Β͍Ͱ6ͱ͍͏ͱ͜Ζɻ• ͏গ͠γϯϓϧͳHeadless CMSΛ͑ͰऴΘΔͣɻ
React, Vueͬͯߟ͑Δ͜ͱ͕ଟͦ͏• Next.js, GatsbyJS, Nuxt.jsΛબɺ͋ΔఔͷϨʔϧ͕ෑ͔Ε͍ͯΔͨΊϥΠϒϥϦબఆͱ໘͢Δ͜ͱগͳ͍ɻ• ίϯϙʔωϯτ୯ҐͰCSS͕͔͚ͨΓ͢ΔͷͰɺCSSͷҋͱ໘͠ʹ͍͘ɻ• ݸਓͷݟղͰ͍͑ɺී௨ʹHTMLΛॻ͘ΑΓߟ͑Δ͜ͱ͕গͳ͍ɻ
SPA(+SSR)ͱ੩తαΠτͷ͍͚ʁ• ߋ৽ස͕ߴ͘ͳ͍·ͨAPIͷར༻੍ݶ͕͋Δ߹੩తαΠτɻ• ੩తαΠτͰͳ͘SPA(+SSR)ʹ͢Δ߹ͰReactͳΒNext.jsɺVueͳΒNuxt.js• ۩ମతʹCGMͷΑ͏ͳߋ৽ස͕ߴ͍αΠτͰ͋ΕNext.jsɺNuxt.jsʹ͢Δɻ• 3rd Party ServiceͷAPIʹར༻੍ݶ͕͋Δ߹ɺ੩తαΠτԽ͢Δඞཁ͕͋Δɻ
͋ͳͨͷαΠτɺSPAͰ͍͍ͷͰʁJAM StackͷMarkup͕ຬͨͤͳ͘ͳΔ͚Ͳૣ্ཱͪ͛͘Δͱ͍͏ҙຯͰڧ͍બࢶʹͳΔ͓·͚
• SPA੩తαΠτ• JS͕ϒϥβͰϨϯμϦϯά͍ͯ͠ΔSPA੩తαΠτ
• Netlify͕PrerenderingΛαϙʔτ(beta)• Ϋϩʔϥʔ͚ʹJSͰϨϯμϦϯάͨ݁͠ՌΛฦͯ͘͠ΕΔɻ• ϗεςΟϯάαʔϏεʹ͍͍ͬͭͯ͘ΔͷͰγʔϜϨεʹઃఆՄೳ• Ҏલ͔Βprerender.ioͷΑ͏ͳαʔϏε͕͋ͬͨɺ͋·Γྲྀߦ͍ͬͯͳ͍ҹNetlify Prerenderingͷొ
ࣄྫ: SmartDrive https://smartdrive.co.jp@takanoripe͞Μ࡞ɻNuxt.jsͷSPAϞʔυ+WordPress REST API
੩తαΠτͰͰ͖Δ͜ͱͲΜͲΜ૿͍͑ͯΔ࡞Βͳ͍͍ͯ͘ͷ͕૿͑ͨͷͰΑΓຊ࣭తͳͷʹྗͰ͖Δ࣌ʹ·ͱΊ
@mottox2• ReactͱRuby on RailsΛத৺ʹWebαʔϏε։ൃ͍ͯ͠·͢• ϒϩάͬͯ·͢(esa.io + note.mu + GatsbyJS) => mottox2.com• ࣄͰσβΠϯ͠ͳ͕ΒNext(SSR)GatsbyJSΛͬͯ·͢Freelance web engineerYuki Takemoto୭ʁ