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
130
ただしく学ぼうPWA
ikasoumen
2
700
Angular + Ionicを使って iOSエンジニアにもやさしいPWA開発をした話
ikasoumen
0
930
Other Decks in Technology
See All in Technology
医療の現場を変革に挑戦した半年間の軌跡 - PythonとAIで現場を変える / From Code to Care
soudai
PRO
1
620
Introduction to Sansan Meishi Maker Development Engineer
sansan33
PRO
0
460
コミュニティから始まった農業IoTとの7年間 ——人との関わりが教えてくれたこと
peacemaker07
0
110
8bit CPU 2026
koba789
7
2.9k
OAuth SPIFFE Client Authentication(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
270
アクセスキー流出時の対応で再認識した攻撃側と防御側の非対称性について
kazzpapa3
0
310
Master Dataグループ紹介資料
sansan33
PRO
1
4.8k
The Django UUID Story - DjangoCon US 2026
pauloxnet
0
260
「ミスを許さない手順書」を作ってみた 〜 個人的にはこれ以上できることはあまりなさそう/20260827-ssmjp-operation-procedure-update
opelab
4
1.3k
IHV like なユースケースへのOpenID Connect 関連仕様の適用事例
optim
0
280
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
6
77k
Android skills に学ぶ
kokiko
0
190
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
9
970
The Language of Interfaces
destraynor
162
27k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
210
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
670
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Code Review Best Practice
trishagee
74
20k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
300
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
240
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