: 네이티브 + 모바일웹앱 + 하이브리드
네이티브 앱과 똑같은 사용자 경험을 제공하는 것이 궁극적 목표임
pwa 개념
https://developer.mozilla.org/ko/docs/Web/Progressive_web_apps/Tutorials/js13kGames
https://yozm.wishket.com/magazine/detail/1969/



오프라인을 체크해도(인터넷에 연결되어 있지 않습니다)

(ㅎㅇ)
공룡이 뜨지 않고 뭐가 존재하긴하는 이유? => 캐시가 남아있어서!


앱의 완성도를 퍼센트로 측정하여 나타내는 대략적인 지표(퍼포먼스, seo 등)




pwa를 이해하려면 앱 매니페스트와 서비스워커, HTTPS 프로토콜을 꼭 알아야한당

sw.js
pwa의 핵심!
웹 브라우저 안에 있지만 분리되어 항상 실행되는 백그라운드 프로그램

보안 안정성을 위함!
(ts도 지원한다함)
npx create-react-app [프로젝트명] --template cra-template-pwa
갑자기 헷갈려서 찾아본 npx vs. npm
npx : 모듈을 로컬에 저장하지 않고, 매번 최신 버전의 파일만을 임시로 불러와 실행 시킨 후에, 다시 그 파일은 없어지는 방식(링크)
만약 설치시 web-vitals 에러가 뜨면
npm install로 web-vitals 설치해주면됨
icons 같은게 잘 있나~



serviceWorkerRegistration.register();
1) public/index.html
<script>
navigator.serviceWorker.register('sw.js')
.then(res=>{
console.log('서비스워커 등록 완료!!!')
})
</script>
2) public/sw.js
// sw.js
// 처음에 한번만 install함
self.addEventListener('install', ()=>{
console.log('서비스워커 설치!')
})

pwa의 여권!!!
mainfest.json에 앱 소개 정보와 기본 설정이 있음
name, color, icons ...


"display": "standalone",
휴대폰 디바이스의 상태표시줄, 하단 메뉴바를 보이게할지말지 선택
browser, standalone, fullscreen, minimul-ui

2) manifast 수정
"icons": [
{
"src": "icons/favicon.ico",
"sizes": "16x16",
"type": "favicon/ico",
"form_factor": "wide"
},
...
3) 확인!

4) 에러 조지기

"screenshots": [
{
"src": "icons/nongdam.jpg",
"type": "image/jpg",
"sizes": "2048x1372",
"form_factor": "narrow"
},
{
"src": "icons/nongdam.jpg",
"type": "image/jpg",
"sizes": "2048x1372",
"form_factor": "wide"
}
],

"icons": [
{
"src": "./icons/favicon-16x16.png",
"sizes": "16x16",
"type": "image/png"
},
// sw.js
self.addEventListener('install', (a) => {
console.log('서비스워커 설치 완료')
})
self.addEventListener('activate', (a) => {
console.log('서비스워커 동작 시작')
})
self.addEventListener('fetch', (a) => {
console.log('데이터 요청시 처리')
})

src/App.js 데이터 전송
navigator.serviceWorker.controller.postMessage({
message: "Hello, service worker ~~~"
})
public/sw.js 데이터 받기
self.addEventListener('message', (e) => {
console.log('메시지', e.data);
self.registration.showNotification('title', {
body: e.data.message
});
})

src/App.jsNotification.requestPermission().then();


알림 허가해주면, 하단에 쨔쟌

index.html에서 서비스워커 등록한거 return으로 막고
src/service-worker.js에 작성한 알림 테스트 붙여넣기

버튼 클릭 이벤트로 바꿔본당
function msg() {
navigator.serviceWorker.controller.postMessage({
message: "Hello, service worker ~~~"
})
}
return(
...
<button onClick={msg}>알림메시지</button>
...
)