기존 전통의 website처럼 copyright이 포함된 큰 푸터, 큰 헤더를 모두 제거하여 앱친화적으로 보이도록 하기
오프라인 기능 등등 PWA로 가능한 기능들을 자주 시도해보기
왜 PWA를 통해 빌드해야할까요?
소프트웨어 개발에 여러 방법이 있고, 유감스럽게도 PWA만이 은화살(절대적 최고의방법을 의미하는듯..?)은 아닐것이다. 특정 사용에 따라 PWA의 장단점을 고려해야 함
이러한 선택 과정에서 PWA는 하나의 코드베이스만으로 여러 디바이스를 지원할 수 있다, 웹기능을 통해 구성할 수 있다(css를 사용하여 여러 디바이스 크기에 맞는 디자인), 앱처럼 아이콘을 갖고 설치될 수 있는점 등등..의 이점으로 충분히 흥미로운 선택이 될 것
CH2 Building PWAs with Developer Tools
Service Workers의 기본
이전 챕터에서 깊이 이야기했으니 간단히
Service workers는 우리의 PWA 앱에서의 네트워크 요청을 가로챌 수 있는 프록시 레이어이다.
Service workers는 우리의 앱에서 별도로 분리된 환경에 비동기적으로 작동된다.
Service workers는 네트워크가 유효하지 않을 때 요청에 대한 행동을 정의할 수 있다. 오프라인 상태에서도 앱이 기능될 수 있도록
Service Workers와 개발한다는 것은?
고유한 Js 파일로 작성됩니다(ex/ sw.js)
파일의 위치는 작업영역 하위라면 어디든 상관없다
Service Worker를 등록하는 코드가 필요하다.

Service workers는 이벤트 중심이고, 이벤트 리스너를 통해 함수를 실행시킨다


Service workers에는 두개의 생명주기가 존재한다.
Install: 최초에 service workers가 설치될 때 실행된다. 이 때 셋업, pre-caching과 같은 핸들러가 추가되기 좋다.
Activate: Install 이후 준비가 완료되어 기능될 수 있는 상태.
Fetch Event가 존재하고, 핸들러를 할당해줄 수 있는데, 이 이벤트는 PWA 애플리케이션이 소스를 받기 위해 네트워크 요청이 전달되었을 때 실행되며 해당 요청에 대해 커스텀할 수 있다.(아마 이때 인터셉팅하여 응답을 내려주고 하는게 아닐까.. 싶은)
따라가보면 Service worker가 최초 생성될 때, install, active 두개의 생명주기가 돌며 생성이 됨.
이후 동적인 네트워크 요청 포함 실행된다면 fetch 핸들러가 작동됨.
두번째 진입부터는 service worker가 등록되어있기 때문에, 자유롭게 fetch 핸들러가 작동됨
정적인 자원(html, css …)은 Install 단계에서 Event 객체를 통해 저장 가능하다는것 같음.

Service Workers를 사용하여 캐싱과 패칭해오기
Fetch 이벤트를 통해 받아온 소스들에 대한 다양한 캐싱 전략들이 있고 각각 장단점이 존재한다.
질문) 어떻게 자산들이 항상 사용 이용할 수 있는 상태임을 알 수 있나요?
precaching (cache.addAll?)은 우리가 이전의 자원들이 필요할 때(네트워크가 불완전한 상태 등등)를 위해 캐싱하고있는다. event.withUntil은 내부의 비동기로직을 기다려줌. 이벤트 핸들러 내부에서 동기적으로 작동되도록 함(이벤트 핸들러에 대한 await 인가봄)

기본 캐시 전략 === 그냥 캐시된게 있으면 그거 주세요.
요청에 대한 유효한 캐시값이 조회하여 존재한다면, 캐시된 값을 응답으로 내려주고 그렇지 않으면 네트워크 요청을 진행시킨다. 전반적으로 정적 자원에 대해서는 기본캐시전략도 많이 좋을듯.


조금 심화된 캐시 전략 === 오래된 캐시에 대한 재검증
캐시가 존재하는지 체크하고, 캐시값을 service worker단에서 갱신한다.
나머지는 위와 동일함

그냥 캐시되어있는거 주는 대신, 기다리지 않는 요청을 보내서 갱신만 하는듯

Service Workers가 캐시를 넘어서 무엇을 할 수 있을까
가장 대표적인 push notification, 주기적인 데이터 패칭(매일 뉴스 갱신)… 등등 native app의 경험을 줄 수 있는점
Push notification / 이게 웹, 안드로이드 애플리케이션에서의 푸시알림까지는 ok인듯 한데, 다른 글들 보니 iOS는 아직 혼자서는 불가능하고 APNs를 함께 써야 iOS 앱푸시가 가능하다는것 같음.


CH3 PWA Advanced capabilities
PWA 개발 도구 소개
질문) PWA 왜 만들었어요?
웹과 native App의 좋은 기능, 경험들을 결합한 하나의 도구를 만들고자 했다.
PWA 시작해보기
그냥 PWA starter에 대한 이야기..
PWA에 대해 첫 시작이라면 Vscode 기준 PWABUILDER STUDIO extension 도구를 통해 도움받을 수 있다.
문제가 없다면, store 배포를 위한 패키징을 요청할 수 있음. 각 디바이스 별(window, android, iOS …) 패키지를 생성할 수 있음.
추가적인 요청사항에 대한 입력이 완료된다면, 패키지를 다운로드 받을 수 있음.
생성된 패키지 내부에는, install 파일이 존재하는데 해당 파일을 실행시켜 생성된 PWA를 개발환경에서 테스트해볼 수 있음.
생성된 패키지를 원하는 store에 배포하면 끝!
CH4 PWA Native Integrations in Depth (PWA와 Native 기능에 대한 심층적 통합)
PWA 에서 더 나은 UX
앱 관리
Edge://apps 로 이동하면 현재 설치되어있는 모든 PWA 애플리케이션들을 리스트로 볼 수 있음.(구글은 뭘까)
OS Theming
다크모드 등 지원 가능. 현재의 브라우저 테마와 동기화시킬 수 있음
Window controls overlay
Window contorller가 있는 title bar를 제거가능
크로미움105 이상
사용자의 OS 기반의 더 많은 통합(그냥 더 많은 기능을 의미하는것 같기도)
Run on os login
내 컴퓨터가 활성화 / 로그인 되었을 때 설치된 앱 자동 실행
Shortcuts
태스크바, 바탕화면 등의 아이콘으로 등록하여 바로 실행시킬 수 있음
File system access
플랫폼의 파일시스템에 접근할 수 있음
Protocol handling
Manifest 설정을 통해 나만의 규칙을 정의하고 사용할 수 있다는것 같음
Link handling
Manifest start_url 항목을 통해 다른 사람에게 해당 PWA 애플리케이션을 실행시킬 수 있도록 url을 줄 수 있음
File handling
특정 파일이 깔렸을 때, 해당 파일을 실행시킬 앱으로 PWA를 등록할 수 있다는것 같음. 파워포인트 파일을 클릭했을 때, 파워포인트 소프트웨어가 실행되는것처럼, 만약 .test라는 확장자의 파일이 클릭되어 실행되거나, 깔렸을 때 manifest에 .test 확장자의 파일을 수용하도록 해두면 해당 PWA 앱이 실행되는 그런걸까..?
Web share
애플리케이션과 공유할 수 있음
설명하는것 듣다보니, 약간 그런것 같음. 앱에서 어떤 메시지를 작성하고 카카오톡 공유하기 gMail 공유하기처럼 공유할수 있는 앱들을 쭈루룩 나열해주고 사용자가 선택해서 공유
Web share target
Web share처럼 다른 앱과 공유하는것은 동일하나, Web Share는 나열된 앱 중 사용자가 하나를 선택하는것이라면, 얘는 PWA가 고정시킨 앱에만 공유하는 것