亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
鑰匙要點
應(yīng)用程序外殼架構(gòu)
首先互動且一致互動
>服務(wù)器端渲染
>您可以緩存應(yīng)用程序外殼(負責渲染UI的資產(chǎn)),數(shù)據(jù)或理想情況下。緩存UI對於實現(xiàn)即時的網(wǎng)絡(luò)體驗至關(guān)重要。但是數(shù)據(jù)呢?
>第一個失敗的審核是說該應(yīng)用不註冊服務(wù)工作者。在更改此事之前,讓我們首先了解服務(wù)工作者和相關(guān)功能。
首頁 web前端 js教程 漸進式網(wǎng)絡(luò)應(yīng)用程序:速成課程

漸進式網(wǎng)絡(luò)應(yīng)用程序:速成課程

Feb 16, 2025 am 08:56 AM

漸進式網(wǎng)絡(luò)應(yīng)用程序:速成課程

漸進式Web應(yīng)用程序(PWAS)嘗試通過向移動用戶提供每個移動網(wǎng)絡(luò)應(yīng)用程序和本機移動應(yīng)用程序的世界。

>

>他們提供類似應(yīng)用的用戶體驗(濺出屏幕和主屏幕圖標),它們從https安全的服務(wù)器提供,即使以低質(zhì)量或緩慢的網(wǎng)絡(luò),它們也可以快速加載(由於頁面加載最佳實踐)條件,它們具有離線支持,即時加載和推動通知。 PWA的概念首先是由Google引入的,但仍然得到許多Chrome功能和出色的工具的支持,例如Lighthouse,這是一種可訪問性,性能和漸進式審核的開源工具,我們將在以後進行一些研究。 > 在整個速成課程中,我們將與ES6從頭開始構(gòu)建PWA,並與燈塔進行反應(yīng)並逐步優(yōu)化它,直到我們在UX和性能方面取得最佳效果。

>

術(shù)語“漸進式”一詞僅表示PWA的設(shè)計方式,以至於它們可以在現(xiàn)代瀏覽器中逐漸增強

,在現(xiàn)代瀏覽器中,許多新功能和技術(shù)已經(jīng)得到支持,但在舊瀏覽器中也應(yīng)該很好地工作沒有尖端的功能。

鑰匙要點

  • 漸進式Web應(yīng)用程序(PWAS)橋樑移動網(wǎng)絡(luò)和本機應(yīng)用之間的差距,提供高性能和用戶參與功能,例如離線支持和推送通知。
  • >
  • > PWA可以通過瀏覽器訪問,而無需App Store下載,並且可以逐步增強它們以在現(xiàn)代和較舊的瀏覽器中運行。 > Google的Lighthouse工具對於審核和優(yōu)化PWA是至關(guān)重要的,可以幫助開發(fā)人員改善可訪問性,性能和遵守漸進標準。
  • 建立PWA涉及建立服務(wù)工作者,該服務(wù)人員可以啟用離線支持和資源緩存之類的功能,可顯著提高應(yīng)用程序性能和可靠性。
  • PRPL模式通過優(yōu)化資源加載和交互準備就緒,增強了PWA性能,即使在具有挑戰(zhàn)性的網(wǎng)絡(luò)條件下,也可以確保無縫的用戶體驗。
  • >服務(wù)工作者在PWA,處理背景同步和推送通知中起著至關(guān)重要的作用,並允許應(yīng)用程序通過緩存關(guān)鍵資源即時加載。 PWAS的未來看起來很有希望,並且在Web技術(shù)和主要瀏覽器和平臺的支持下不斷改進,將它們定位為本機應(yīng)用程序的引人注目的替代方案。
  • >本機vs mobile =漸進
  • >一個本機應(yīng)用程序可從移動操作系統(tǒng)的應(yīng)用程序商店分發(fā)且可下載。另一方面,移動Web應(yīng)用程序可以通過僅輸入其地址或URL來從Web瀏覽器中訪問。從用戶的角度來看,啟動瀏覽器並導航到地址比去App Store,下載,安裝然後啟動應(yīng)用程序要方便得多。從開發(fā)人員/所有者的角度來看,要獲得App Store帳戶的一次性費用,然後上傳他們的應(yīng)用程序以便在全球用戶訪問其應(yīng)用程序比必須處理Web託管的複雜性更好。
  • >
  • >可以離線使用本機應(yīng)用程序。對於需要從某些API服務(wù)器檢索的遠程數(shù)據(jù),可以輕鬆考慮該應(yīng)用程序以支持最新訪問數(shù)據(jù)的某種SQLite緩存。
  • >移動Web應(yīng)用程序可以通過Google等搜索引擎進行指示,並且通過搜索引擎優(yōu)化,您可以吸引更多用戶。本機應(yīng)用程序也是如此,因為應(yīng)用商店擁有自己的搜索引擎,開發(fā)人員可以應(yīng)用不同的技術(shù)(通常稱為App Store優(yōu)化)來觸及更多用戶。
>一個本機應(yīng)用程序至少在啟動屏幕上立即加載,直到所有資源都準備好供應(yīng)用程序執(zhí)行為止。這些是最重要的感知差異。應(yīng)用應(yīng)用程序發(fā)行的每種方法都對最終用戶(有關(guān)用戶體驗,可用性等)和應(yīng)用程序所有者(有關(guān)客戶的成本,客戶覆蓋等)都有優(yōu)勢??紤]到這一點,Google引入了PWA,將雙方的最佳功能帶入一個概念。 Google Chrome工程師Alex Russell介紹了此列表中總結(jié)了這些方面。 (來源:不經(jīng)常注意。)

    響應(yīng)敏感:適合任何形式。
  • 連接獨立:與服務(wù)人員逐步增強,讓他們離線工作。
  • >類似應(yīng)用程序的相互作用:採用Shell Content應(yīng)用程序模型來創(chuàng)建適用的導航和交互。
  • 新鮮:由於服務(wù)工作者的更新過程,始終始終最新。
  • 安全:通過TLS(服務(wù)工作人員的要求)服務(wù)以防止窺探。
  • 可發(fā)現(xiàn)的:由於W3C清單和服務(wù)工作者註冊範圍允許搜索引擎找到它們,因此可以將其識別為“應(yīng)用程序”。
  • >可重新傳輸:可以訪問OS的重新參與度UI;例如推送通知。
  • >可安裝:通過提供瀏覽器提供的提示到主屏幕,允許用戶“保留”應(yīng)用程序,而他們發(fā)現(xiàn)的情況最有用,而無需App Store的麻煩。 >
  • 可連接:意味著它們是零摩擦,零安裝且易於共享的。 URL的社會力量很重要。
  • >燈塔
Lighthouse是用於審核Google創(chuàng)建的Web應(yīng)用程序的工具。它與Chrome Dev工具集成在一起,可以從審核面板觸發(fā)。

>

您也可以將燈塔用作Nodejs CLI工具:>

>然後您可以使用:

運行它

也可以將燈塔作為Chrome擴展名安裝,但是Google建議使用與DevTools集成的版本,並且僅在您以某種方式無法使用DevTools時才使用擴展。
<span>npm install -g lighthouse  
</span>
>請注意,即使您使用的是基於CLI的版本,您也需要在系統(tǒng)上安裝Chrome才能使用Lighthouse。

>從Scratch

構(gòu)建您的第一個PWA
lighthouse https://sitepoint.com/
在本節(jié)中,我們將從頭開始創(chuàng)建一個漸進的Web應(yīng)用程序。首先,我們將使用React和Reddit的API創(chuàng)建一個簡單的Web應(yīng)用程序。接下來,我們將按照燈塔報告提供的說明來添加PWA功能。 >

>請注意,公共無授權(quán)reddit API已啟用CORS標題,因此您可以在沒有中介服務(wù)器的情況下從客戶端應(yīng)用程序中消耗它。

>在開始之前,本課程將假定您安裝了NODEJS和NPM設(shè)置開發(fā)環(huán)境。如果您不這樣做,請先從Awesome Homestead改進開始,該版本正在運行每個版本的最新版本,並準備開發(fā)開發(fā)和測試。

>

我們首先安裝React Team創(chuàng)建的Project App,從WebPack配置的麻煩中節(jié)省您的項目樣板。

>
<span>npm install -g lighthouse  
</span>

應(yīng)用程序外殼架構(gòu)

應(yīng)用程序外殼是漸進式Web應(yīng)用程序的重要概念。這只是最小的HTML,CSS和JavaScript代碼,負責渲染用戶界面。

漸進式網(wǎng)絡(luò)應(yīng)用程序:速成課程

這個應(yīng)用程序外殼對性能有很多好處。您可以緩存應(yīng)用程序外殼,因此,當用戶下次訪問您的應(yīng)用程序時,它將立即加載,因為瀏覽器不需要從遠程服務(wù)器中獲取資產(chǎn)。 >

用於構(gòu)建簡單的UI,我們將使用材料UI,這是React中的Google材料設(shè)計的實現(xiàn)。

讓我們從NPM安裝軟件包:

下一個打開src/app.js,然後添加:

>
lighthouse https://sitepoint.com/

接下來,我們需要使用兩種方法fetchfirst()和fetchnext()獲取reddit帖子:

>
<span>npm install -g create-react-app
</span>create-react-app react-pwa
<span>cd react-pwa/
</span>

>您可以在此GitHub存儲庫中找到源代碼。

>
<span>npm install material-ui --save
</span>
>在對應(yīng)用程序進行審核之前,您需要使用本地服務(wù)器在本地進行構(gòu)建並在本地提供應(yīng)用:

此命令在package.json中調(diào)用構(gòu)建腳本,並在react-pwa/build文件夾中生成一個構(gòu)建。 >

>現(xiàn)在,您可以使用任何本地服務(wù)器為您的應(yīng)用提供服務(wù)。在改進的Homestead上,您可以簡單地將Nginx虛擬主機指向構(gòu)建文件夾並打開homestead.app在瀏覽器中,也可以通過nodejs使用服務(wù)包:
<span>import <span>React, { Component }</span> from 'react';
</span><span>import <span>MuiThemeProvider</span> from 'material-ui/styles/MuiThemeProvider';
</span><span>import <span>AppBar</span> from 'material-ui/AppBar';
</span><span>import <span>{Card, CardActions, CardHeader,CardTitle,CardText}</span> from 'material-ui/Card';
</span><span>import <span>FlatButton</span> from 'material-ui/FlatButton';
</span><span>import <span>IconButton</span> from 'material-ui/IconButton';
</span><span>import <span>NavigationClose</span> from 'material-ui/svg-icons/navigation/close';
</span>
<span>import logo from './logo.svg';
</span><span>import './App.css';
</span>
<span>class App extends Component {
</span>
  <span>constructor(props) {
</span>    <span>super(props);
</span>
    <span>this.state = {
</span>      <span>posts: []
</span>    <span>};
</span>  <span>}
</span>
  <span>render() {
</span>    <span>return (
</span>
      <span><MuiThemeProvider>
</span>        <span><div>
</span>          <span><AppBar
</span>            title<span>={<span >React PWA</span>}
</span>
            iconElementLeft<span>={<IconButton><NavigationClose /></IconButton>}
</span>            iconElementRight<span>={<FlatButton onClick={() => this.fetchNext('reactjs', this.state.lastPostName)} label="next" />
</span>            <span>}
</span>          <span>/>
</span>
          <span>{this.state.posts.map(function (el<span>, index</span>) {
</span>            <span>return <Card key={index}>
</span>              <span><CardHeader
</span>                title<span>={el.data.title}
</span>
                subtitle<span>={el.data.author}
</span>                actAsExpander<span>={el.data.is_self === true}
</span>                showExpandableButton<span>={false}
</span>              <span>/>
</span>
              <span><CardText expandable={el.data.is_self === true}>
</span>                <span>{el.data.selftext}
</span>              <span></CardText>
</span>              <span><CardActions>
</span>                <span><FlatButton label="View" onClick={() => {
</span>                  <span>window.open(el.data.url);
</span>                <span>}} />
</span>
              <span></CardActions>
</span>            <span></Card>
</span>          <span>})}
</span>

          <span><FlatButton onClick={() => this.fetchNext('reactjs', this.state.lastPostName)} label="next" />
</span>        <span></div>
</span>      <span></MuiThemeProvider>
</span>
    <span>);
</span>  <span>}
</span><span>}
</span>
<span>export default App;
</span>

>使用服務(wù),您的應(yīng)用程序?qū)膆ttp:// localhost:5000/。

從本地提供服務(wù)。

  <span>fetchFirst(url) {
</span>    <span>var that = this;
</span>    <span>if (url) {
</span>      <span>fetch('https://www.reddit.com/r/' + url + '.json').then(function (response) {
</span>        <span>return response.json();
</span>      <span>}).then(function (result) {
</span>
        that<span>.setState({ posts: result.data.children, lastPostName: result.data.children[result.data.children.length - 1].data.name });
</span>
        <span>console.log(that.state.posts);
</span>      <span>});
</span>    <span>}
</span>  <span>}  
</span>  <span>fetchNext(url<span>, lastPostName</span>) {
</span>    <span>var that = this;
</span>    <span>if (url) {
</span>      <span>fetch('https://www.reddit.com/r/' + url + '.json' + '?count=' + 25 + '&after=' + lastPostName).then(function (response) {
</span>        <span>return response.json();
</span>      <span>}).then(function (result) {
</span>
        that<span>.setState({ posts: result.data.children, lastPostName: result.data.children[result.data.children.length - 1].data.name });
</span>        <span>console.log(that.state.posts);
</span>      <span>});
</span>    <span>}
</span>  <span>}
</span>  <span>componentWillMount() {
</span>
     <span>this.fetchFirst("reactjs");
</span><span>}
</span>

>您可以毫無問題地審核您的應(yīng)用程序,但是如果您想在移動設(shè)備中進行測試,也可以使用Surge.SH之類的服務(wù)來使用一個命令進行部署! >

漸進式網(wǎng)絡(luò)應(yīng)用程序:速成課程

接下來,從任何目錄中的任何目錄中的奔跑激增,將該目錄發(fā)佈到網(wǎng)絡(luò)上。 >

>您可以從此鏈接找到此應(yīng)用的託管版本。

>
<span>npm run build
</span>
現(xiàn)在,讓我們打開Chrome DevTools,去審核面板,然後單擊執(zhí)行審核。

從報告中我們可以看到,漸進式Web應(yīng)用程序的得分為45/100,性能為68/100。 在漸進式Web應(yīng)用程序下,我們有6個失敗的審核和5次通過的審核。這是因為生成的項目默認情況下已經(jīng)添加了一些PWA功能,例如Web清單,視口元和 tag。 在性能下,我們有診斷和不同計算的指標,例如第一個有意義的油漆,首次交互式,始終如一的交互式,感知速度索引和估計的輸入延遲。我們稍後將研究這些。

燈塔建議通過降低下載尺寸或推遲不必要的資源下載來減少關(guān)鍵渲染鏈的長度來改善頁面加載性能。

>請注意,性能得分和指標值可以在同一臺計算機上的不同審核會話之間發(fā)生變化,因為它們受到許多不同條件的影響,例如您當前的網(wǎng)絡(luò)狀態(tài)以及當前的機器狀態(tài)。

為什麼頁面加載性能和速度重要

根據(jù)Doubleclick(一家Google廣告公司)的說法,如果需要超過3秒的加載頁面,則將放棄53%的移動網(wǎng)站訪問。通過優(yōu)化頁面加載性能和速度,PWA通過一組我們將在接下來查看的技術(shù)和策略為用戶提供即時的Web體驗。

>

之前考慮性能

>您開始構(gòu)建PWA 大多數(shù)客戶端應(yīng)用程序都是使用某種JavaScript庫或框架(例如React,preact,Angular,Vue等)構(gòu)建的。如果您構(gòu)建PWA,則需要確保您選擇一個移動優(yōu)先庫或者,換句話說,首先是為移動網(wǎng)絡(luò)設(shè)計的庫。否則,優(yōu)化您的應(yīng)用程序以進行性能是不可能的任務(wù)。

>您需要使用不同的測試工具,例如Chrome DevTools,Lighthouse,Google PagesPeed等,以在不同和模擬的網(wǎng)絡(luò)條件下進行大量測試,因此您可以成功地優(yōu)化您的應(yīng)用程序頁面加載性能。

> PWA性能指標您需要放在雷達上

>您可以使用燈塔用不同的指標,診斷和機會來衡量和優(yōu)化應(yīng)用程序的頁面加載性能。

> 燈塔使用不同的指標。讓我們一個人介紹他們:

首先有意義的油漆

第一個有意義的油漆是一種措施,僅表示用戶在屏幕上看到有意義或主內(nèi)容的時間。該審核的越低,您的應(yīng)用程序的感知性能就越好。

這是我們應(yīng)用的這個指標。

>我們看到,從1.3s開始瀏覽器開始呈現(xiàn)空背景,然後從2s開始瀏覽器開始呈現(xiàn)標頭,2.4 s呈現(xiàn)標頭和底部的按鈕。直到第三秒鐘才呈現(xiàn)帖子。整個過程花費了3.4秒,第一個有意義的油漆等於

2.340ms

- 當呈現(xiàn)沒有漸進式網(wǎng)絡(luò)應(yīng)用程序:速成課程的標頭

按鈕時。

第一個有意義的油漆實際上取決於我們可以認為有意義的塗料,這在不同的用戶之間可能有所不同。如果用戶只對閱讀帖子感興趣,那麼第一個有意義的油漆是在3秒鐘之後。您可以查看Google如何從此文檔中計算此指標。 >

漸進式網(wǎng)絡(luò)應(yīng)用程序:速成課程

這是同一應(yīng)用程序的另一部膠片,其中燈塔在最後一個屏幕截圖上報告了FMP為 2.560ms>,該屏幕截圖在上面的折疊區(qū)域中充分顯示了後的頭條新聞。 其次,您可以看到該頁面是逐步渲染的,而不是一次呈現(xiàn),這很好地表明了性能。

您可以通過優(yōu)化關(guān)鍵的渲染路徑來優(yōu)化此度量。 >

臨界渲染路徑

關(guān)鍵的渲染路徑是與Web瀏覽器渲染頁面如何相關(guān)的概念,也就是說,從接收HTML,CSS和JavaScript資產(chǎn)到瀏覽器處理並呈現(xiàn)實際有意義的內(nèi)容的步驟。為了優(yōu)化關(guān)鍵的渲染路徑,您需要對與用戶當前操作相關(guān)的內(nèi)容進行更高的優(yōu)先級。也就是說,如果他們要訪問您的應(yīng)用程序,您可以先首先顯示UI的可見部分,或者稱為上述區(qū)域。

>

>有關(guān)更多詳細信息,您可以閱讀“優(yōu)化關(guān)鍵渲染路徑”。

>您還可以查看此策劃工具的列表,以融合關(guān)鍵CSS資產(chǎn)。還要檢查這些工具是否包含JavaScript和其他資產(chǎn):

inliner:網(wǎng)上圖像,CSS和JavaScript的節(jié)點實用程序

>

inline-source:一種用於在html

中嵌入標記的JS,CSS和IMG源的工具

inline-source-cli:用於內(nèi)聯(lián)源的CLI工具。
  • 關(guān)鍵請求鏈
  • 關(guān)鍵請求鍊是一個與關(guān)鍵渲染路徑有關(guān)的概念,可以用一個圖表來表示,該圖可以分解關(guān)鍵資源以渲染頁面,每個資源花費多少時間以及為每個資源下載多少個字節(jié)。您可以使用關(guān)鍵的請求鏈圖來更好地了解關(guān)鍵資源,以消除,延期或標記為異步。這是我們示例PWA報告中的屏幕截圖:

現(xiàn)在,讓我們嘗試使用內(nèi)聯(lián)源和Inline-Source-CLI解決此問題:

然後,我們在構(gòu)建文件夾中導航並打開index.html,然後將關(guān)鍵字inline添加到和<script> <script> elements我們想要內(nèi)聯(lián)的元素:<ancy>> <p> </script>

讓我們嵌入這些資源:

漸進式網(wǎng)絡(luò)應(yīng)用程序:速成課程

<span>npm install -g lighthouse  
</span>
>通過融入CSS和JavaScript資產(chǎn),我們將關(guān)鍵請求鏈減少到2

首先互動且一致互動

這兩個指標都表示用戶能夠與應(yīng)用程序進行交互的時間。兩個指標都表示可用性和可用性,但是它們之間存在差異。當頁面最小交互式時,第一個交互式度量,而頁面完全互動時始終如一的交互措施。

您可以通過優(yōu)化關(guān)鍵的渲染路徑來優(yōu)化交互的時間。

>感知速度索引

>感知速度索引是一個指標,可以在考慮佈局穩(wěn)定性(沒有UI元素突然位移)的同時測量頁面上的折疊視覺性能。它只是指示頁面內(nèi)容可見填充的速度。

> PSI是SI或速度索引度量的修改版本,這是顯示上述(可見)區(qū)域的平均時間,而無需考慮視覺穩(wěn)定性。

您還可以通過優(yōu)化關(guān)鍵渲染路徑來優(yōu)化此指標。

估計的輸入延遲

估計的輸入延遲是一個指標,指示主線程何時準備處理輸入。 >

>您可以閱讀有關(guān)此指標以及如何通過此處通過的更多信息。

>

是第一個字節(jié)(TTFB)

的時間

> wikipedia將TTFB定義為:

>首先字節(jié)(TTFB)的時間是一種測量值,用來指示W(wǎng)eb服務(wù)器或其他網(wǎng)絡(luò)資源的響應(yīng)能力。 TTFB衡量用戶或客戶端的持續(xù)時間,向客戶端瀏覽器收到的頁面的第一個字節(jié)提出HTTP請求。

>您可以使用WebPagetest和Lighthouse之類的工具來測量PWA的TTFB。有關(guān)更多信息,請參見此鏈接。

>現(xiàn)在讓我們查看開發(fā)人員使用的一組概念和常見技術(shù)來優(yōu)化這些指標。
>代碼分裂和基於路由的塊

>

JavaScript生態(tài)系統(tǒng)近年來已經(jīng)發(fā)生了巨大變化,諸如WebPack和browserify之類的新工具,用於將所有腳本捆綁到一個文件中。這被認為是良好的做法,因為它有助於將多個腳本文件的網(wǎng)絡(luò)請求減少到一個請求(用於獲取整個捆綁包),優(yōu)化關(guān)鍵的渲染路徑(沒有長期塊JavaScript和CSS資產(chǎn))。但是問題是,對於大型應(yīng)用程序,捆綁包將具有更大的尺寸,從而使下載捆綁包,對其進行處理,然後啟動應(yīng)用程序效率非常低,這會影響即時的Web體驗(增加了第一個有意義的時間的時間油漆和UI變得互動的時間)。

作為解決此問題的解決方案,不同的應(yīng)用程序使用代碼拆分和基於路由的塊(將代碼拆分為僅每條路線需要的塊)。因此,瀏覽器只需要下載渲染第一頁/路線所需的第一個塊,然後在用戶瀏覽其他路線時懶惰加載剩餘的塊。

>

>服務(wù)器端渲染

>服務(wù)器端渲染是呈現(xiàn)服務(wù)器上的初始內(nèi)容而不是瀏覽器的過程 - 在許多情況下,它可能會改善頁面加載性能,因為瀏覽器可以在下載後立即顯示內(nèi)容(PLAIN HTML) 。

>單獨的服務(wù)器端渲染將無濟於事,因為需要下載和啟動JavaScript資產(chǎn)。

> prpl性能模式

PRPL是一種性能模式,可利用諸如HTTP/2服務(wù)器推送,預(yù)加載標頭,服務(wù)工作人員和懶惰加載等概念,以提高PWA交付和啟動的性能。

>

prpl代表:

>最初URL路線的關(guān)鍵資源
  • 渲染初始路線
  • >預(yù)備剩餘路由
  • 懶負載並按需創(chuàng)建剩餘的路線。
來源:Google Web基礎(chǔ)

> 通過緩存

優(yōu)化性能 緩存是將經(jīng)常請求的數(shù)據(jù)保存在近距離存儲位置的過程。對於Web,這是瀏覽器內(nèi)存或數(shù)據(jù)庫。瀏覽器實際上具有專門為緩存網(wǎng)絡(luò)響應(yīng)設(shè)計的高速緩存位置,但是開發(fā)人員還可以利用其他存儲機制(例如HTML5本地存儲API和IndexEdDB)。

>您可以緩存應(yīng)用程序外殼(負責渲染UI的資產(chǎn)),數(shù)據(jù)或理想情況下。緩存UI對於實現(xiàn)即時的網(wǎng)絡(luò)體驗至關(guān)重要。但是數(shù)據(jù)呢?

我們可以在此處考慮兩類應(yīng)用程序。僅需要網(wǎng)絡(luò)連接才能使資產(chǎn)負責呈現(xiàn)UI和/或需要提供核心功能的應(yīng)用程序。例如,考慮一個為用戶提供個人會計的應(yīng)用程序,這僅取決於算法和計算(本地CPU)。

>

第二類是依賴遠程服務(wù)器以獲取更新信息的應(yīng)用程序。您可能想知道為什麼需要緩存數(shù)據(jù),因為它很快就會過時,並且用戶大多需要更新的信息。問題是,在世界許多地方,問題不是網(wǎng)絡(luò)連接的永久中斷,而是網(wǎng)絡(luò)在慢速和良好信號之間的波動狀態(tài),即使應(yīng)用程序已經(jīng)加載了,這也會影響用戶體驗。

>該應(yīng)用程序可以利用數(shù)據(jù)緩存(利用背景同步API)來保證用戶在頁面之間導航時的服務(wù),即使他們離開並在短時間內(nèi)又回到應(yīng)用程序。不斷觀看網(wǎng)絡(luò)狀態(tài),然後恢復獲取/發(fā)送數(shù)據(jù)而不會中斷用戶。

現(xiàn)在,讓我們解決失敗的問題以獲得更好的分數(shù)。

註冊服務(wù)工作者

>第一個失敗的審核是說該應(yīng)用不註冊服務(wù)工作者。在更改此事之前,讓我們首先了解服務(wù)工作者和相關(guān)功能。

>服務(wù)工作者是一種現(xiàn)代的瀏覽器技術(shù),可以用作客戶端代理,允許您的應(yīng)用程序(通過攔截網(wǎng)絡(luò)請求)實現(xiàn)用於添加功能(例如即時加載和離線支持等)的緩存等。

>服務(wù)工作者也可以用於實施更新並通過推送通知進行參與。

>

>服務(wù)工作者無法訪問頁面DOM,但是可以通過postmessage()方法與客戶端(窗口,工作人員或共享工作者)進行通信。

>許多瀏覽器API可在服務(wù)工作者中使用,例如:>

fetch api:用於從遠程服務(wù)器中獲取內(nèi)容(發(fā)送請求並獲取響應(yīng))

    >緩存API:用於緩存內(nèi)容(創(chuàng)建由請求鍵入的響應(yīng)的緩存存儲)
  • >
  • 推動API:要獲得推送通知
  • >
  • 背景同步API:允許Web應(yīng)用程序推遲操作,直到用戶具有穩(wěn)定的連接。
  • >
  • >服務(wù)工作者有許多需要正確處理的生命週期事件。
  • >

>安裝事件:當用戶首次訪問該應(yīng)用時,您將獲得安裝事件,並下載並安裝了服務(wù)工作者

激活事件:調(diào)用.register()後觸發(fā)(下載和安裝事件之後)
  • 提取事件:如果在服務(wù)工作者的範圍內(nèi)導航或觸發(fā)範圍頁面的任何請求,則會獲得提取事件。
  • React項目已經(jīng)包含服務(wù)工作者。我們可以使用它或創(chuàng)建一個新的,以便我們可以更好地了解服務(wù)工作人員的工作方式。 在公共文件夾中,讓我們創(chuàng)建一個名為service-worker.js的新文件,然後通過在之前添加以下代碼來從public/index.html文件中註冊它:

以上是漸進式網(wǎng)絡(luò)應(yīng)用程序:速成課程的詳細內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔相應(yīng)的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
如何在node.js中提出HTTP請求? 如何在node.js中提出HTTP請求? Jul 13, 2025 am 02:18 AM

在Node.js中發(fā)起HTTP請求有三種常用方式:使用內(nèi)置模塊、axios和node-fetch。 1.使用內(nèi)置的http/https模塊無需依賴,適合基礎(chǔ)場景,但需手動處理數(shù)據(jù)拼接和錯誤監(jiān)聽,例如用https.get()獲取數(shù)據(jù)或通過.write()發(fā)送POST請求;2.axios是基於Promise的第三方庫,語法簡潔且功能強大,支持async/await、自動JSON轉(zhuǎn)換、攔截器等,推薦用於簡化異步請求操作;3.node-fetch提供類似瀏覽器fetch的風格,基於Promise且語法簡單

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時復制副本,因此互不影響;引用類型如對象、數(shù)組和函數(shù)存儲的是內(nèi)存地址,指向同一對象的變量會相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問題。理解這兩類差異有助於編寫更穩(wěn)定可靠的代碼。

React與Angular vs Vue:哪個JS框架最好? React與Angular vs Vue:哪個JS框架最好? Jul 05, 2025 am 02:24 AM

選哪個JavaScript框架最好?答案是根據(jù)需求選擇最適合的。 1.React靈活自由,適合需要高度定制、團隊有架構(gòu)能力的中大型項目;2.Angular提供完整解決方案,適合企業(yè)級應(yīng)用和長期維護的大項目;3.Vue上手簡單,適合中小型項目或快速開發(fā)。此外,是否已有技術(shù)棧、團隊規(guī)模、項目生命週期及是否需要SSR也都是選擇框架的重要因素??傊?,沒有絕對最好的框架,適合自己需求的就是最佳選擇。

JavaScript時間對象,某人構(gòu)建了一個eactexe,在Google Chrome上更快的網(wǎng)站等等 JavaScript時間對象,某人構(gòu)建了一個eactexe,在Google Chrome上更快的網(wǎng)站等等 Jul 08, 2025 pm 02:27 PM

JavaScript開發(fā)者們,大家好!歡迎閱讀本週的JavaScript新聞!本週我們將重點關(guān)注:Oracle與Deno的商標糾紛、新的JavaScript時間對象獲得瀏覽器支持、GoogleChrome的更新以及一些強大的開發(fā)者工具。讓我們開始吧! Oracle與Deno的商標之爭Oracle試圖註冊“JavaScript”商標的舉動引發(fā)爭議。 Node.js和Deno的創(chuàng)建者RyanDahl已提交請願書,要求取消該商標,他認為JavaScript是一個開放標準,不應(yīng)由Oracle

什麼是緩存API?如何與服務(wù)人員使用? 什麼是緩存API?如何與服務(wù)人員使用? Jul 08, 2025 am 02:43 AM

CacheAPI是瀏覽器提供的一種緩存網(wǎng)絡(luò)請求的工具,常與ServiceWorker配合使用,以提升網(wǎng)站性能和離線體驗。 1.它允許開發(fā)者手動存儲如腳本、樣式表、圖片等資源;2.可根據(jù)請求匹配緩存響應(yīng);3.支持刪除特定緩存或清空整個緩存;4.通過ServiceWorker監(jiān)聽fetch事件實現(xiàn)緩存優(yōu)先或網(wǎng)絡(luò)優(yōu)先等策略;5.常用於離線支持、加快重複訪問速度、預(yù)加載關(guān)鍵資源及後臺更新內(nèi)容;6.使用時需注意緩存版本控制、存儲限制及與HTTP緩存機制的區(qū)別。

處理諾言:鏈接,錯誤處理和承諾在JavaScript中 處理諾言:鏈接,錯誤處理和承諾在JavaScript中 Jul 08, 2025 am 02:40 AM

Promise是JavaScript中處理異步操作的核心機制,理解鍊式調(diào)用、錯誤處理和組合器是掌握其應(yīng)用的關(guān)鍵。 1.鍊式調(diào)用通過.then()返回新Promise實現(xiàn)異步流程串聯(lián),每個.then()接收上一步結(jié)果並可返回值或Promise;2.錯誤處理應(yīng)統(tǒng)一使用.catch()捕獲異常,避免靜默失敗,並可在catch中返回默認值繼續(xù)流程;3.組合器如Promise.all()(全成功才成功)、Promise.race()(首個完成即返回)和Promise.allSettled()(等待所有完成)

利用Array.Prototype方法用於JavaScript中的數(shù)據(jù)操作 利用Array.Prototype方法用於JavaScript中的數(shù)據(jù)操作 Jul 06, 2025 am 02:36 AM

JavaScript數(shù)組內(nèi)置方法如.map()、.filter()和.reduce()可簡化數(shù)據(jù)處理;1).map()用於一對一轉(zhuǎn)換元素生成新數(shù)組;2).filter()按條件篩選元素;3).reduce()用於聚合數(shù)據(jù)為單一值;使用時應(yīng)避免誤用導致副作用或性能問題。

JS綜述:深入研究JavaScript事件循環(huán) JS綜述:深入研究JavaScript事件循環(huán) Jul 08, 2025 am 02:24 AM

JavaScript的事件循環(huán)通過協(xié)調(diào)調(diào)用棧、WebAPI和任務(wù)隊列來管理異步操作。 1.調(diào)用棧執(zhí)行同步代碼,遇到異步任務(wù)時交由WebAPI處理;2.WebAPI在後臺完成任務(wù)後將回調(diào)放入相應(yīng)的隊列(宏任務(wù)或微任務(wù));3.事件循環(huán)檢查調(diào)用棧是否為空,若為空則從隊列中取出回調(diào)推入調(diào)用棧執(zhí)行;4.微任務(wù)(如Promise.then)優(yōu)先於宏任務(wù)(如setTimeout)執(zhí)行;5.理解事件循環(huán)有助於避免阻塞主線程並優(yōu)化代碼執(zhí)行順序。

See all articles