一個 PWA 的誕生

PWA(Progressive Web Apps)雖然是網頁應用,但是可以帶來媲美原生的用戶體驗,其中包含離線可用,後臺推送等功能。PWA 不是一個新名詞,早在 2015 年已經開始提出這個思想並明明,但是直到 iOS12 發佈,PWA 終於可以在 iOS 中添加到主屏,只有安卓和 iOS 都能使用 PWA 的基本功能,它纔算是真的開始走近大衆。想了解 PWA,可以看看百度的 LAVAS 官網,在國內網站中 LAVAS 官網會有比較完整的 PWA 資料。

本文可以提前讓大家熟悉 PWA 搭建,文中提到的配置來自一個 Redesign 的 nipponcolors,最近才做好的,使用的各種庫都是現在(2018.09.14)最新的,可用的,另外本文不討論應用功能,單純講講 PWA 的搭建。

倉庫地址:https://github.com/ssshooter/...
網頁地址:https://ssshooter.github.io/n...

搭建

使用 Vue-cli3

Vue-cli3 與 2 的區別挺大的,3 默認搭建工程並非像 2 一樣拉取模板,而是自己選擇需要的 feature 生成項目。

clipboard.png

要生成 PWA 項目請勾上 PWA Support

Vue-cli3 的一個關於 HMR 的已知問題

Issue 地址
假設大家都知道 HMR(熱模塊更新)是什麼了,vue-cli3 的某些版本可能會有這麼一個問題,HMR 無法使用,控制檯就一直顯示 waiting 連接,文件一改直接顯示連接斷開。解決方案有二:

  1. 如果你的依賴使用 cnpm 安裝,嘗試刪掉 node_modules 後使用 npm 下載。
  2. vue.config.js 作以下配置

    chainWebpack: config => {
        config.resolve.symlinks(true)
        return config
    },

值得注意的配置

eslint 配置

在這裏首先推薦一下尾逗號,加上尾逗號的好處只有一個,但真的十分重要,那就是 diff 會非常好看。然後 eslint-plugin-vue 插件是一些預設規則組合,分 base,essential,strongly-recommended,recommended 四級,請自由選擇,沒有最好的搭配,只要用得舒服就好,團隊合作還是非常推薦定好 eslint 規則,使用盡量詳細的同一套規則,在代碼合併時感覺會非常爽快。

clipboard.png

設置 eslint 後建議配置開發服務器的 overlay 選項,在 eslint 報錯時會覆蓋在頁面上,時刻提醒你寫代碼得有信條。

  devServer: {
    overlay: {
      warnings: true,
      errors: true,
    },
  },

資源優化

圖片

vue-cli3 搭建的工程沒有自帶圖片優化插件,所以請自行安裝。有更好的圖片壓縮插件求推薦啦,這裏使用的是 imagemin-webpack-plugin,基本配置如下:

var ImageminPlugin = require('imagemin-webpack-plugin').default
// Or if using ES2015:
// import ImageminPlugin from 'imagemin-webpack-plugin'
 
module.exports = {
  plugins: [
    // Make sure that the plugin is after any plugins that add images
    new ImageminPlugin({
      disable: process.env.NODE_ENV !== 'production', // Disable during development
      pngquant: {
        quality: '95-100'
      }
    })
  ]
}

字體

對於中文站點,字體問題可是個大問題,因爲中文字體實在太太太太大了,隨隨便便一個都 10m 了,等待這東西下載真的給用戶體驗帶來致命打擊,但是!但是!有這麼一個程序!

font-spider-plus

之前一直知道 font-spider,它的功能是獲取使用到的字體,然後分析出使用了改字體的字符,最後把字符抽離出來。這大大減少了中文字體的體積,但是缺不能用於 js 渲染的網頁,後來才找到 font-spider-plus,雖然要手動操作一下(最簡單的方法:發佈網頁之後用 fsp 把用到的字爬出來),但是得到的優化真的很大哦!

響應式設計

PWA 給了我們一個很簡單的跨平臺方法,不只有移動端可以添加到首屏,PC 端也同樣可以,所以響應式設計對 PWA 可以說是必須的。
PC 端的添加方法在 F12 裏,至於更加方便的方法...好像是要改 flag 才能用,那麼也談不上多方便了,所以不介紹了,等到此項技術更加成熟,想必這個按鈕就會出現在顯眼的位置 😂

clipboard.png

PWA 專屬問題

建議使用 LightHouse 給你的 PWA 評分,報告中還會帶有修改建議,十分實用。

clipboard.png

manifest.json

PWA 添加至桌面的功能實現依賴於 manifest.json。這個文件結構很簡單,填寫對應字段即可,可在這裏瞭解詳情。

Service Worker 刷新

針對 PWA 功能來說,項目成功生成就已經配置好離線緩存功能,對 Service Worker 不熟悉的同學來說可以說很方便了。但是對於推送功能和 Service Worker 的更多細節仍然需要深入研究才能流暢使用這個新興玩意。
(以下稱 Service Worker 爲 SW)
有一個問題特別值得注意,那就是 SW 的更新問題。SW 控制項目環境的緩存,但是 SW 更新後怎麼刷新緩存就不那麼容易理解了。SW 更新後,會進入 waiting 狀態,舊的 SW 依舊正常運行,所以新的 SW 無法激活,你需要關閉整個瀏覽器才能把舊的 SW 關閉,再次打開網頁就能看到新的 SW 運作了。
有一個方便一點的方法,配置

    workboxOptions: {
      skipWaiting: true,
      clientsClaim: true,
    },

之後,第一個選項如其字面意思,會跳過 Waiting 狀態,而 clientsClaim 可以讓 SW 進入 activated 狀態後立即控制頁面(但是實際上,SW 即使立刻控制頁面並輸出新數據,SPA 也要刷新才能渲染爲最新版本,但這也總比關閉瀏覽器好多了)。
詳細原理請查閱谷歌官方資料(需要梯子)。

最後,給你一個佛系刷新方法

Service Worker 的特殊之處除了由瀏覽器觸發更新之外,還應用了特殊的緩存策略: 如果該文件已 24 小時沒有更新,當 Update 觸發時會強制更新。這意味着最壞情況下 Service Worker 會每天更新一次。

Preload

clipboard.png

這個是 Lighthouse 提醒我的。對於一些必要的資源,可以使用 Preload 預先下載(特別是字體或圖片等資源),不必等使用時再下載,這又將會是幾百毫秒的等待。更多信息可以參考 vue-cli 官網相關頁面:https://cli.vuejs.org/zh/guid...

最後

完整配置地址
https://github.com/ssshooter/...
https://github.com/ssshooter/...
這是一個最最簡單的 PWA,沒有對 SW 進行深度配置,很多功能沒有用上。Vue-cli3 搭建的項目使用 workbox-webpack-plugin,SW 默認是自己生成的,需要自己附加 SW 功能可以使用 InjectManifest 插件。最後提一下 Lavas App,可以把你的 PWA 包裝成一個 apk,本質是快捷方式,方便了還沒支持 PWA 的安卓系統。

如果有其他問題,可以在評論區討論~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章