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
pixiv chatstory の PWA としての取り組み
Search
ikasoumen
July 08, 2018
Technology
6.4k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
pixiv chatstory の PWA としての取り組み
ikasoumen
July 08, 2018
More Decks by ikasoumen
See All by ikasoumen
Sharing type definitions between TypeScript And Dart
ikasoumen
0
910
Ionic 4 の話
ikasoumen
0
120
ただしく学ぼうPWA
ikasoumen
2
700
Angular + Ionicを使って iOSエンジニアにもやさしいPWA開発をした話
ikasoumen
0
930
Other Decks in Technology
See All in Technology
toio・myCobotでフィジカルAIっぽいことを行うための検討(とりあえず調査) / フィジカルAI LT(IoTLTによる開催)
you
PRO
0
150
なぜ、あなたのAPIは使われないのか? AX時代の設計原則、ガードレール、運用体制
yokawasa
1
270
運用を犠牲にせずコストを制御し事業成長を支える B2B SaaS ID管理基盤におけるS3 Tableのログストレージ活用
kaminashi
1
120
実践が先生だった— 新卒サーバーエンジニア1年目のリアル
mixi_engineers
PRO
0
210
MCPをつなげて作る組織横断のAIエージェント基盤
tsubakimoto_s
0
440
Atlassian Cloudサポート業務でのAIエージェント活用事例
smt7174
0
150
Claude Mythos、Fable...フロンティアAIの最新動向と企業のセキュリティ対策
flatt_security
0
170
reFACToring
moznion
1
1.1k
LangfuseによるLLMOps基盤の構築と活用事例
zozotech
PRO
1
200
Retriever と Reranker、結局どうする?
kazuaki
1
530
オートマトンと字句解析でRoslynを読む
tomokusaba
0
130
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
53k
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
141
7.6k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Visualization
eitanlees
152
17k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
190
A designer walks into a library…
pauljervisheath
211
24k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
So, you think you're a good person
axbom
PRO
2
2.1k
A Soul's Torment
seathinner
6
3.1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
How GitHub (no longer) Works
holman
316
150k
How to build a perfect <img>
jonoalderson
1
5.8k
Transcript
QJYJWDIBUTUPSZͷ 18"ͱͯ͠ͷऔΓΈ 2018/7/8 HTML5 APP CONFERENCE 2018 ikasoumen
ൃදࢿྉ 2 w ຊͷൃදࢿྉͪ͜Β w ͜ͷޙ͠Β͘දࣔ͠·͢
ª ൃදࢿྉ 3 ࣗݾհ w JLBTPVNFO w UXJUUFS!@JLBTPVNFO w HJUIVCJLBTPVNFO
w ϐΫγϒԬΦϑΟε w ৽ଔೖࣾ w 8FCٕज़͕͖ͳΤϯδχ Ξ
ª ൃදࢿྉ 4 ϐΫγϒגࣜձࣾ w 8FCαʔϏε։ൃɾӡӦ w QJYJW w #005)
w QJYJW'"/#09 w ͳͲ w 8FCͰ׆༂͢Δ ΫϦΤΠλʔͷ࡞׆ಈࢧԉ w ΄΅ࣗࣾαʔϏε
ൃදࢿྉ 5
ª ൃදࢿྉ 6 ԬΦϑΟε w ݄͔Βຊ֨࢝ಈ w ਖ਼ࣾһ໊ w ΞϧόΠτ໊
w QJYJWDIBUTUPSZΛ ࡞ͬͯ·͢
ª ൃදࢿྉ 7 Ԭ͍͍ͧ w த৺͔Βۭߓ·Ͱ w Ո͍҆ w ͝൧ඒຯ͍͠
w 8FCܥاۀͷਐग़͕Μ w ҰॹʹԬͰಇؒ͘Λ ืू͍ͯ͠·͢ʂʂ
Google Pixel By Victor Stuber www.VictorStuber.com QJYJWDIBUTUPSZ
ª Google Pixel By Victor Stuber www.VictorStuber.com 9 w νϟοτܗࣜͷ
খઆΛߘͰ͖ΔαʔϏε w J04ʜ/BUJWF 4XJGU w "OESPJE 1$ʜ18" w 18"ϐΫγϒͰॳɻ ͔ͳΓख୳Γ w ࠓ18"൛ͷݟΛ ͠·͢ QJYJWDIBUTUPSZ
w 18"ͷڧΈͱQJYJWDIBUTUPSZʹ͓͚ΔऔΓΈ w ʑͷϦϦʔεΛࢧ͑Δٕज़ ࠓ͢͜ͱ 10
w 18"ͷࡉ͔͍Έ w Ͳ͏ͬͨΒ18"ʹͳΔͷ͔ ͞ͳ͍͜ͱ 11
18"ͷڧΈͱ QJYJWDIBUTUPSZͷऔΓΈ
w ҎԼͷΑ͏ͳಛΛ࣋ͬͨ8FCΞϓϦ w ϗʔϜը໘͔ΒΞΫηε w ϓογϡ௨͕ར༻Մೳ w ΦϑϥΠϯͰ͑Δ w ͳͲ
w ετΞ͔ΒΠϯετʔϧͰͳ͘ɺ8FC͔ΒΞΫηε͢Δ w ωΟςΟϒΞϓϦͰͳ͍ͱ͔ͬͨ͠ػೳͷ࣮ݱ w ৄ͍͠࡞Γํ(PPHMF%FWFMPQFSTͰʂ 18" 1SPHSFTTJWF8FC"QQ 13
A2HS (Add To Home Screen)
ª Google Pixel By Victor Stuber www.VictorStuber.com 15 w ʮϗʔϜը໘ʹՃʯ
w 18"ʹ͓͚Δ ʮΞϓϦͷΠϯετʔϧʯ w "QQ*OTUBMMCBOOFSʹΑΔ Πϯετʔϧૌٻ "OESPJE $ISPNF ")4
ª Google Pixel By Victor Stuber www.VictorStuber.com 16 w ผΞϓϦ͔ΒαʔϏεͷ63-Λ
౿Ήͱ18"Ͱ։͔͘બΔ "OESPJE w "OESPJEͰΞϓϦѻ͍ w ෦తʹʮϗʔϜը໘ʹ Ճʯͨ͠ͱ͖ʹBQLΛੜ ͍ͯ͠Δ ")4ΞϓϦͰ։͘
ª Google Pixel By Victor Stuber www.VictorStuber.com 17 w "OESPJEͰ"QQ*OTUBMM
#BOOFS͕ग़Δ w ݅ɿճҎ্ͷΞΫηε͕ ͋Γɺ࠶๚ʹҎ্ͷִؒ ͕͋Δ w ճͷདྷ๚Ͱग़ͳ͍ ")4"QQ*OTUBMMCBOOFS
ª Google Pixel By Victor Stuber www.VictorStuber.com 18 w QJYJWDIBUTUPSZͰ
Πϯετʔϧखॱ͕ݟΒΕΔ ՕॴΛ༻ҙ͍ͯ͠Δ w ໌ࣔతʹΞϓϦΠϯετʔϧͷ ҙࢥ͕͋ΔϢʔβʔ༻ QJYJWDIBUTUPSZͷ߹
JS ͷ Lazy Load ͱ Cache
w 18"Ͱ༻͍ΒΕΔ4FSWJDF8PSLFSΛ͏ͱɺ 8FC"QQͷશͯͷϦΫΤετɾϨεϙϯεΛϋϯυϦϯά Ͱ͖Δ w $BDIF"1*ΛͬͯϨεϙϯεͷΩϟογϡ͕Ͱ͖Δ w ΞϓϦͷಈ࡞ʹඞཁͳϑΝΠϧ IUNMKTDTTJNBHF
ΛΩϟογϡ͢ΔͱΦϑϥΠϯରԠͰ͖Δ 4FSWJDF8PSLFSʹΑΔ$BDIJOH 20
w +BWB4DSJQUͷϑΝΠϧׂͯ͠৴Ͱ͖Δ w ࠷ॳͷը໘Ͱɺඞཁͳͷ DIVOLKTϑΝΠϧͷΈΛ ಡΈ͜Ή w αʔϏεʹॳΊͯΞΫηεͨ࣌͠ɺαʔϏεશମͷίʔ υΛಡΈࠐ·ͳͯ͘ྑ͍ w
ૉૣ͍࢝͘ΊΒΕΔ +4ͷ-B[Z-PBE 21
ª 22 DIVOLKTͷQSFDBDIF const fileManifest = [ { "url": "build/
0.8ffe61fe0eafb69265e2.chunk.js", "revision": "0871a6351e2bb4f7fcab7b904ca634b6" }, // // ……… // { "url": "build/ 12.8e85e96102ac9de0a826.chunk.js", "revision": "c95d8d7a1a3d94bbee1b864c578cdd44" }, ]; const workboxSW = new self.WorkboxSW(); workboxSW.precache(fileManifest); w 4FSWJDF8PSLFSΛͬͯ ΞϓϦશମͰඞཁͳ DIVOLKTϑΝΠϧΛޙಡ Έͯ͠ɺΩϟογϡ͢ΔΑ ͏ʹ͍ͯ͠Δ w 4FSWJDF8PSLFSͷੜʹ 8PSLCPYΛ͍ͬͯΔ
w 4FSWJDF8PSLFSαΠτʹΞΫηεͯ͠ډͳͯ͘ߋ৽ νΣοΫ͕Δ w ࠷Iʹճ w DIVOLKTͷߋ৽͕͋ͬͨ߹ɺ4FSWJDF8PSLFSߋ৽ ͢ΕQSFDBDIFΛ࠶ΒͤΔ͜ͱ͕Ͱ͖Δ 4FSWJDF8PSLFSͷࣗಈߋ৽ 23
w ॳظϩʔυ࠷ॳͷը໘ͷϦιʔεͷΈ w ॳظϩʔυ͕ऴΘΔͱ΄͔ͷϦιʔεΛΩϟογϡ։࢝ w Ωϟογϡ͕ऴΘΔͱΦϑϥΠϯͰ͑Δ w ߋ৽͕͋ͬͨΒ࣍ͷΞΫηε࣌ʹϦιʔεΛ%- w ࣍ͷ࣍ͷΞΫηεࣗಈతʹΞοϓσʔτ͞Ε͍ͯΔ
w ωΠςΟϒΞϓϦͱൺΔͱΠϯετʔϧͪΛ ͘Ͱ͖Δ ͭ·Γɺ18"ͳΒ͜͏Ͱ͖Δ 24
w QJYJWDIBUTUPSZΦϑϥΠϯରԠͷΈෆ࠾༻ w "1*ͱ௨৴Ͱ͖ͳ͍ͱՁ͕ൃشͰ͖ͳ͍αʔϏε w ͓ؾʹೖΓͷετʔϦʔΛಡΊΔͱ͔͋Γ͔ w ΦϑϥΠϯதͷૢ࡞ΛΦϯϥΠϯ෮ؼ࣌ʹ࠶ࢼߦٕज़తʹͰ͖Δ w ͦͦຊ͋·Γ௨৴ڥͰࠔΒͳ͍ʜ
w DIVOLKTΩϟογϡ͍ͯ͠Δ w -B[ZMPBEରԠ͢ΔͱɺσϓϩΠલޙͰҧ͏Ϗϧυͷ DIVOLKTΛಡ Έࠐ͏ͱͯ͠མͪΔ͜ͱ͕͋Δ w ΩϟογϡΛͬͯɺҰճͷىಈதͰಉ͡ϏϧυͷKTͷΈΛ͏ QJYJWDIBUTUPSZͷ߹ 25
ϚϧνϓϥοτϑΥʔϜରԠ
w QJYJWDIBUTUPSZͷ߹ɺରԠ04ϒϥβ ஈ֊తʹ૿ͨ͠ w ॳ"OESPJE$ISPNFΛϝΠϯʹରԠ͍ͯͨ͠ w ")4͢ΔͱJ04൛ͱಉ͡ϑϧػೳ͕͑Δ w ετʔϦʔͷΤσΟλͱ͔Ͷ w
ͦΕҎ֎Ͱ7JFXFSͷΈ w ରԠϒϥβΛߜΔ͜ͱͰૣ͘։ൃͰ͖ͨ ϚϧνϓϥοτϑΥʔϜରԠ 27
w ϓϩμΫτͷঢ়ଶʹ߹Θͤͯॱ֦࣍େͨ͠ w 1$DISPNFରԠ w ")4ΛඞਢͰͳ͘͢ w 4BGBSJ'JSFGPY&EHFରԠ w ߜͬͨλʔήοτ͚ʹૣ͘࡞ͬͯɺ͋ͱͰରԠΛ֦େ
ஈ֊త֦େ 28
18"ͷڧΈͱ QJYJWDIBUTUPSZͷऔΓΈ
͜͜ͰҰ୴࣭ͱ͔͋Ε
Q. ͳͥPWA? ͳͥ iOS͚ͩωΠςΟϒʁ
ʑͷϦϦʔεΛ ࢧ͑Δٕज़
ΞʔΩςΫνϟ w "1*4FSWFS3BJMTPOIFSPLV w )PTUJOH4FSWFS w 'SPOUFOE'JSFCBTFIPTUJOH w 6TFS"TTFUT"844 PSJHJO
*NBHFqVY DBDIF ը૾ w 'SPOUFOE"OHVMBS *POJD w 1VTIOPUJpDBUJPO0OFTJHOBM 33
Ionic
ª Google Pixel By Victor Stuber www.VictorStuber.com *POJD 35 w
8FCٕज़ͰJ04 "OESPJE ΞϓϦΛ࡞ΔͨΊͷ ϑϨʔϜϫʔΫ 044 .*5 w 6*ίϯϙʔωϯτͷ ݟӫ͕͑ωΠςΟϒʹ͍ۙ w $PSEPWBͰΞϓϦʹͯ͠ ετΞʹฒΔͷ͕ओྲྀ w QJYJWDIBUTUPSZͰෆ࠾༻
$PSEPWBෆ࠾༻ʁ 36 w QJYJWDIBUTUPSZϒϥβ"1*͚ͩͰࣄΓΔ w ಛʹ"OESPJEDISPNFલఏͰ͋Ε w ϓογϡ௨ w ΞϓϦͱͯ͠ͷΠϯετʔϧ
w ґଘ͕গͳͯ͘ࡁΉͳΒͦͷํ͕ྑ͍ͱ͍͏ελϯε
*POJD18" 37 w *POJDͷ్த͔Β18"ରԠ͕͞Εͨ w $PSEPWBΛ֎͢ͷެࣜͷ௨Γʹ͍ͬͯΔ w ҰํͰ8FCͷੈքʹରԠ͖͠Εͯͳ͍ͱ͜Ζ͋Δ w ௨ৗͷ"OHVMBSͷ͓࡞๏Ͱ443Ͱ͖ͳ͍
w ͨ·ʹόάͬͯΔʜ w *POJD ։ൃத ͰΖΖྑ͘ͳΔ
Hosting
ª w 18"൛J04൛ͱಉ༷ʹ ΫϥΠΞϯτΞϓϦͷͭ ͱͯ͠ఏڙ w 3BJMT"1*ʹઐ೦ )5.-Λฦ͞ͳ͍ w QJYJW4LFUDIͱࣅͨࢥ
w ੩తϑΝΠϧΛαʔόʔʹ ஔ͚ͩ͘ 39 #VJMEͱIPTUJOH QJYJW4LFUDIͷߏ
ª w ੩తϑΝΠϧͷϗεςΟϯά ʹ༻ w DMJͰσϓϩΠͰ͖Δ w KTPOͰIFBEFSSFXSJUFϧʔ ϧͷΧελϚΠζ w
ϑϩϯτΤϯυΤϯδχΞ ͰΘ͔Γ͍͢ w pSFCBTFGVODUJPOTͱγʔϜ Ϩεʹܨ͛ΒΕΔ 40 'JSFCBTFIPTUJOH { "hosting": { "public": "www", "rewrites": [ { "source": "!/api/**", "function": "insertOgp" } ], "headers": [ { "source": "build/*.@(js| css)", "headers": [ { "key": "Cache-Control", "value": "public, s- maxage=5184000" } ] }, …
ª w αʔόʔଆͰඞཁͳ ͍ܰλεΫΛߦ͏ w 0(1ຒΊࠐΈ w 0(1ը૾ͷੜ • SSRͰ͖ͳ͍͔ΒͶ…
41 'JSFCBTFGVODUJPOT /** HTML ΛϨϯμϦϯάͯ͠ฦ͢ */ export const insertOgp = functions.https.onRequest( async (req, res) => { let data: TemplateData; try { data = await routing(req); } catch { data = defaultData(req); } const html = renderTemplate(data); res.send(html); } );
CI
ػೳՃϑϩʔ w ϐΫγϒͰ৽ػೳՃҎԼͷϑϩʔ͕ଟ͍ w ࣮ w 1VMM3FRVFTU 13 ࡞ w
ϨϏϡʔɾमਖ਼ w ࣮ऀ͕Ϛʔδ w ࣮ऀ͕σϓϩΠ w ճσϓϩΠ͢Δ 43
όά࠷ѱͷମݧ w 13Λ͍Α͘σϓϩΠͨ݁͠Ռɺ݁ߏόάΛੜΜͰ͍ͨ w ͲΜͳʹૉΒ͍͠αʔϏεͰѪ͕ྫྷΊΔ w ৽͍͠αʔϏεͩͱϢʔβʔ͔Βͷใࠂগͳ͍ w 18"Ϋϥογϡͤͣ੩͔ʹࢭ·Δ w
Ϣʔβʔࢭ·ͬͨͷ͔ؾ͚ͮͳ͍ w Τϥʔऩू͍ͯ͠Δ͕ɺ·͙ͣ 44
ª w (JUIVCͰ13Λ࡞ΔͱࣗಈͰ ΞϓϦੜ w 13ຖͷυϝΠϯʹΞΫηε ͢Δ͚ͩͰಈ࡞֬ೝ͕Ͱ͖Δ w खݩʹQVMMͯ͠CVJME͠ͳ͘ ͍͍ͯͷͰָ
w IFSPLV੩తϑΝΠϧΛஔ ͚ͩ͘ 45 IFSPLV3FWJFX"QQT
ຖΞϓϦΛ৮Δ w ϦϦʔεީิ൛ΛຖϏϧυ w ேձޙʹνʔϜͷΈΜͳͰϫΠϫΠࢼ͢ w J04 18"྆ํ w ΈΜͳͰΫδ
ཧ Λͻ͍ͯͲΕΛࢼ͔ܾ͢ΊΔ w ʮยํ͚ͩݟΔʯ͜ͱʹͳΒͳ͍Α͏ʹ w ࣮ࠩҟʹؾ͚ͮΔ w ΫδΛҾ͘ͷָ͍͠ w (Pஅ͕ग़ͨΒϦϦʔε 46
ʑͷϦϦʔεΛ ࢧ͑Δٕज़
w 18"ͷڧΈ w ΠϯετʔϧɾΞοϓσʔτΛҙࣝ͠ͳ͍Ͱ͑Δ w ΦϑϥΠϯରԠɾϓογϡ௨ͳͲ ωΠςΟϒΞϓϦతػೳ͕͑Δ w ʑͷϦϦʔεΛΑΓྑ͍ͷʹ w
41"ͷٕज़ࣗಈԽɾεέʔϧ͍͢͠ w ໘ͳ࡞ۀػցʹͤͨΓɺΈΜͳͰָ͠Ή ·ͱΊ 48