Vite를 이용하여 React, TypeScript 환경을 세팅하고, PWA(Progressive Web Application)를 만드는 방법을 알아보자.
그리고 완성된 PWA를 AWS Amplify 서비스를 이용하여 배포한다.
$ yarn create vite
react
선택vite-project
로 설정함yarn create v1.22.17
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Installed "create-vite@2.9.4" with binaries:
- create-vite
- cva
√ Project name: ... vite-project
? Select a framework: » - Use arrow-keys. Return to submit.
vanilla
vue
> react
preact
lit
svelte
react-ts
선택success Installed "create-vite@2.9.4" with binaries:
- create-vite
- cva
√ Project name: ... vite-project
√ Select a framework: » react
? Select a variant: » - Use arrow-keys. Return to submit.
react
> react-ts
success Installed "create-vite@2.9.4" with binaries:
- create-vite
- cva
√ Project name: ... vite-project
√ Select a framework: » react
√ Select a variant: » react-ts
Scaffolding project in C:\Programming\test\vite-project...
Done. Now run:
cd vite-project
yarn
yarn dev
Done in 69.85s.
$ cd vite-project
$ yarn
localhost:3000
으로 이동하면 프로젝트가 정상적으로 실행되는 것을 확인할 수 있다.$ yarn dev
스마트폰에서 보여줄 아이콘을 준비한다.
public
디렉토리 내에 icons
디렉토리를 만들어서 이곳에 저장하였다.public 디렉토리에 manifest.json
파일 생성 후, 아래와 같이 앱 정보 작성한다.
icons
는 위에서 추가한 아이콘 정보를 적는다.// manifest.json
{
"name": "MyProgressiveWebApp",
"short_name": "MyPWA",
"start_url": "",
"display": "standalone",
"background_color": "#F8F7DA",
"theme_color": "#8C383A",
"description": "PWA with Vite.js, React.js and TypeScript",
"icons": [
{
"src": "icons/favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "icons/favicon-196x196.png",
"type": "image/png",
"sizes": "196x196"
},
{
"src": "icons/logo-512x512.png",
"type": "image/png",
"sizes": "512x512"
},
{
"src": "icons/logo-512x512.png",
"type": "image/png",
"sizes": "512x512",
"purpose": "any maskable"
}
]
}
sw.js
파일 생성 후, 아래와 같이 Service Worker
설정 코드 작성한다.// sw.js
// install event
self.addEventListener("install", (e) => {
console.log("[Service Worker] installed");
});
// activate event
self.addEventListener("activate", (e) => {
console.log("[Service Worker] actived", e);
});
// fetch event
self.addEventListener("fetch", (e) => {
console.log("[Service Worker] fetched resource " + e.request.url);
});
만들고자 하는 PWA의 기능에 따라
sw.js
에 코드를 추가하자
ex) 캐시 저장, 오프라인에서 앱 사용
index.html
파일 내부에 메타 정보와 sw.js
를 불러오는 스크립트 추가한다<!-- index.html -->
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="theme-color" content="#8C383A" />
<link rel="icon" href="icons/favicon-196x196.png" type="image/png" />
<link rel="alternate icon" href="/favicon.ico" type="ico" sizes="16x16" />
<link rel="apple-touch-icon" href="icons/apple-touch-icon-152x152.png" sizes="180x180" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="manifest" href="/manifest.json" />
<title>Vite Typescript React PWA</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
<script>
if ("serviceWorker" in navigator) {
// Register a service worker hosted at the root of the
// site using the default scope.
navigator.serviceWorker
.register("/sw.js")
.then((registration) => {
console.log("Service worker registration succeeded:", registration);
})
.catch((err) => {
console.log("Service worker registration failed:", error);
});
} else {
console.log("Service workers are not supported.");
}
</script>
</body>
</html>
현재까지의 디렉토리 구조는 다음과 같다
이제 PWA가 제대로 동작하는지 확인해보자
localhost:3000
으로 이동한다. baseDirectory
항목을 dist
로 수정한다.남은 단계들을 다 진행하고, 아래가 모두 진행될 때까지 기다린다.
다음과 같이 에러 없이 다 진행되면 성공이다. 이제 생성된 url로 들어가면 어느 기기에서든 우리의 앱을 이용할 수 있다. 스마트폰에 바로가기를 만들어서 PWA로 사용해보자