《PWA實戰:面向下一代的Progressive Web APP》讀書筆記

前言

之前自己根據網上的教程學習寫了幾個PWA的小Demo,覺得PWA很有意思,想要更多的了解一下PWA,所以讀了這本書。這本書是MANNIN出版社出的,所以書里的代碼都有非常棒的注釋,因此這篇筆記不會展開講代碼,而是著重于描述PWA的功能以及常見的問題和解決方法。

  • 圖書資源
  • 圖書中代碼的Github倉庫

1. 什么是PWA

簡單來說,PWA是一系列新興技術的統稱,這些技術旨在增強web app的功能,使其能夠在用戶體驗上媲美原生應用。PWA的功能包括:

  • 響應性:可以適配更小的屏幕
  • 連接獨立性:因為service worker的緩存,它使網頁可以離線工作
  • 類似原生應用的交互性:使用應用程序外殼架構(app shell)來構建
  • 安全性:基于HTTPS協議
  • 可發現性:搜索引擎能夠發現它(SEO好)
  • 可安裝性:可以添加到桌面像原生應用一樣啟動(基于manifest技術)
  • 可鏈接性:可以很容易的通過URL進行分享

1.1 網站性能測試工具

  • Lighthouse
  • webpagetest

Lighthouse會生成性能測試報告,但是測試結果會受網絡質量的影響。webpagetest是真機測試,但是測試可選地點和瀏覽器是有限的,有時候還要排隊等待。但不管怎樣,這些測試工具可以輔助我們測試自己的站點,讓我們了解到自己站點現在存在的性能問題,然后著手改善,相信PWA技術會讓你的改善變得更加簡單快捷,而且效果顯著。最最重要的是,PWA是漸進增強的,不需要重寫已經存在的代碼!!

2. PWA的主要技術

2.1 Service Worker

2.1.1 service worker的功能

簡單來說,service worker可以攔截請求(fetch request),可以給出響應(response)。你可以對攔截下來的請求做處理,比如說你發現緩存中已經有了請求的資源,而且資源還在有效期內,你就可以直接從緩存中讀取資源終止請求。如果在service worker的安裝階段就緩存好了一些資源,這樣再次訪問時可以直接從緩存中加載部分資源,頁面加載速度會大幅度提升。即使是離線訪問頁面也可以給出之前緩存好的信息,極大的提升了用戶的體驗感。可以使用Google的工具庫Workbox寫service worker文件,里面提供了很多易用的API以及各種緩存策略。

2.1.2 service worker的特點

  • 基于HTTPS協議
  • 運行在自己的全局腳本上下文中
  • 不是綁定到一個特定的web頁面
  • 無法修改web頁面中的元素,無法訪問DOM
  • 每次對service worker文件進行任何更改時,它都會自動觸發service worker更新流。

2.1.3 service worker的調試

可以通過Google的開發者工具Application里面的Service Workers進行調試。

2.1.4 service worker常見問題

1) 緩存更新問題

方法1】:因為修改service worker文件會觸發service worker的更新流,所以想要更新緩存時,可以修改緩存名(cacheName),例如將helloWorld改成helloWorld-2

方法2】:Cache busting技術(作者更推薦),給文件打上版本號,例如:

<script type="text/javascript" src=“/js/main-xtvbas65.js"></script>
復制代碼

這種技術被稱為緩存總線技術,已經出現了很多年。當一個靜態文件被緩存時,它可以被存儲很長一段時間,直至到期。如果你更新了一個網站,但由于文件的緩存版本存儲在訪問者的瀏覽器中,他們可能看不到所做的更改。緩存總線通過使用唯一的文件版本標識符告訴瀏覽器文件的新版本是可用的。

2) 攔截請求時怎么忽略查詢字符串參數
caches.match(event.request, { ignoreSearch: true })
復制代碼

2.2 Manifest

2.2.1 manifest的功能

讓web app可以像原生應用一樣添加圖標到桌面,然后通過桌面圖標啟動。可配置圖標,啟動動畫等,詳細配置見文檔。

2.2.2 manifest的調試

可以通過Google的開發者工具Application里面的Manifest進行調試。

2.2.3 manifest常見問題

1) 怎么讓添加到主屏幕的橫幅顯示出來

要讓添加到主屏幕的橫幅顯示出來,必修滿足以下條件:

  • 需要 manifest.json文件。
  • 需要一個啟動的URL
  • 需要 144 x 144 的PNG圖標
  • 網站必須基于HTTPS協議,并且使用Service Worker
  • 用戶必須訪問了網站至少兩次, 每次至少有五分鐘

2.3 Push notifications

2.3.1 Push notifications的功能

即使用戶不打開瀏覽器也可以接收到消息,原生的API寫起來有一些麻煩,可以借助第三方的工具庫來寫,例如OneSignal, Aimtell等。

2.4 Synchronous data

Background sync是Google新推出的Web API,可延遲用戶行為,直到用戶網絡連接穩定。這樣有助于保證用戶想要發送的數據就是實際發送的數據。

PeriodicSync還在開發中,它可以實現定期同步。

3. 用PWA提升用戶體驗的例子

3.1 假wifi和單點故障問題

如下面的代碼所示可以設置超時時間,用Promise的race函數讓超時函數和正常的請求競跑,如果到超時時間請求還未得到相應則拋出超時錯誤,這樣可以及時讓用戶了解到出現了網絡故障。

function timeout(delay) {return new Promise(function(resolve, reject) = >{setTimeout(function() {resolve(new Response('', {status: 408,statusText: 'Request timed out.'}));},delay);});
};self.addEventListener('fetch', function(event) {if (/googleapis/.test(event.request.url)) {event.respondWith(Promise.race([timeout(3000), fetch(event.request.url)]));} else {event.respondWith(fetch(event.request));}
});
復制代碼

上面的代碼看上去有一點繁瑣,我們可以借助Google的工具庫Workbox來簡化以上代碼

importScripts('workbox-sw.prod.v1.1.0.js');
const workboxSW = new self.WorkboxSW();
workboxSW.router.registerRoute('https://fonts.googleapis.com/(.*)', workboxSW.strategies.cacheFirst({cacheName: 'googleapis',networkTimeoutSeconds: 3
}));
復制代碼

4. PWA的未來

4.1 Streaming data

Streaming data可以實現流數據的傳輸。舉個例子,如果后臺傳遞了一個很大的數據到前臺,正常情況下前臺需要接受完這個數據才能進行展示,而流數據可以一邊接受一邊展示,不需要等到整個數據都接受完再展示。

4.2 Web Bluetooth

Web Bluetooth可以在瀏覽器中連接藍牙設備并通過PWA與設備交互。例如,開發人員已經開發出可以與心率監視器交互的網絡健身應用程序和可以駕駛微型無人機的網絡應用程序。

4.3 The Web Share API

The Web Share API允許您輕松觸發原生Android共享對話框,通過URL或文本進行共享。這是一個重要的API,因為它為終端用戶提供了對數據共享方式和位置的控制。

4.4 Payment Request API

Web Payments是W3C正在開發的一種新興網絡標準,旨在簡化在線支付,并使更多的參與者能夠輕松參與網絡上的支付生態系統。標準靈活; 它們適用于各種類型的支付系統,適用于任何設備,支付方式或支付服務提供商的任何瀏覽器。這種靈活性使開發簡單性,部署一致性以及與新興支付技術的未來兼容性。

4.5 Hardware: the Shape Detection API

Shape Detection API允許開發人員訪問人臉檢測等功能,條形碼檢測,甚至是文本檢測。


結語

看完這本書,特別是PWA未來發展這一塊的內容,深深的感覺到web日新月異的發展以及逐漸強大的功能API,期待各種新功能的完善,期待可以在項目中用起來!開心到飛起,越來越堅信轉行前端的決定是正確的:)

轉載于:https://juejin.im/post/5c9d91c35188251e592be8b7

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449039.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449039.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449039.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2進制 , 8進制 , 10進制 , 16進制 , 介紹 及 相互轉換 及 快速轉換

為什么要使用進制數 數據在計算機中的表示&#xff0c;最終以二進制的形式存在 , 就是各種 <黑客帝國>電影中那些 0101010… 的數字 ; 我們操作計算機 , 實際 就是 使用 程序 和 軟件 在 計算機上 各種讀寫數據, 如果我們直接操作二進制的話 , 面對這么長的數進行思考或…

如何戰勝浮躁

浮躁是當下年輕人的通病&#xff0c;因為各種壓力或心智不夠成熟等原因&#xff0c;導致在生活工作當中經常處于一種情緒無法自如控制的狀態。這種浮躁的狀態不僅影響到正常的工作生活&#xff0c;長時間的話還會影響到身體健康。本篇就來分享一些如何戰勝浮躁的方法&#xff0…

wireshark的使用方法(轉)

https://www.cr173.com/html/20128_all.html

python腳本調用外部程序的若干種方式以及利弊

腳本執行外部程序的常用幾種方式&#xff1a; # os.popen(path)# subprocess.run(cmd,shellTrue)# subprocess.check_call(cmd,shell True)# os.system(command)# win32api.ShellExecute(0, open, path, , , 0) os.popen(path) 和 os.system(command) 這兩種執行的效果是差不多…

解決: Your ApplicationContext is unlikely to start due to a @ComponentScan of the default

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 用 springboot 搭一個小應用 報錯&#xff1a; Your ApplicationContext is unlikely to start due to a ComponentScan of the defaul…

藏經閣計劃發布一年,阿里知識引擎有哪些技術突破?

為什么80%的碼農都做不了架構師&#xff1f;>>> 阿里妹導讀&#xff1a;2018年4月阿里巴巴業務平臺事業部——知識圖譜團隊聯合清華大學、浙江大學、中科院自動化所、中科院軟件所、蘇州大學等五家機構&#xff0c;聯合發布藏經閣&#xff08;知識引擎&#xff09;…

45度做人 90度做事 180度為人 360度處事

面對社會復雜的關系和瞬時而變的人情世故&#xff0c;許多人會感嘆活得太累。其實&#xff0c;只要我們保持平和的心態&#xff0c;不去計較人生的成敗&#xff0c;始終保持一顆感恩的心&#xff0c;同樣可以活得輕松自在&#xff0c;活出人生的精彩!以度量人的處事原則&#x…

SDK 和 API 的區別是什么

SDK 就是 Software Development Kit 的縮寫&#xff0c;翻譯過來——軟件開發工具包。這是一個覆蓋面相當廣泛的名詞&#xff0c;可以這么說&#xff1a;輔助開發某一類軟件的相關文檔、范例和工具的集合都可以叫做SDK。SDK被開發出來是為了減少程序員工作量的。比如——有公司…

解決413 Request Entity Too Large

解決413 Request Entity Too Large 修改nginx配置 這是最簡單的一個做法&#xff0c;著報錯原因是nginx不允許上傳配置過大的文件&#xff0c;那么件把nginx的上傳大小配置調高就好。1、打開nginx主配置文件nginx.conf&#xff0c;一般在/usr/local/nginx/conf/nginx.conf這個位…

解決 springboot 啟動報錯 -- Cannot determine embedded database driver class for database type NONE

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 問題描述 我只是新建一個全新的 springboot 工程&#xff0c;什么都沒有寫的情況下啟動報錯如題&#xff1a; Cannot determine em…

Luogu P3731 [HAOI2017]新型城市化

題目顯然可以轉化為求每一條邊對二分圖最大獨立集的貢獻&#xff0c;二分圖最大獨立集\(\)點數\(-\)最大匹配數&#xff0c;我們就有了\(50pts\)做法。 正解的做法是在原圖上跑\(Tarjan\)&#xff0c;最開始我想復雜了&#xff0c;后來才意識到&#xff0c;只要存在這樣一個強連…

【數據結構算法】快排/歸并/堆排序 c++

一個用來了解數據結構算法&#xff08;各種排序&#xff0c;列表&#xff0c;樹等&#xff09;很友好的網站&#xff1a; https://visualgo.net/en 該題目來自于牛客&#xff1a;算法篇-排序問題 快排&#xff08;必備&#xff09;歸并&#xff08;體會分治&#xff09;堆(自…

人生的八種投資

1、最心甘情愿的投資&#xff1a;兒女 投資大師羅杰斯一生成功無數&#xff0c;問及他最得意的一次投資時&#xff0c;他說&#xff0c;是自己的女兒。“我曾經覺得養孩子是既麻煩又浪費錢的事情&#xff0c;有了女兒才知道&#xff0c;這才是最能給你帶來幸福感的投資。” …

Linux操作系統load average過高,kworker占用較多cpu

Linux操作系統load average過高&#xff0c;kworker占用較多cpu 今天巡檢發現&#xff0c;mc1的K8S服務器集群有些異常&#xff0c;負載不太均衡。其中10.2.75.32-34&#xff0c;49的load average值都在40以上&#xff0c;雖然機器的cpu核數都是40或48核不算嚴重&#xff0c;但…

[flask]gunicorn配置文件

配置文件 #!/home/xx/.virtualenvs/xx/bin/python # encoding: utf-8import multiprocessing# 監聽端口 bind 0.0.0.0:5000 # 工作模式 worker_class gevent # 并行工作進程數 workers multiprocessing.cpu_count() * 1 # 設置守護進程 daemon True# 設置日志記錄水平 logl…

Linux 上 docker 安裝 oracle-xe-11g

環境&#xff1a; 2G 內存&#xff0c;60G 硬盤阿里云一臺&#xff08;帶寬 1M&#xff09;, 配置如下圖&#xff1a; 軟件&#xff1a;docker Docker version 1.6.2, build 7c8fca2 相關 link docker 鏡像站&#xff1a;https://store.docker.com 視頻教程&#xff1a;ht…

最易忽視的腎虛4件事

腎是人的“先天之本”&#xff0c;如果把人體比喻成一棵大樹&#xff0c;腎就是樹根&#xff0c;吸收、傳遞營養充足&#xff0c;大樹才能枝繁葉茂。腎虛了&#xff0c;可能引起各種健康問題。 然而&#xff0c;在現實中&#xff0c;人們常常會夸大腎虛&#xff0c;很多人把出…

【計算機網絡】wireshark數據流追蹤、圖像抓取(轉)

不廢話了直接上地址 https://www.cnblogs.com/grj001/p/12223954.html

stm32學習方法

很多新手都問過嵌入式系統學習方法&#xff0c;好的學習方法可以事半功倍&#xff0c;學習嵌入式系統&#xff0c;掌握了好的學習方法&#xff0c;自然可以水到渠成。創客學院的老師就通過本篇文章就來說說嵌入式系統學習方法&#xff0c;新手必看 第一&#xff0c;學習基本的裸…

知識點漏缺總結

模塊化 使用模塊化可以給我們帶來以下好處 解決命名沖突 提供復用性 提高代碼可維護性 Proxy Proxy 來替換原本的 Object.defineProperty 來實現數據響應式。 Proxy 是 ES6 中新增的功能&#xff0c;它可以用來自定義對象中的操作。 let p new Proxy(target, handler) 復制代碼…