Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
pixiv chatstory の PWA としての取り組み
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
130
ただしく学ぼうPWA
ikasoumen
2
710
Angular + Ionicを使って iOSエンジニアにもやさしいPWA開発をした話
ikasoumen
0
940
Other Decks in Technology
See All in Technology
おい、エージェントを使って終わらせろ
nwiizo
0
230
バイブコーディング時代のWebアプリ開発入門~Cloud Runで学ぶセキュアなビルドとデプロイ
waiwai2111
1
120
Railsのように考える: See through the Master
snoozer05
PRO
3
820
Snowflakeのコスト最適化を支えるアーキテクチャ設計
ktatsuya
1
1.6k
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
12k
2026/09/10 Spring Bootから Jakarta EE/MicroProfileへの移行
megascus
0
370
2026_devsumi_ozono.pdf
o3
3
500
Genieを崇めよ
kameitomohiro
0
120
range over func 2年間の軌跡 Issue #56413 はGoのエコシステムをどう変えたか
ryujicre8ive
0
190
積み重なった技術負債への挑戦 〜初手としての全社ゴト化〜
techtekt
PRO
0
1.2k
安心して変更できるWebフロントエンドの作り方
pirosikick
4
2.5k
生成AIエージェントを用いた、 手動テスト手順書から自動テストへの 変換手法の検討
magicpod
0
160
Featured
See All Featured
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
240
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
700
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Agile that works and the tools we love
rasmusluckow
331
22k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Balancing Empowerment & Direction
lara
6
1.3k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
790
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.9k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
202
76k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
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