Skip to content

Latest commit

ย 

History

History
258 lines (193 loc) ยท 8.96 KB

06.md

File metadata and controls

258 lines (193 loc) ยท 8.96 KB

Router, PWA

Vue Router

npm install vue-router

ํŽ˜์ด์ง€ ์ „์ฒด ์ •๋ณด๊ฐ€ routes ๋ผ๋Š” ๊ณณ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

// src/router/index.js
{
    path: '/home',
    component: HomePage
},

์ด ์ •๋„๋กœ path๋งˆ๋‹ค ๋ฟŒ๋ ค์ง€๋Š” component ๊ตฌํ˜„์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ, tag๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ router view๋ฅผ ์ •์˜ํ•œ๋‹ค. ๋Š” ๋ทฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ผ์„ ๋•Œ ์ œ๊ณตํ•˜๋Š” router ํƒœ๊ทธ์ด๋‹ค.

  • mode

vue-router์˜ ๊ธฐ๋ณธ ๋ชจ๋“œ๋Š” hash mode. URL์ด ๋ณ€๊ฒฝ๋  ๋–„ ํŽ˜์ด์ง€๊ฐ€ ๋‹ค์‹œ ๋กœ๋“œ๋˜์ง€ ์•Š์Œ

๋ณ€๊ฒฝ์„ ์œ„ํ•ด history ๋ชจ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š์•„๋„ URL ํƒ์ƒ‰ ๊ฐ€๋Šฅ

const router = new VueRouter({
  mode: 'history',
  routes: [...]
})
  • router-link

a href์™€์˜ ์ฐจ์ด : to, replace ๋“ฑ์˜ vue-router์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต ์—ฌ๋ถ€. router-link๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ด๋ผ๋“ ์ง€, to ์†์„ฑ์— parameter ๋“ฑ์„ ๋„˜๊ธธ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

url์„ ๋ฐ”๊ฟจ๋Š”๋ฐ๋„ ์„œ๋ฒ„๋กœ ๊ฐ€์ง€ ์•Š๊ณ  jsํŒŒ์ผ๋กœ ์กฐ์ž‘์ด ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฐ€? -> window history

  • router ๊ตฌ์„ฑ๋ฐฉ๋ฒ•
  1. ๊ธฐ๋ณธ ๋ฐฉ์‹ : ์š”๊ตฌ์‚ฌํ•ญ์ด ๋งŽ์ด ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ (๋‹จ์ˆœํ•˜๊ฒŒ ๊ตฌ์„ฑ)
  2. nested router
  3. named view
  • SPA(Single Page Application)

SPA lifecycle

์˜ˆ์ „์—๋Š” ํ™”๋ฉด์— ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ „์ฒด ํŒŒ์ผ์„ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„๊นŒ์ง€ ์ ‘๊ทผํ–ˆ๋Š”๋ฐ, ์š”์ฆ˜์—๋Š” ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„๋งŒ ์„œ๋ฒ„์— ๊ฐ€์„œ ์š”์ฒญํ•จ. ํ•ด๋‹น ์—ญํ• ์„ vue router๊ฐ€ ์ˆ˜ํ–‰

Navigation gaurd

routes: [
	{
		path: "/home",
		component: Home
		beforeEnter: (to, from, next) => {
			if (localStorage.getItem("key") == null) {
				return next({
					path: "/login",
					query: { redirect: to.fullPath }
				});
			}
			next();
		};
	}
]
  • ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— key๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์—†์œผ๋ฉด login ํ™”๋ฉด์œผ๋กœ ๋„˜๊ธฐ๋Š” ๋กœ์ง์ด๋‹ค.
  • ์œ„ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ๋ฅผ ํ†ตํ•ด ํŠน์ • ๋ผ์šฐํŒ…์— ๋Œ€ํ•ด ๊ฐ€๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‰ฝ๊ฒŒ ๋งํ•ด, ํŠน์ • ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ์กฐ๊ฑด ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธ์ด ๋˜์—ˆ๋Š”์ง€ ๋“ฑ ๊ฒ€์ฆ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

PWA

Workbox๊ฐ€ ๊ฐ€์žฅ ์ตœ์‹ ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

  • ๋ชจ๋ฐ”์ผ ์•ฑ๊ณผ ๊ฐ™์€ ๊ฒฝํ—˜์„ ์ฃผ๋Š” ์ตœ์‹  ์›น ์•ฑ
  • ์•ฑ icon, ์•ฑ ์„ค์น˜ banner, ๋ชจ๋ฐ”์ผ push(notification), offline ๊ฒฝํ—˜ ์ œ๊ณต
  • html, css, js๋กœ ๋ชจ๋ฐ”์ผ๊ณผ ๊ฐ™์€ ์›น์•ฑ ๊ตฌํ˜„
  • ๋†’์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์›น์•ฑ (ํŽ˜์ด์ง• ์†๋„๋ฅผ ์˜ฌ๋ฆฌ๋Š” ๋“ฑ)

https://vuejsdevelopers.com, https://dev.to ์™€ ๊ฐ™์€ ์‚ฌ์ดํŠธ๋“ค์ด PWA๋กœ ๊ฐœ๋ฐœ์ด ๋˜์—ˆ๋‹ค. ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์„ค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. https://pwa.rocks/ ์—ฌ๊ธฐ์—์„œ ๋” ๋งŽ์€ PWA ์‚ฌ์ดํŠธ๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

PWA ํŠน์ง•

  • App-like (Mobile App๊ณผ ๋™์ผํ•œ icon based ์‹คํ–‰๋ฐฉ์‹๊ณผ UX์„ ์ œ๊ณต)
  • Discoverable (url๋กœ ์‚ฌ์ดํŠธ ์ ‘๊ทผ ํ›„ banner๋ฅผ ํ†ตํ•ด oneclick ์„ค์น˜ ๊ฐ€๋Šฅ)
  • Engagable (push ์•Œ๋žŒ์ด ์™”์„ ๋•Œ ๋‹ค์‹œ ์•ฑ์œผ๋กœ ์œ ์ž…)
  • Connectivity (์˜คํ”„๋ผ์ธ ์›น์•ฑ - ์ธํ„ฐ๋„ท์ด ๋Š๊ฒจ๋„ ์›น์‚ฌ์ดํŠธ๊ฐ€ ์ž˜ ๋™์ž‘ํ•จ)
  • https ์œ„์—์„œ๋งŒ ๋™์ž‘ํ•œ๋‹ค.
  • ํฌ๋ณด์Šค๋‚˜ ์ต์ŠคํŽ˜๋””์•„ ๋“ฑ ๋งŽ์€ ๊ธฐ์—…์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ผ๋ฐ˜ ์›น์‚ฌ์ดํŠธ์™€ ๋™์ž‘์ด ๋‹ค๋ฅด๋‹ค. PWA๋Š” ์•ฑ์œผ๋กœ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ–ˆ์„ ๋•Œ, launching image๊ฐ€ ์žˆ์–ด ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐ™์•„ ๋ณด์ด๊ณ , ์œ„์— url bar๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

PWA๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ์ˆ 

  1. Web App Manifest (manifest.json)
  2. Service Workers (client-side javascript proxy) - ์›น์•ฑ๊ณผ webserver ์‚ฌ์ด์— ์กด์žฌ (caching)

PWA ์ง€์› ๋ธŒ๋ผ์šฐ์ €

  • ํŒŒ์ด์–ดํญ์Šค, ์˜คํŽ˜๋ผ, ํฌ๋กฌ, ์‚ผ์„ฑ ์ธํ„ฐ๋„ท, ์—ฃ์ง€, ์‚ฌํŒŒ๋ฆฌ(push ์ง€์›X) ๋“ฑ
  • ์‚ผ์„ฑ ์ธํ„ฐ๋„ท๊ณผ ํฌ๋กฌ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

PWA ์ง€์› ๋ธŒ๋ผ์šฐ์ €

PWA๋Š” ์‹ค์ œ ์•ฑ ๋งˆ์ผ“์— ๋ฐฐํฌ๊ฐ€๋Šฅํ•˜๋‹ค?

  • OS๋ ˆ๋ฒจ๊นŒ์ง€ ๋‚ด๋ ค์™”์Œ
  • application ๊ด€๋ฆฌ tab์œผ๋กœ ์กด์žฌํ•จ
  • ํ”Œ๋ ˆ์ด์Šคํ† ์–ด์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” mapping ํ•˜๋Š” ์ž‘์—…์ด ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•  ๋ฟ์ด๋‹ค.
  • Google I/O 2019 ์›น ์„ธ์…˜์—์„œ TWA (Trusted Web Activity) ๋ผ๋Š” ์šฉ์–ด๊ฐ€ ๋“ฑ์žฅํ–ˆ๋Š”๋ฐ, ์ด๊ฒƒ์€ Google Play์— PWA๋ฅผ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” App Frame ์ด๋‹ค. App Store๋Š” ์ง€์› ์˜ˆ์ •์ด ์—†๋‹ค.

Web App Manifest

PWA์˜ ์„ค์น˜์™€ ์•ฑ ๊ตฌ์„ฑ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํŒŒ์ผ (์•ฑ ์•„์ด์ฝ˜, ๋Ÿฐ์ณ ๋ฐฉ์‹, ๋ฐฐ๊ฒฝ, ์‹œ์ž‘ํŽ˜์ด์ง€ ๋“ฑ)

<link rel="manifest" href="manifest.json" />

์•„๋ž˜ ๊ฒƒ๋“ค์ด ์„ค์ •๋  ์ˆ˜ ์žˆ์Œ.

  • start url
  • launch image
  • display type : ์›น์•ฑ์ด ๋ชจ๋ฐ”์ผ ์•ฑ์˜ ๋Š๋‚Œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ๊ฒฐ์ •์ง“๋Š” ์†์„ฑ (์ „์ฒด ๋ชจ์–‘)
    • Standalone (url์ฐฝ ์‚ฌ๋ผ์ง)
    • Browser
    • Fullscreen (non-app UI ์‚ฌ๋ผ์ง)
    • Minimal-ui
  • display orientation
  • App icon
  • ๋ฐฐ๊ฒฝ ์ƒ‰ : background color์™€ ๋น„์Šทํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

Web App Install Banner

PWA๊ฐ€ ๋ชจ๋ฐ”์ผ์ ์ธ ํŠน์ง•์„ ๊ฐ€์ง€๋Š” ํฐ ๋ถ€๋ถ„

  • ๊ธฐ์กด ์•ฑ ๊ฐœ๋ฐœ์ฃผ๊ธฐ : ๊ตฌํ˜„ -> SDK ๋นŒ๋“œ -> ์Šคํ† ์–ด ๋ฐฐํฌ -> ๊ฒ€์ƒ‰ -> ์•ฑ ๋‹ค์šด๋กœ๋“œ -> ์„ค์น˜ -> ์‚ฌ์šฉ
  • PWA ์•ฑ ๊ฐœ๋ฐœ์ฃผ๊ธฐ : ๊ตฌํ˜„ -> ์‚ฌ์ดํŠธ ๋ฐฐํฌ -> ๊ฒ€์ƒ‰ -> ์‚ฌ์šฉ (์ž๋™์„ค์น˜, ํ•ญ์ƒ ์ตœ์‹ ์ƒํƒœ ์œ ์ง€)

install banner ๋™์ž‘์กฐ๊ฑด

  • short name
  • name
  • icons (including a 192px and a 512px version)
  • https

์‚ฌ์šฉ์ž๊ฐ€ 30์ดˆ๋งŒ ์‚ฌ์ดํŠธ์— ๋จธ๋ฌด๋ฅด๋ฉด, install banner๊ฐ€ ๋œฌ๋‹ค. (ํƒ€์ด๋ฐ์€ ์กฐ์ ˆ ๊ฐ€๋Šฅ)

Service Worker

  • ์˜คํ”„๋ผ์ธ ์„œ๋น„์Šค, ํ‘ธ์‰ฌ์•Œ๋žŒ ๋“ฑ Mobile ๊ธฐ๋Šฅ์„ ์›น์—์„œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ฝ”์–ด ๊ธฐ์ˆ 
  • PWA์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.
  • ์•ฝ์ž๋กœ sw.js์™€ ๊ฐ™์ด ๋งŽ์ด ์“ฐ์ž„
  • ์„œ๋ฒ„์— ๋ฐฐํฌํ•  ๋•Œ service worker๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด https๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. Netlify๋‚˜ Firebase Hosting์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํžˆ https๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค.

chrome://inspect/#service-workers -> ํ˜„์žฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋Š” service worker๋ฅผ ์ „๋ถ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๋„๊ตฌ

์ฃผ์š”ํŠน์ง•

  • Caching
  • Offline (๋ฆฌ์†Œ์Šค๋ฅผ ์บ์‹ฑํ•จ์œผ๋กœ์จ ๊ฐ€๋Šฅ)
  • Native features (push ๋“ฑ)

Service worker๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„ ์‚ฌ์ด์˜ ๋ณ„๋„์˜ js๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ (๋ฏธ๋“ค์›จ์–ด)

  • ์‹ค์ œ์ ์œผ๋กœ๋Š” ๋ธŒ๋ผ์šฐ์ € ๋’ค์— ๋ณ„๋„์˜ ์“ฐ๋ ˆ๋“œ (๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ๊ฐœ๋…)๊ฐ€ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋‹ค. (scope๋„ ๋‹ค๋ฅด๋‹ค)
  • ๊ฐ™์€ ๋™์ž‘์„ ํ–ˆ์Œ์—๋„ ๊ธฐ์กด js์™€ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜จ๋‹ค.

์ด์ „์—๋„ Service worker์™€ ๋น„์Šทํ•œ ๊ฐœ๋…์€ ์กด์žฌํ–ˆ๋‹ค.

  1. AppCache
  • ์˜คํ”„๋ผ์ธ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์บ์‹œ ์ œ๊ณต, HTML ํ‘œ์ค€
  • ํŽ˜์ด์ง€๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์ผ๋•Œ ์˜ค๋™์ž‘, ํŒŒ์ผ ๋ณ€ํ™”ํ•  ๋•Œ ๋ฌธ์ œ
  1. Shared Workers
  • js์™€ ๋ณ„๋„์˜ ์“ฐ๋ ˆ๋“œ
  • ํŽ˜์ด์ง€์— ๋น„์ข…์†์  (ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ๋˜๋”๋ผ๋„, jsํŒŒ์ผ์€ ์ƒˆ๋กœ๊ณ ์นจ๋˜์ง€ ์•Š์Œ)

์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด service worker์ด๋‹ค.

์ฐธ๊ณ 

service-worker.js(sw.js) ํŒŒ์ผ์„ ์„ค์ •ํ•˜๊ธฐ ์ด์ „์—,index.html ํŒŒ์ผ์˜ body ํƒœ๊ทธ ์•ˆ์— ์„œ๋น„์Šค์›Œ์ปค๋ฅผ ๋“ฑ๋กํ•˜๋Š” ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

<script>
	if ('serviceWorker' in navigator) {
		window.addEventListener('load', () => {
			navigator.serviceWorker
				.register('../service-worker.js')
				.then(reg => {
					console.log('[Service worker registered]', reg);
				})
				.catch(error => {
					console.log(error);
				});
		});
	}
</script>
// #1 - ์„œ๋น„์Šค ์›Œ์ปค ์„ค์น˜(์บ์‹ฑ ํŒŒ์ผ ์ƒ์„ฑ)
self.addEventListener('install', function(event) {
	// self : app.js์—์„œ์˜ window์™€ ๋™์ผ - ๋ฐ”๋กœ window ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ
	console.log('์„œ๋น„์Šค ์›Œ์ปค ์„ค์น˜ ์™„๋ฃŒ');
	event.waitUntil(
		caches
			.open(cacheName)
			.then(function(cache) {
				console.log('์บ์‹œ ์ƒ์„ฑ ์™„๋ฃŒ');
				cache.addAll(cacheFilelist);
			})
			.catch(function(error) {
				console.log(error);
			}),
	);
});

์˜คํ”„๋ผ์ธ์—์„œ๋„ ๋Œ์•„๊ฐ€๊ฒŒ๋” ์บ์‹œ ์ž‘์—…์„ ํ•œ ๊ฒƒ์ด๋‹ค.

// #2 - ์„œ๋น„์Šค ์›Œ์ปค์˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๊ฐ€๋กœ์ฑ„๊ธฐ ์ฝ”๋“œ ์ž‘์„ฑ
self.addEventListener('fetch', function(event) {
	event.respondWith(
		caches
			.match(event.request)
			.then(function(response) {
				if (response) {
					return response;
				}
				return fetch(event.request);
			})
			.catch(function() {
				console.log(error);
			}),
	);
});

PWA ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. Vue create๋กœ ๋งŒ๋“ค ๋•Œ PWA Support ์˜ต์…˜์œผ๋กœ ์ƒ์„ฑ
  2. ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ app์— ์ ์šฉํ•˜๋ ค๋ฉด,
    1. public ํด๋” ๋ฐ‘์˜ index.html์— link tag๋กœ manifest ์—ฐ๊ฒฐ
    2. manifest.json ์ƒ์„ฑ
    3. main.js์— service worker ๋“ฑ๋ก