Magren

Magren

Idealist & Garbage maker 🛸
twitter
jike

將博客變成PWA

我是少數派的一個讀者,成為少數派已經 419 天

從少數派裡面學到了很多東西,也豐富了自己的眼界,所以少數派 APP 也是我手機上的常用應用之一,在去年將手機換成了 Android 後,發現到現在為止 Android 的 APP 已經很久沒有更新過了,Android 客戶端一直處於一個 “年久失修” 的狀態,反倒是 IOS 的一直在更新迭代,更新了 UI 以及一些新的功能,這讓我十分眼紅。

但是在少數派 3 月 31 號發布的文章中,他們為 Android 客戶端做出了一個解釋,並且提出了一個更優解

繼去年少數派網站改版升級後,更符合新版設計的少數派 iOS 客戶端 2.0 也在不久前正式上線。可惜由於開發能力實在有限,Android 平台繁雜的機型適配和兼容性問題也著實令人頭疼,少數派的 Android 客戶端此前一直處於「年久失修」的狀態。

好在少數派最終為 Android 客戶端找到了個「更優解」—— 漸進式網頁應用(以下簡稱 PWA)。在保證內容呈現完整的前提下,PWA 有著比客戶端應用更輕量、比網頁版功能更強大的全新體驗,同時還能兼容 Android、iOS 甚至 Windows 等多個平台。

關於 PWA 這個概念我是第一次知道,抱著新奇的態度開始 Google……

關於 PWA#

PWA 是 Google 於 2016 年提出的概念,於 2017 年正式落地,於 2018 年迎來重大突破,全球頂級的瀏覽器廠商,Google、Microsoft、Apple 已經全數宣布支持 PWA 技術。

PWA 全稱為 Progressive Web App,中文譯為漸進式 Web APP,其目的是通過各種 Web 技術實現與原生 App 相近的用戶體驗。

縱觀現有 Web 應用與原生應用的對比差距,如離線緩存、沉浸式體驗等等,可以通過已經實現的 Web 技術去彌補這些差距,最終達到與原生應用相近的用戶體驗效果。

好吧說完上面的官方發言,地道一點說下我自己的體驗,就是一個 Web 頁面拿掉了瀏覽器的殼子,以一個近似 app 的形式存在手機桌面,與一般的將網頁添加到桌面不同,它還有本地通知的能力以及一個緩存的能力,除此以外它可以兼容 Android、IOS 以及 Windows 多個平台,對我來說它在打開的時候還有一個頁面 logo 閃屏,很有吸引力。

將自己的博客變成 PWA#

在體驗過少數派的 PWA後,我萌生了能否把自己的博客變成 PWA 的想法,在網上查詢了資料後發現入門意外的簡單,接下來說說我自己的操作。

添加 manifest.json#

這裡新建一個 manifest.json 文件,主要是配置應用圖標以及名稱等信息,然後這裡分享下我的配置,具體的配置介紹可以參考下MDN

{
    "dir": "ltr", //指定名稱、短名稱和描述成員的主文本方向
    "lang": "zh-cn", //語言
    "name": "Magren's Blog", //名字
    "short_name": "Magren's Blog", //短名稱
    "theme_color": "##ffffff", //主題顏色
    "background_color": "##d4d4d4", //啟動時閃屏的背景顏色
    "display": "standalone", //定義開發人員對Web應用程序的首選顯示模式。
    "start_url": "./index.html", //開始加載的url
    "icons": [ //程序圖標
      {
        "src": "avatar152.png",
        "sizes": "152x152",
        "type": "image/png"
      },
      {
        "src": "avatar192.png",
        "sizes": "192x192",
        "type": "image/png"
      },
      {
        "src": "avatar384.png",
        "sizes": "384x384",
        "type": "image/png"
      },
      {
        "src": "avatar512.png",
        "sizes": "512x512",
        "type": "image/png"
      }
    ],
    "splash_pages": null
  }

接著就要在我們的 HTML 文件中引入啦,如果你也是博客的話就去翻翻你的主題文件夾,在裡面找下吧。

<link rel="manifest" href="manifest.json" /> 

添加 Service Worker#

這個 API 是用來實現頁面緩存和離線,還有後台通知,不過因為這就是我的一個個人博客,所以我沒有加上通知的功能。

首先判斷瀏覽器是否支持 serviceWorker,如果支持則調用函數來註冊站點的 service worker,service worker 只是個駐留在我們的 app 內的個 JavaScript 文件。

在 html 的頁面下加上:

    <script>
        if ('serviceWorker' in navigator) {
            window.addEventListener('load', function () {
                navigator.serviceWorker.register('/sw.js', {scope: '/'})
                    .then(function (registration) {
                        // 註冊成功
                        console.log('ServiceWorker registration successful');
                    })
                    .catch(function (err) {
                        // 註冊失敗:(
                        console.log('ServiceWorker registration failed');
                    });
            });
        }
    </script>

接著是 sw.js,即我們的 serviceWorker,這裡可以定義需要緩存的路徑,以及需要緩存的靜態文件的列表,這個列表也可以通過 Webpack 插件生成,我這裡就只緩存了首頁。

//監聽service worker事件
self.addEventListener('install', function (event) {
    var homePage = new Request('index.html');
    event.waitUntil(
        //請求首頁並將首頁存入緩存
        fetch(homePage).then(function (response) {
            //建立cache-homePage緩存
            return caches.open('cache-homePage').then(function (cache) {
                return cache.put(homePage, response);
            });
        }));
});

//請求頁面
self.addEventListener('fetch', function (event) {
    event.respondWith(
        fetch(event.request).catch(function (error) {
            //請求失敗,從緩存中讀取緩存的頁面
            return caches.open('cache-homePage').then(function (cache) {
                return cache.match('index.html');
            });
        }));
});

//刷新首頁
self.addEventListener('refreshHomePage', function (response) {
    return caches.open('cache-homePage').then(function (cache) {
        //將刷新後的頁面緩存
        return cache.put(offlinePage, response);
    });
});

最後#

最後說說如何使用 pwa 吧,在手機上,只需通過支持的瀏覽器(如 Chrome 以及小米自帶的瀏覽器)訪問 PWA 頁面地址,Chrome 會在加載完頁面後彈出添加頁面的提示,如果沒有的話(如 IOS 的 Safari),需要手動點擊瀏覽器的更多,然後直接添加到桌面上即可。

PC 端的話 Chrome 的右上角(網頁鏈接的最右端)有一個下載按鈕,點擊後就會添加到電腦桌面。如果要卸載的話只是刪除電腦桌面的快捷方式是不可以的,需要打開來然後在 PWA 頁面的上方點擊卸載按鈕。
blog1.png
blog2.png

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。