web.dev의 Learn PWA에 있는 일부 아티클들을 읽으면서, PWA로 할 수 있는 것들을 정리해보았습니다.
다양한 체크리스트나 조건들이 있지만, 특징적이라고 생각되는 것만 정리해보면 다음과 같다고 볼 수 있다.
- 웹 페이지를 앱 형태로 설치할 수 있음
- 스토어에 출시도 가능함
- 오프라인에서 동작 가능함
오프라인
에서도 동작함
다양한 API가 제공되고, PWA의 대부분의 기능들을 여기서 함
메인 JS 실행부와 다른 자기 쓰레드
를 가짐
적용되는 스코프는 자신이 속한 폴더와 모든 하위 폴더
자기 스코프 안에서 발생한 network request를 모두 받아서 어떻게 처리할지 결정할 수 있음
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/serviceworker.js")
}
fetch
event는, service worker에서 자신의 스코프 안에서 발생한 network request를 받게 해준다.
// serviceworker.js
self.addEventListener("fetch", (event) => {
console.log(`URL requested: ${event.request.url}`)
})
이걸로 조건문으로 나누어서 경우에 따라 어떻게 처리할지 결정하면 되는듯하다.
응답도 해보자.
// serviceworker.js
self.addEventListener("fetch", event => {
const response = .... // a response or a Promise of response
event.respondWith(response);
});
respondWith
로 넘겨줄 수 있는데, 반드시 Response
객체를 줘야 한다고 한다.
웹에서 쓸 수 있는 storage들은 다음과 같다고 한다 :
localStorage
, sessionStorage
등IndexedDB
APICache Storage
APIservice worker에서 사용하면, 빠르게 그리고 오프라인에서도 사용할 수 있다.
IndexedDB
는 주로 객체를 저장하는 데에 쓰고,Cache Storage
는 주로 파일들을 저장하는 데에 쓰는 듯하다.
html, css, js, 이미지 등을 Cache Storage에 저장해둘 수 있다.
// serviceworker.js
caches.open("pwa-assets").then((cache) => {
cache.add("styles.css") // it stores only one resource
cache.addAll(["styles.css", "app.js"]) // it stores two resources
})
// serviceworker.js
self.addEventListener("fetch", (event) => {
event.respondWith(caches.match(event.request))
})
Cache Storage에는 HTTP request와 response를 캐싱해둘 수 있다.
request를 그대로 넘겨줘서 캐싱해놓은 걸 찾고 돌려주고 있다.
캐싱
을 통해 파일이나 데이터를 저장해두면 오프라인에서 사용 가능하다.
네트워크
를 통해 가져오면 온라인에서만 가능하지만 최신 정보로 업데이트 할 수 있다.
이를 기반으로, 앱에서 network request가 왔을 때 어떻게 처리할 수 있을지 전략을 만들어보면 다음과 같다고 할 수 있다 :
Service Worker나 Cache Storage 같은 로우 레벨 API들을 한 단계 묶은 라이브러리 중에 유명한 게 구글 크롬 팀이 만든 Workbox
라는 라이브러리라고 한다.
이 라이브러리는 여러 패키지로 이루어져있는데, 그 중 workbox-strategies
라는 패키지가 위 캐싱 전략들에 대응되는 메서드를 제공한다.
import { registerRoute } from "workbox-routing"
import { StaleWhileRevalidate } from "workbox-strategies"
registerRoute(
({ url }) => url.pathname.startsWith("/images/avatars/"),
new StaleWhileRevalidate()
)
앱으로서 web content가 어떻게 보여질지 OS에게 알려주는 파일이라고 한다.
확장자 :
.webmanifest
: 오피셜 확장자app.webmanifest
.json
: JSON 타입으로도 가능하다manifest.json
처럼 사용하기도 한다고 한다.// app.webmanifest
{
"name": "My First Application"
}
Basic fields
name
short_name
icons
start_url
display
id
Recommended fields
theme_color
background_color
scope
..
PWA로 인정되면 설치가 가능해지는데, 브라우저마다 PWA로 인정하는 기준이 조금씩 다르다고 한다.
기본적으로는 safari를 제외하면, Web App Manifest 파일이 있고 몇몇 핵심 프로퍼티를 갖고 있는지를 그 기준으로 사용한다고 한다.
조건을 만족하면 설치 버튼이 자동으로 뜨는듯하다.
let deferredPrompt
window.addEventListener("beforeinstallprompt", (e) => {
e.preventDefault()
deferredPrompt = e
})
beforeinstallprompt
라는 event는 설치가 가능할 때 트리거 되는데, 그래서 설치 버튼을 커스텀으로 만들거나 하고 싶을 때 이런 식으로 사용할 수 있다고 한다.