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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
ikasoumen
July 08, 2018
Technology
6.3k
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
900
Ionic 4 の話
ikasoumen
0
120
ただしく学ぼうPWA
ikasoumen
2
690
Angular + Ionicを使って iOSエンジニアにもやさしいPWA開発をした話
ikasoumen
0
930
Other Decks in Technology
See All in Technology
2026TECHFRESH畢業分享會 - Lightning Talk - 打造精準高效的 MCP 設計模式與測試實務
line_developers_tw
PRO
0
990
小さく始める AI 活用推進 ― 日経電子版 Web チームの事例/nikkei-tech-talk47
nikkei_engineer_recruiting
0
260
SONiCのLinuxベースを活かしたZabbix監視
sonic
0
150
気づかぬうちにセキュリティ負債を生むAPIキー運用
sgwrmctk
0
120
LayerXにおけるセキュリティ管理の現在地と次の一手
tosho
0
170
社内 AI エージェント Synapse と セマンティックレイヤーの育て方
hiroakis
3
1.9k
現地で盛り上がった WWDC26 Keynote
zozotech
PRO
1
240
自律型AIエージェントは何を破壊するのか
kojira
0
160
攻撃者視点で考えるDetection Engineering
cryptopeg
3
1.8k
小さくはじめるSLI/SLO ~育てながら組織に定着させる実践知~ / Starting Small with SLI/SLOs: Building Adoption Through Continuous Growth
nari_ex
7
1.9k
20260619 私の日常業務での生成 AI 活用
masaruogura
1
200
やさしいA2A入門
minorun365
PRO
12
1.8k
Featured
See All Featured
The Invisible Side of Design
smashingmag
302
52k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
210
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
160
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
200
Statistics for Hackers
jakevdp
799
230k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
320
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
230
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
370
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
300
Designing for humans not robots
tammielis
254
26k
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