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.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
700
Angular + Ionicを使って iOSエンジニアにもやさしいPWA開発をした話
ikasoumen
0
930
Other Decks in Technology
See All in Technology
Baseline対応のDOMの型定義を作った
uhyo
3
700
オブザーバビリティ、本当に活用できてる? 〜API連携×生成AIで成熟度を自動評価〜
dmmsre
0
840
プロダクトだけじゃない、社内プロセスにおける自動化・省力化ノススメ
kakehashi
PRO
1
540
ゼロをイチにする仕事が終わったあと
smasato
0
310
AIと共生する開発者プラットフォーム:バクラクのモノレポ×マイクロサービス基盤
sakajunquality
1
600
AI時代のエンジニアキャリアについて今一度考える
sakamoto_582
1
1.2k
Keeping applications secure by evolving OAuth 2.0 and OpenID Connect
ahus1
PRO
1
150
『AIに負けない』より『AIと遊ぶ』」〜ワクワクが最強のテスト・QA学習戦略_公開用
odan611
1
450
Why is RC4 still being used?
tamaiyutaro
0
300
AIDLC_ヤフーショッピングの取り組み
lycorptech_jp
PRO
0
540
依頼文化をやめる日 EM視点で語るPlatform EngineeringとInclusive SRE / Discussing Platform Engineering and Inclusive SRE from an EM's Perspective
shin1988
3
2.8k
Compose 新機能総まとめ / What's New in Jetpack Compose
yanzm
0
140
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Google's AI Overviews - The New Search
badams
0
1.1k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
260
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
220
Music & Morning Musume
bryan
47
7.3k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
460
Code Review Best Practice
trishagee
74
20k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
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