React - 漸進式網路應用程式(PWA)
2024-10-07 02:00
注意
由於 create-react-app
已棄用,請到這裡來看如何使用vite來創建pwa專案。
前言
甚麼是 漸進式網路應用程式(PWA) ,簡單來說就是讓 Web 的介面變成像是原生 App 一樣,並且可以下載至主畫面,且 PWA 有兩個吸引我的地方:
- 可離線操作: 由於 PWA 會將 Web 的資料 Cache 在 Local 端,在網路受限的情況下可以繼續做使用。
- 仿原生 App: 就像上述提到的可以將 Web 變成類 App 的樣子,而且可以省去上架至 Google Play & Apple Store 的步驟和
開發者帳號的費用實現時時更新不用重新下載。
今天的文章會介紹如何讓 React 專案快速變成 PWA。
步驟 1
新專案直接使用下面代碼即可
console1npx create-react-app react-pwa --template cra-template-pwa-typescript
若是在原有的專案下新增 PWA,由於 React 目前沒有提供此機制,建議使用上面代碼創建專案後將
service-worker.ts
和 serviceWorkerRegistration.ts
兩個檔案複製到src/
下。
步驟 2
接著開啟 src/index.tsx
,輸入以下代碼
tsx1import * as serviceWorkerRegistration from "./serviceWorkerRegistration"; 2 3serviceWorkerRegistration.register();
步驟 3
開啟 public/manifest.json
輸入
json1{ 2 "short_name": "React PWA", 3 "name": "React PWA", 4 "icons": [ 5 { 6 "src": "favicon.ico", 7 "sizes": "64x64 32x32 24x24 16x16", 8 "type": "image/x-icon" 9 }, 10 { 11 "src": "logo192.png", 12 "type": "image/png", 13 "sizes": "192x192" 14 }, 15 { 16 "src": "logo512.png", 17 "type": "image/png", 18 "sizes": "512x512" 19 } 20 ], 21 "start_url": ".", 22 "display": "standalone", 23 "theme_color": "#000000", 24 "background_color": "#ffffff" 25}
步驟 4
最後打開 public/index.html
輸入
html1<meta name="viewport" content="width=device-width, initial-scale=1" /> 2<meta name="apple-mobile-web-app-capable" content="yes" /> 3<meta 4 name="apple-mobile-web-app-status-bar-style" 5 content="black-translucent" 6/>
- viewport: 告訴瀏覽器載入後寬度為設備寬且不進行縮放。
- apple-mobile-web-app-capable: 在 ios 添加到主畫面時是否全屏運行,這很重要,若是沒有設定 ios 上會沒有 pwa 效果。
- apple-mobile-web-app-status-bar-style: ios 上狀態欄的顏色,使用 black-translucent 可以讓狀態欄等於背景顏色。
使用vite創建pwa
此部分於 2024-10-29 更新
創建專案
前往這裡使用vite來新增專案。
下載套件
npm install -D vite-plugin-pwa workbox-window
設置vite
修改 /vite.config.ts
ts1import { defineConfig } from "vite"; 2import react from "@vitejs/plugin-react-swc"; 3import { VitePWA } from "vite-plugin-pwa"; 4 5export default defineConfig({ 6 plugins: [react(), VitePWA()], 7});
新增manifest
跟原步驟一樣至 public
下新增 manifest.json
新增service-worker
新增一個檔案 src/service-worker.js
js1import { precacheAndRoute } from "workbox-precaching"; 2 3precacheAndRoute(self.__WB_MANIFEST);
註冊service worker
修改 app.tsx
tsx1... 2 3useEffect(() => { 4 if ("serviceWorker" in navigator) { 5 window.addEventListener("load", () => { 6 navigator.serviceWorker 7 .register("/service-worker.js") 8 .then((registration) => { 9 console.log("SW registered: ", registration); 10 }) 11 .catch((registrationError) => { 12 console.log("SW registration failed: ", registrationError); 13 }); 14 }); 15 } 16 }, []); 17 18...
最後
完成上述步驟後 React 專案就支援 PWA 了,這裡是我做一個小作品支援 PWA 有興趣的各位可以去看看,我們下次見~