기본적으로 nodejs 설치 및 vue 와 Vue CLI 설치 되어 있어야 한다.
nodejs 설치
https://nodejs.org/ko/download/
nodejs 설치 후
vue 설치
npm install vue
명령을 사용하여 설치한 버전 번호를 확인합니다(vue --version).
Vue CLI를 설치하려면 npm을 사용합니다. 업그레이드하려면 -g 플래그를 사용하여 전역으로 설치해야 합니다(vue upgrade --next).
1 npm install -g @vue/cli
결과물

1. cli 로 프로젝트 만들기
1) & vue create sample-pwa
2) 뷰티파이 설치
vue add vuetify
2.매니페스트 작성하기
public/manifest.json
{
"name": "사진 갤러리",
"short_name": "사진 갤러리",
"icons": [
{
"src": "./img/icons/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "./img/icons/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "./index.html",
"display": "standalone",
"orientation": "portrait",
"background_color": "#ffffff",
"theme_color": "#ffffff"
}
3. vue.config.js 에서 런타임 캐시 추가하기
런타임 캐싱
런타임 캐싱이란 웹 애플리케이션을 동작 시킬 때 발생하는 요청에 대해 서버 응답을 캐시 스토리지에 저장하는 캐싱 방법을 말합니다. 보통 이미지와 같은 리소스는 파일 용량이 커서 처음 페이지 접속할 때 서비스 워커 설치 시간이 길어지므로 런타임 캐싱으로 하는게 좋습니다.
https://joshua1988.github.io/vue-camp/pwa/workbox-caching.html#런타임-캐싱




module.exports = {
pwa: {
workboxOptions: {
runtimeCaching: [
{
urlPattern: /\.png$/,
handler: "CacheFirst",
options: {
cacheName: "png-cache",
expiration: {
maxEntries: 10, // 총 파일 10개까지 캐시
maxAgeSeconds: 60 * 60 * 24 * 365, // 1년 캐시
},
},
},
{
urlPattern: /\.json$/,
handler: "StaleWhileRevalidate",
options: {
cacheName: "json-cache",
cacheableResponse: {
statuses: [200],
},
},
},
],
},
},
transpileDependencies: ["vuetify"],
devServer: {
historyApiFallback: true,
allowedHosts: "all",
},
};
4. 앱 실행 화면 만들기
1) publi/index.html 수정
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<!-- 상태 표시줄 테마 색상을 흰색으로 변경 -->
<meta name="theme-color" content="#ffffff">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>사진 갤러리</title>
<!-- 구글 머티리얼 디자인 아이콘 추가-->
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css">
</head>
<body>
<noscript>
<strong>We're sorry but ex10 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
2)datasources/picture-data.js 파일 추가
export default {
aPictures: [{
'id': 1,
'url': 'https://farm1.staticflickr.com/654/22663129542_e3df218c90_b.jpg',
'title': '청춘플랫폼_우수부스투표',
'info': '졸업작품 전시회에 출품한 작품 중에서 방문자들이 직접 우수 전시 부스를 투표로 선정하는 모습입니다.'
},
{
'id': 2,
'url': 'https://farm1.staticflickr.com/739/22663128752_7b347e01a9_b.jpg',
'title': '전시장모습',
'info': '전시가 열렸던 예술의 전당 전시실 안의 모습입니다. '
},
{
'id': 3,
'url': 'https://farm1.staticflickr.com/674/22055529403_aeeb5fc371_b.jpg',
'title': 'pc실습실',
'info': '윈도우OS 환경에서 다양한 멀티미디어디자인 S/W를 실습하는 공간입니다.'
},
{
'id': 4,
'url': 'https://farm1.staticflickr.com/706/22650669476_d8bf33c153_b.jpg',
'title': '졸업작품전시회 주제',
'info': '청춘 플랫폼이라는 주제로 젊은 열정이 펼쳐지는 무대가 마련되었습니다.'
},
{
'id': 5,
'url': 'https://farm1.staticflickr.com/677/22055530223_91e3f73227_b.jpg',
'title': '명함디자인',
'info': '자신의 미래 모습을 담은 명함을 직접 디자인하고 인쇄 제작하여 전시한 모습입니다.'
},
{
'id': 6,
'url': 'https://farm1.staticflickr.com/777/22650669326_e180cd84ca_b.jpg',
'title': '전시_방명록',
'info': '전시장을 방문한 관객들의 다양한 소감을 방명록의 기록으로 남겨졌습니다.'
},
{
'id': 7,
'url': 'https://farm1.staticflickr.com/759/22687855771_92dc8b3245_b.jpg',
'title': '매킨토시 실습실',
'info': '맥OS 환경에서 멀티미디어디자인 관련 S/W를 사용하여 작업하기 위한 맥 실습실입니다.'
},
{
'id': 8,
'url': 'https://farm6.staticflickr.com/5646/22053918354_ee031eae46_b.jpg',
'title': '캘리그래피_디자인',
'info': '학생들이 직접 디자인한 아날로그 정서의 캘리그래피 작품입니다.'
},
{
'id': 9,
'url': 'https://farm1.staticflickr.com/762/22687856291_963df9b90a_b.jpg',
'title': '실습실복도',
'info': '전공존에 따라 색상이 그룹으로 연결된 실습실 복도 모습입니다.'
},
{
'id': 10,
'url': 'https://farm1.staticflickr.com/766/22055529593_c162dc3143_b.jpg',
'title': '인터뷰_촬영',
'info': '졸업작품을 준비한 학생들의 과정을 인터뷰의 기록으로 남기는 모습입니다. '
},
{
'id': 11,
'url': 'https://farm6.staticflickr.com/5775/22053918014_f0e0873b7c_b.jpg',
'title': '전시_메모',
'info': '관객들이 전시를 보면서 느낀 점을 간단한 메모의 글로 남긴 흔적입니다.'
},
{
'id': 12,
'url': 'https://farm6.staticflickr.com/5672/22055530083_8f633d57f3_b.jpg',
'title': '종이컵_캘리그래피',
'info': '종이컵을 캔버스 삼아 학생들의 자유로운 생각을 캘리그래피의 작품으로 제작한 종이컵 아트워크입니다.'
}
]
}
2) App.vue
<template>
<v-app>
<!-- 툴바에 제목과 버튼 삽입 -->
<v-app-bar app color="blue-grey" dark fixed>
<v-app-bar-nav-icon></v-app-bar-nav-icon>
<v-toolbar-title >사진 갤러리</v-toolbar-title>
<v-spacer></v-spacer>
<v-btn icon>
<v-icon>more_vert</v-icon>
</v-btn>
</v-app-bar>
<v-main>
<v-container>
<v-row class="mt-5">
<!-- 기기별로 그리드의 크기 설정 -->
<v-col cols="12" sm="6" md="4" lg="3" xl="2" v-for="item in this.aPictures" :key="item.key">
<!-- 카드 UI 에 사진 담아내기 -->
<v-card height="450px">
<v-img class="bg-white" height="300" :aspect-ratio="1"
:src="item.url" corver
></v-img>
<v-card-title>
<h1 class="title grey--text text--darken-3 mb-3">{{ item.title}}</h1>
<p class="body-2 grey--text">{{ item.info }}</p>
</v-card-title>
</v-card>
</v-col>
</v-row>
</v-container>
</v-main>
<!-- 바닥글 고정 -->
<v-footer fixed>
<div class="max-auto">© CODE-DESIGN.web.app</div>
</v-footer>
</v-app>
</template>
<script>
import oPictureData from "@/datasources/picture-data";
export default {
data(){
return{
'aPictures' : oPictureData.aPictures
}
},
name:'App'
}
</script>
5. 앱 실행 하기
1)만약에 서비스 워커는 생략하고 화면 표시만 테스트하고 싶다면 개발자 모드 실행한다.
npm run serve
2)서비스 워커의 동작 여부를 확인하려면
npm run build serve dist
기타 :
모바일 기기에서 로컬 사이트 테스트하기
ngrok로 테스트하기
npm i -g ngrok
vue.config.js 파일에 다음을 추가
devServer: {
historyApiFallback: true,
allowedHosts: "all",
},















댓글 ( 4)
댓글 남기기