瀏覽器工作原理27 [#]PWA:解決了web應用哪些問題

引用

《瀏覽器工作原理與實踐》

PWA,全稱是 Progressive Web App ,翻譯過來就是漸進式網頁應用。根據字面意思,它就是“漸進式 +Web 應用”。對于 Web 應用很好理解了,就是目前普通的 Web 頁面,所以 PWA 所支持的首先是一個 Web 頁面。至于“漸進式”,就需要從下面兩個方面來理解。

  • 站在 Web 應用開發者來說,PWA 提供了一個漸進式的過渡方案,讓普通站點逐步過渡到 Web 應用。采取漸進式可以降低站點改造的代價,使得站點逐步支持各項新技術,而不是一步到位。
  • 站在技術角度來說,PWA 技術也是一個漸進式的演化過程,在技術層面會一點點演進,比如逐漸提供更好的設備特性支持,不斷優化更加流暢的動畫效果,不斷讓頁面的加載速度變得更快,不斷實現本地應用的特性。

從這兩點可以看出來,PWA 采取的是非常一個緩和的漸進式策略,不再像以前那樣激進,動不動就是取代本地 App、取代小程序。與之相反,而是要充分發揮 Web 的優勢,漸進式地縮短和本地應用或者小程序的距離。

那么 Web 最大的優勢是什么呢?我認為是自由開放,也正是因為自由和開放,所以大家就很容易對同一件事情達成共識,達成共識之后,一套代碼就可以運行在各種設備之上了,這就是跨平臺,這也恰恰是本地應用所不具備的。而對于小程序,倒是可以實現跨平臺,但要讓各家達成共識,目前來看,似乎還是非常不切實際的。

所以我給 PWA 的定義就是:它是一套理念,漸進式增強 Web 的優勢,并通過技術手段漸進式縮短和本地應用或者小程序的距離。基于這套理念之下的技術都可以歸類到 PWA。

那今天就主要來聊聊 PWA 主要采用了哪些技術手段來縮短它和本地應用或者小程序的距離。

一、Web 應用 VS 本地應用

那相對于本地應用,Web 頁面到底缺少了什么?

  • 首先,Web 應用缺少離線使用能力,在離線或者在弱網環境下基本上是無法使用的。而用戶需要的是沉浸式的體驗,在離線或者弱網環境下能夠流暢地使用是用戶對一個應用的基本要求。
  • 其次,Web 應用還缺少消息推送的能力,因為作為一個 App 廠商,需要有將消息送達到應用的能力。
  • 最后,Web 應用缺少一級入口,也就是將 Web 應用安裝到桌面,在需要的時候直接從桌面打開 Web 應用,而不是每次都需要通過瀏覽器來打開。

針對以上 Web 缺陷,PWA 提出了兩種解決方案:通過引入 Service Worker 來試著解決離線存儲和消息推送的問題,通過引入 manifest.json 來解決一級入口的問題。下面就來詳細分析下 Service Worker 是如何工作的。

二、什么是 Service Worker

先來看看 Service Worker 是怎么解決離線存儲和消息推送的問題。

其實在 Service Worker 之前,WHATWG 小組就推出過用 App Cache 標準來緩存頁面,不過在使用過程中 App Cache 所暴露的問題比較多,遭到多方吐槽,所以這個標準最終也只能被廢棄了,可見一個成功的標準是需要經歷實踐考量的。

所以在 2014 年的時候,標準委員會就提出了 Service Worker 的概念,它的主要思想是在頁面和網絡之間增加一個攔截器,用來緩存和攔截請求。整體結構如下圖所示:

在沒有安裝 Service Worker 之前,WebApp 都是直接通過網絡模塊來請求資源的。安裝了 Service Worker 模塊之后,WebApp 請求資源時,會先通過 Service Worker,讓它判斷是返回 Service Worker 緩存的資源還是重新去網絡請求資源。一切的控制權都交由 Service Worker 來處理。

三、Service Worker 的設計思路

現在知道 Service Worker 的主要功能就是攔截請求和緩存資源,接下來就從 Web 應用的需求角度來看看 Service Worker 的設計思路。

1. 架構

通過前面頁面循環系統的分析,我們已經知道了 JavaScript 和頁面渲染流水線的任務都是在頁面主線程上執行的,如果一段 JavaScript 執行時間過久,那么就會阻塞主線程,使得渲染一幀的時間變長,從而讓用戶產生卡頓的感覺,這對用戶來說體驗是非常不好的。

為了避免 JavaScript 過多占用頁面主線程時長的情況,瀏覽器實現了 Web Worker 的功能。Web Worker 的目的是讓 JavaScript 能夠運行在頁面主線程之外,不過由于 Web Worker 中是沒有當前頁面的 DOM 環境的,所以在 Web Worker 中只能執行一些和 DOM 無關的 JavaScript 腳本,并通過 postMessage 方法將執行的結果返回給主線程。所以說在 Chrome 中, Web Worker 其實就是在渲染進程中開啟的一個新線程,它的生命周期是和頁面關聯的。

讓其運行在主線程之外”就是 Service Worker 來自 Web Worker 的一個核心思想。不過 Web Worker 是臨時的,每次 JavaScript 腳本執行完成之后都會退出,執行結果也不能保存下來,如果下次還有同樣的操作,就還得重新來一遍。所以 Service Worker 需要在 Web Worker 的基礎之上加上儲存功能

另外,由于 Service Worker 還需要會為多個頁面提供服務,所以還不能把 Service Worker 和單個頁面綁定起來。在目前的 Chrome 架構中,Service Worker 是運行在瀏覽器進程中的,因為瀏覽器進程生命周期是最長的,所以在瀏覽器的生命周期內,能夠為所有的頁面提供服務。

2. 消息推送

消息推送也是基于 Service Worker 來實現的。因為消息推送時,瀏覽器頁面也許并沒有啟動,這時就需要 Service Worker 來接收服務器推送的消息,并將消息通過一定方式展示給用戶。關于消息推送的細節這里就不詳述了,如果你感興趣的話可以自行搜索相關資料去學習。

3. 安全

基于 Web 應用的業務越來越多了,其安全問題是不可忽視的,所以在設計 Service Worker 之初,安全問題就被提上了日程。

關于安全,其中最為核心的一條就是 HTTP。知道,HTTP 采用的是明文傳輸信息,存在被竊聽、被篡改和被劫持的風險,在項目中使用 HTTP 來傳輸數據無疑是“裸奔”。所以在設計之初,就考慮對 Service Worker 采用 HTTPS 協議,因為采用 HTTPS 的通信數據都是經過加密的,即便攔截了數據,也無法破解數據內容,而且 HTTPS 還有校驗機制,通信雙方很容易知道數據是否被篡改。關于 HTTPS 協議,會在最后的安全模塊詳細介紹。

所以要使站點支持 Service Worker,首先必要的一步就是要將站點升級到 HTTPS。

除了必須要使用 HTTPS,Service Worker 還需要同時支持 Web 頁面默認的安全策略、儲入同源策略、內容安全策略(CSP)等,關于這些,后續也會詳細介紹。

四、 總結

先分析了 PWA,它是由很多技術組成的一個理念,其核心思想是漸進式。對于開發者,它提供了非常溫和的方式,讓開發者將普通的站點逐步過渡到 Web 應用。對于技術本身而言,它是漸進式演進,逐漸將 Web 技術發揮到極致的同時,也逐漸縮小和本地應用的差距。在此基礎上,又分析了 PWA 中的 Service Worker 的設計思路。

另外,PWA 還提供了 manifest.json 配置文件,可以讓開發者自定義桌面的圖標、顯示名稱、啟動方式等信息,還可以設置啟動畫面、頁面主題顏色等信息。關于 manifest.json 的配置還是比較簡單的,詳細使用教程網上有很多,這里我就不做介紹了。

添加桌面標、增加離線緩存、增加消息推送等功能是 PWA 走向設備的必備功能,但我認為真正決定 PWA 能否崛起的還是底層技術,比如頁面渲染效率、對系統設備的支持程度、WebAssembly 等,而這些技術也在漸進式進化過程中。所以未來如何,拭目以待

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

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

相關文章

Leetcode百題斬-圖論

再開下一個坑,圖論專題居然以前都刷過了,三道Medium也沒什么好說的,直接過 994. Rotting Oranges[Medium] 發現一個很神奇的事,這一題我再5年前的時候做,還是個Easy,現在已經漲到Medium了。看來隨著通貨膨…

將Python Tkinter程序轉換為手機可運行的Web應用 - 詳細教程

前言 作為一名Python開發者,你可能已經使用Tkinter創建了一些桌面GUI應用。但是如何讓這些應用也能在手機上運行呢?本教程將詳細介紹如何將基于Tkinter的Python程序轉換為手機可訪問的Web應用,讓你的應用隨時隨地可用! 一、為什…

Markdown批量轉PDF工具:高效便捷的文檔轉換解決方案

Markdown批量轉PDF工具:高效便捷的文檔轉換解決方案 前言 在日常工作和學習中,我們經常需要將Markdown文檔轉換為PDF格式,無論是為了分享、打印還是歸檔。雖然有很多在線工具可以實現這一功能,但當面對大量文檔時,逐…

51c~嵌入式~PLC~歐姆龍~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/14017854 > PLC-- 歐姆龍 --專輯 一、歐姆龍PLC指令應用 歐姆龍PLC是一種功能完善的緊湊型PLC,能為業界領先的輸送分散控制等提供高附加值機器控制;它還具有通過各種高級內裝板進行升級的能…

機器人 URDF學習筆記

目錄 URDF(Unified Robot Description Format) ? URDF 描述的內容包括: URDF(Unified Robot Description Format) 意思是:統一機器人描述格式。 它是一種用 XML 編寫的格式,專門用于描述機器…

MySQL-主從復制分庫分表

5 MySQL-主從復制&分庫分表 5.1mysql 主從復制 5.1.1. 概述 主從復制是將主數據庫的DDL和DML操作通過二進制日志(binlog文件)傳送到從庫服務器,然后在從庫上對這些日志重新執行,從而使得主庫和從庫的數據保持同步。 MySQL…

7.6.平衡二叉樹(英文縮寫為AVL樹)

一.平衡二叉樹的定義: 1.平衡二叉樹簡稱平衡樹(AVL樹,該縮寫來源于平衡二叉樹的發明人的名字簡稱); 2.結點的平衡因子左子樹高-右子樹高; 3.以上述圖片左下角的二叉樹為例,結點50的左子樹的高度為2,右子樹…

OpenCV CUDA模塊設備層-----將指向共享內存(shared memory)的指針封裝成一個 tuple函數smem_tuple()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 OpenCV的cv::cudev模塊中的一個用于 CUDA 編程的輔助函數,用于將指向共享內存(shared memory)的指針封裝成一…

paddlepaddle在RTX40系安裝注意事項

1 安裝簡介 1.1 安裝注意事項 顯卡型號:RTX4090 驅動版本:550.54.14 宿主機cuda版本:12.4 安裝方式:conda 注意cuda和cudnn的搭配 最初安裝是為了使用PaddleOCR,根據官網提示需要安裝cuda和cudnn。這里最關鍵的就是針…

車載以太網-組播

目錄 車載以太網中的組播:從原理到車載應用**一、組播的核心概念與車載網絡價值****二、車載以太網組播的關鍵協議與機制**1. **組播IP地址管理(IGMP協議)**2. **組播數據鏈路層實現(MAC地址映射)****三、車載以太網組播的典型應用場景**1. **自動駕駛與傳感器數據分發**2…

【雅思播客013】what do you do

【dialog】 A: Oh, look, there’s Veronica and her boyfriend.She’s always going on about him at the of?ce. Oh, great, they saw us. They’re coming this way. B: Oh, man... C: Jessica! Arthur! Hi! I’d like you to meet my boyfriend Greg, he’s the VP. of q…

Freebsd 14.2系統下 wifi網卡硬件驅動軟件配置調試大全

Freebsd 14.2系統下,網卡是AX200 先檢查網卡sysctl net.wlan.devices sysctl net.wlan.devices 能識別出已經安裝的 sysctl net.wlan.devices net.wlan.devices: iwlwifi0配置wlan0 # ifconfig wlan0 create wlandev iwlwifi0 # ifconfig wlan0 up # ifconfig …

Python打卡:Day39

知識點回顧 圖像數據的格式:灰度和彩色數據模型的定義顯存占用的4種地方 模型參數梯度參數優化器參數數據批量所占顯存神經元輸出中間狀態 batchisize和訓練的關系 浙大疏錦行

使用 GcExcel .NET 將 Excel 導出為 PDF

引言 在企業級應用開發中,經常需要將Excel數據導出為PDF格式以便于共享和打印。GrapeCity Documents for Excel(簡稱GcExcel)作為一款高性能的.NET Excel組件,提供了強大的PDF導出功能。本文將詳細介紹如何使用GcExcel .NET實現E…

每日算法刷題Day39 6.26:leetcode前綴和2道題,用時1h20min

8. 2055.蠟燭之間的盤子(中等,學習替換查詢區間) 2055. 蠟燭之間的盤子 - 力扣(LeetCode) 思想 1.給你一個長桌子,桌子上盤子和蠟燭排成一列。給你一個下標從 0 開始的字符串 s ,它只包含字符 * 和 | ,其中 * 表示一…

jrebel 下載,安裝,激活步驟

參考地址: [筆記] 最新版 - JRebel 插件激活與配置教程 : 高效開發的必備指南_jrebel激活-CSDN博客https://blog.csdn.net/LuChangQiu/article/details/145547828 1、下載 2、激活地址: http://42.193.18.168:8088 ### 撿個便宜 - 交朋友吧 ###https://…

uniapp使用plus調取藍牙/usb打印

安卓使用usb調取打印機 /*** 安卓usb調取打印機*param { string | bytes[] } html 傳入的打印內容*傳入一段文本或一個bytes數組* returns*/ export const printUsb (html) > {return new Promise((resolve, reject) > {if (!window.plus) return reject(new Error(&qu…

區塊鏈數據結構:區塊與鏈式結構編碼

目錄 區塊鏈數據結構:區塊與鏈式結構編碼引言:區塊鏈的骨架1. 區塊鏈數據結構解析1.1 區塊結構組成1.2 區塊鏈可視化結構2. 區塊核心組件詳解2.1 區塊頭字段說明2.2 Merkle樹結構2.3 工作量證明機制3. Python實現區塊鏈數據結構3.1 區塊類實現3.2 區塊鏈類實現3.3 區塊鏈演示…

阿里推出 R1-Omni:將強化學習與可驗證獎勵(RLVR)應用于全模態大語言模型

從視頻中識別情感涉及許多細微的挑戰。僅依賴視覺或音頻信號的模型,往往無法準確捕捉這兩種模態之間的復雜相互作用,從而導致對情感內容的誤解。一個關鍵難題在于可靠地結合視覺線索(如面部表情或肢體語言)與聽覺信號(…

【江科大】STM32F103C8T6 + TB6612 + N20編碼器減速電機《03-增量式PID定速控制》(增量式PID,定時器輸入捕獲,定時器編碼器)

STM32F103C8T6單片機+N20減速電機帶霍爾編碼器版PID閉環控制實驗演示 STM32F103C8T6 實現的電機轉速控制系統,基于 PWM 輸出驅動、編碼器采樣反饋、以及增量式 PID 算法進行控制。 /*** @file Encoder.c* @brief 增量式編碼器驅動程序* @details 使用TIM3定時器的編碼器…