λ°κ²¬λ λ΄μ© μ€λ₯ μ¬νλ€μ μ 리ν λ§ν¬μ λλ€. νμ€νκ² κ²ν νμ§ λͺ»ν μ λλ¨ν μ£μ‘ν©λλ€ π₯
- [8μ₯] λ°±κ·ΈλΌμ΄λ λκΈ°ν return λλ½, νμΈνκΈ°
κΈ°λ³Έμ μΌλ‘ ꡬνλμ΄μλ μ£Όμ κΈ°λ₯μ λλ€.
- κ²μλ¬Ό μ‘°ν
- κ²μλ¬Ό μμ±
- κ²μλ¬Ό μμ
- κ²μλ¬Ό μ’μμ νμ
μ€μ΅μ μ§ννλ©° ꡬνν΄λκ° μ£Όμ κΈ°λ₯μ λλ€.
- μ€μΉ κ°λ₯ν Paper
- μ€νλΌμΈ μ§μ
- μ€νλΌμΈ κ²μλ¬Ό μ‘°ν
- μ€νλΌμΈ κ²μλ¬Ό μμ±
- μ€νλΌμΈ κ²μλ¬Ό μμ
- μ€νλΌμΈ μ’μμ νμ
- λ°±κ·ΈλΌμ΄λ λκΈ°ν
- μ€νλΌμΈ μνμμ μνν μμ λκΈ°ν
- μ’μμ νΈμ μλ¦Ό
- μ΄ μΈμ λ€μν λΆκ° κΈ°λ₯
κ° μ±ν°λ³ ꡬνλ μ½λμ
λλ€.
μ€μ΅ μ§ν μ μ°Έκ³ νκ±°λ, λΉ λ₯΄κ² μ§ννκΈ° μν΄ μ 곡ν©λλ€.
- μ±ν° 1 - μμνκΈ°
- μ±ν° 2 - μ€μ΅μ μν κ°λ°νκ²½ μ€λΉνκΈ°
- μ±ν° 3 - νλ‘κ·Έλ μλΈ μΉ μ±μ΄ λκΈ° μν μ€λΉ
- μ±ν° 4 - PWAμ ν΅μ¬, μλΉμ€ μ컀
- μ±ν° 5 - μ€νλΌμΈμ μν μΊμ μ€ν λ¦¬μ§ API
- μ±ν° 6 - IndexedDB μ¬μ©νκΈ°
- μ±ν° 7 - μΉ μ± λ§€λνμ€νΈ (Web App Manifest)
- μ±ν° 8 - Sync, λ°±κ·ΈλΌμ΄λ λκΈ°ν
- μ±ν° 9 - μλΉμ€ μ컀μ ν΄λΌμ΄μΈνΈκ° λ©μμ§ μ£Όκ³ λ°κΈ°
- μ±ν° 10 - Push, μ¬μ©μμκ² μλ¦Ό 보λ΄κΈ°
μ£Όμ μ½λλ μλμ κ°μ΄ ꡬμ±λμ΄μμΌλ©°, μ€μ΅ μ (* κ°μ‘°)
λ μμ€μ½λμ κΈ°λ₯μ ꡬνν©λλ€.
.
βββ (* app.js) : Paper μλ² λ©μΈ μ½λ
βββ config
βΒ Β βββ (* default.json) : Paper μλ² μ€μ νμΌ
βββ package.json
βββ (* push.js) : Paper νΈμ μλ¦Ό μ μ‘ λͺ¨λ
βββ sample
βΒ Β βββ (* IndexedDB.html) : IndexedDB κΈ°μ΄ μ€μ΅ νμΌ
βββ server
βΒ Β βββ Paper μλ² μ½λ
βββ upload : κ²μλ¬Ό μ΄λ―Έμ§ μ μ₯ κ²½λ‘
βββ workspace
βββ css
βΒ Β βββ CSS νμΌ
βββ fonts
βΒ Β βββ μΉ ν°νΈ νμΌ
βββ icons
βΒ Β βββ Paper μμ΄μ½ (μ± μμ΄μ½, νΈμ μμ΄μ½, λ±μ§ λ±)
βββ images
βΒ Β βββ Paper UI μ΄λ―Έμ§
βββ js
βΒ Β βββ app.js : Paper κΈ°λ³Έ κΈ°λ₯ ꡬν μ½λ
βΒ Β βββ axios.min.js : axios λΌμ΄λΈλ¬λ¦¬
βΒ Β βββ (* common.js) : Paper κ³΅ν΅ μ½λ (λ©μΈ/λ‘κ·ΈμΈ)
βΒ Β βββ (* index.js) : Paper λ©μΈ νμ΄μ§ μ½λ
βΒ Β βββ login.js : Paper λ‘κ·ΈμΈ νμ΄μ§ μ½λ
βΒ Β βββ (* paper-store.js) : Paper IndexedDB κΈ°λ₯ μ½λ
βΒ Β βββ polyfill.min.js : ES6 νλ‘λ―Έμ€ ν΄λ¦¬ν
βΒ Β βββ util.js : Paper μ νΈ μ½λ
βββ (* index.html) : Paper λ©μΈ νμ΄μ§
βββ login.html : Paper λ‘κ·ΈμΈ νμ΄μ§
βββ (* manifest.json) : μΉ μ± λ§€λνμ€νΈ
βββ (* service-worker.js) : μλΉμ€ μ컀
βββ splash
βββ iOS/iPad μ€νλμ μ΄λ―Έμ§
μ€μ΅ μ€ μ§μ μμ±ν΄μΌνλ λ¨μν νμ΄ν μμ μ μ΅μνν μ μλλ‘ μ½λ μ‘°κ°μ μ 곡ν©λλ€.
- μ€νλΌμΈμ μν μΊμ μ€ν 리μ§
const IMMUTABLE_APPSHELL = [
'/favicon.ico',
'/favicon-16x16.png',
'/favicon-32x32.png',
'/manifest.json',
'/images/no_image.png',
'/images/add_photo.svg',
'/images/clear.svg',
'/images/delete.svg',
'/images/favorite_active.svg',
'/images/favorite.svg',
'/images/menu.svg',
'/images/notification.svg',
'/images/notification_disabled.svg',
'/images/notification_enabled.svg'
];
const MUTABLE_APPSHELL = [
'/',
'/login',
'/js/app.js',
'/js/util.js',
'/js/common.js',
'/js/axios.min.js',
'/js/index.js',
'/js/login.js',
'/js/paper-store.js',
'/css/index.css',
'/css/login.css'
];
- μΉ μ± λ§€λνμ€νΈ (Web App Menifest)
{
"name": "",
"short_name": "",
"icons": [
{
"src": "",
"sizes": "",
"type": ""
}
],
"theme_color": "",
"background_color": "",
"orientation": "",
"display": "",
"start_url": ""
}
<!-- Web App Manifest μΆκ° -->
<link rel="manifest" href="/manifest.json">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-title" content="Paper">
<link rel="apple-touch-icon" href="/icons/apple-touch-icon.png">
<meta name="theme-color" content="#ffffff">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<!-- iOS/iPadOS μ€νλμ μ΄λ―Έμ§ -->
<link
rel="apple-touch-startup-image"
media="screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
href="/splash/icon_828x1792.png"
/>
<link
rel="apple-touch-startup-image"
media="screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
href="/splash/icon_1242x2688.png"
/>
<link
rel="apple-touch-startup-image"
media="screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
href="/splash/icon_1125x2436.png"
/>
<link
rel="apple-touch-startup-image"
media="screen and (device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
href="/splash/icon_1242x2208.png"
/>
<link
rel="apple-touch-startup-image"
media="screen and (device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
href="/splash/icon_750x1334.png"
/>
<link
rel="apple-touch-startup-image"
media="screen and (device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
href="/splash/icon_2048x2732.png"
/>
<link
rel="apple-touch-startup-image"
media="screen and (device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
href="/splash/icon_1668x2224.png"
/>
<link
rel="apple-touch-startup-image"
media="screen and (device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
href="/splash/icon_640x1136.png"
/>
<link
rel="apple-touch-startup-image"
media="screen and (device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
href="/splash/icon_1668x2388.png"
/>
<link
rel="apple-touch-startup-image"
media="screen and (device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
href="/splash/icon_1536x2048.png"
/>
# SCSS νμΌ μμ μ κ°μ§νμ¬ CSSλ‘ μ¦μ λ³ν
npm run sass
# SCSS νμΌ λΉλνμ¬ CSS νμΌλ‘ λ³ν
npm run build-style
node-sass
λͺ¨λ μ€μΉ νμ (package.json μ°Έκ³ )
- App Icon: import_contacts icon edited by
Geunhyeok LEE
- Icon images: Material icons
- Sample images: Pexels - CC0 Images
- cat_1.jpg
- cat_2.jpg
- puppy.jpg