Yahoo奇摩 網頁搜尋

搜尋結果

  1. 在你写 CSS 的时候你经常会遇到溢出的情形,尤其是当你以后更加深入到 CSS 布局的时候。 CSS 尽力减少“数据损失” 我们从两个展示了在碰到溢出的时候,CSS 默认会如何处理的例子开始吧。

  2. 出错信息显示“guessSubmit.addeventListener 不是一个函数”,说明这里可能存在拼写错误。. 如果你不确定某语法的拼写是否正确,可以到 MDN 上去查找,目前最简便的方法就是去你喜欢的搜索引擎搜索“MDN + 语言 特性”。. 就本文当前内容你可以点击 : addEventListener ...

  3. 你將會看到"Mozilla is cool,",該結果的原因非常簡單的可以理解。 如果你想避免產生這些問題,你應該檢查使用者是否輸入了 null 或是空白的名字。 試著透過修改 setUserName() 來應對這些問題,結果如下:

    • 概览
    • Service worker 的背景
    • 使用 service worker 的准备工作
    • 基本步骤
    • 演示
    • 恢复失败的请求
    • Service Worker 导航预加载
    • 更新你的 service worker
    • 开发者工具

    本文是关于使用 service worker 的教程,包括讲解 service worker 的基本架构、怎么注册 service worker、新的 service worker 的安装以及激活的过程、怎么更新 service worker 还有它的缓存控制和自定义响应,这一切都在一个简单的离线的应用程序中。

    有一个困扰 web 用户多年的难题——丢失网络连接。即使是世界上最好的 web app,如果下载不了它,也是非常糟糕的体验。如今虽然已经有各种尝试来创造技术去尝试着解决这个问题,并且其中一些问题已经被解决。但是,最重要的问题是,仍然没有一个好的统筹机制对资源缓存和自定义的网络请求进行控制。

    Service worker 修复了这个问题。使用 service worker,你可以将 app 设置为首先使用缓存资源,从而即使在离线状态,也可以提供默认的体验,然后从网络获取更多数据(通常称为“离线优先”)。这已经在原生 app 中可用,这是经常选择原生 app,而不是选择 web app 的主要原因之一。

    service worker 在现代浏览器中默认开启。要使用 service worker 运行代码,你需要通过 HTTPS 提供你的代码——出于安全原因,Service worker 仅限在 HTTPS 上运行。支持 HTTPS 的服务器是必要的。为了托管实验代码,你可以使用 Github、Netlify、Vercel 等服务。为了促进本地开发,浏览器也认为 localhost 是一个安全的来源。

    通常遵循以下基本步骤来使用 service worker:

    1.获取 service worker 代码,然后使用 serviceWorkerContainer.register() 来注册。如果成功,service worker 将在 ServiceWorkerGlobalScope 中执行;这本质上是一种特殊的上下文,在主脚本执行线程之外运行,没有访问 DOM 的权限。Service Worker 现在已为处理事件做好准备。

    2.安装完成。install 事件始终是发送给 service worker 的第一个事件(这可用于启动填充 IndexedDB 和缓存站点资源的过程)。在此步骤期间,应用程序正在为离线可用做准备。

    3.当 install 程序处理完成时,service worker 被视为已安装。此时,service worker 的先前版本可能处于激活的状态并控制着打开的页面。由于我们不希望同一 service worker 的两个不同版本同时运行,因此新版本尚未激活。

    4.一旦 service worker 的旧版本控制的页面都已关闭,就可以安全地停用旧版本,并且新安装的 service worker 将收到 activate 事件。activate 的主要用途是去清理 service worker 之前版本使用的资源。新的 service worker 可以调用 skipWaiting() 要求立即激活,而无需要求打开的页面关闭。然后,新的 service worker 将立即收到 activate 事件,并将接管任何打开的页面。

    5.激活后,service worker 将立即控制页面,但是只会控制那些在 register() 成功后打开的页面。换句话说,文档必须重新加载才能真正的受到控制,因为文档在有或者没有 service worker 的情况下开始存在,并在其生命周期内维护它。为了覆盖次默认行为并在页面打开的情况下,service worker 可以调用 clients.claim() 方法。

    注册你的 worker

    在我们 app 的 JavaScript 文件(app.js)的第一个代码块中如下所示。这是我们使用 service worker 的入口点。 1.if 代码块进行特性检测测试,以确保在尝试注册 service worker 之前,该特性是被支持的。 2.接着,我们使用 ServiceWorkerContainer.register() 函数来注册站点的 service worker。service worker 代码只是一个驻留在我们的 app 内的一个 JavaScript 文件(注意,这个文件的 URL 是相对于源(origin)的,而不是相对于引用它的那个 JS 文件)。 3.scope 参数是可选的,并且可以用来指定你想要 service worker 控制的子作用域。在这个例子中,我们指定了 '/',其表示 app 的源(origin)下的所有内容。如果你留空的话,它的默认值也是这个,但是我们在这里指定它是为了更明确的阐述我们的目的。

    安装和激活:填充你的缓存

    在你的 service worker 注册之后,浏览器会尝试为你的页面或站点安装并激活它。 install 事件会在注册成功完成之后触发。install 事件通常会这样用,将离线运行 app 产生的资源放置在浏览器离线缓存的空间。为了实现这个,我们使用了 Service Worker 的存储 API——cache——一个 service worker 上的全局对象,它使我们可以存储网络响应发来的资源,并且根据它们的请求来生成 key。这个 API 和浏览器的标准的缓存工作原理很相似,但它特定于你的域的。直到你清理它们之前,这些内容都会持久存在。 以下是我们的 service worker 如何处理 install 事件: 1.这里我们新增了一个 install 事件监听器去监听 service worker(这里指的是 self),接着在事件上调用 ExtendableEvent.waitUntil() 方法——这会确保 Service Worker 不会在 waitUntil() 里面的代码执行完毕之前安装完成。 2.在 addResourcesToCache() 内,我们使用了 caches.open() 方法来创建了叫做 v1 的新缓存,这将会是我们的站点资源缓存的第 1 个版本。然后我们会在创建的缓存示例中调用 addAll() 函数,它的参数采用一个 URL 数组,指向你想要缓存的所有资源。其中,URL 是相对于 worker 的 location (en-US)。 3.如果 promise 被拒绝,安装就会失败,这个 worker 不会做任何事情。这也是可以的,因为你可以修复你的代码,在下次注册的时候再次进行尝试。 4.当安装成功完成之后,service worker 就会激活。在你的 service worker 第一次完成安装/激活时,这并没有什么用。但是当 service worker 更新(稍后查看更新你的 service worker 部分)的时候,就不太一样了。

    自定义请求的响应

    现在你已经将你的站点资源缓存了,你需要告诉 service worker 让它用这些缓存内容来做点什么。有了 fetch 事件,这是很容易做到的。 1.每次获取 service worker 控制的资源时,都会触发 fetch 事件,这些资源包括了指定的作用域内的文档,和这些文档内引用的其他任何资源(比如 index.html 发起了一个跨源的请求来嵌入一个图片,这个也会通过 service worker)。 2.你可以给 service worker 添加一个 fetch 的事件监听器,接着调用 event 上的 respondWith() 方法来劫持我们的 HTTP 响应,然后你用可以用自己的方法来更新它们。 3.在任何情况下,我们会首先响应缓存的 URL 和网络请求的 URL 相匹配的资源: caches.match(event.request) 允许我们对网络请求里的每个资源与缓存里可获取的等效资源进行匹配,查看缓存中是否有相应的资源。该匹配通过 URL 和各种标头进行,就像正常的 HTTP 请求一样。

    在 service worker 的缓存中存在相匹配的资源时,caches.match(event.request) 是非常棒的。但是如果没有匹配资源呢?如果我们不提供任何错误处理,promise 就会兑现 undefined,因而我们不会得到任何内容。

    在测试缓存的响应后,我们可以退回到常规网络请求:

    如果资源不存在缓存中,它们则会从网络中进行请求。

    使用更复杂的策略,我们不仅可以从网络中请求资源,还可以将其保存到缓存中,以便稍后对该资源的请求也可以离线检索。这意味着,如果将额外的图像添加到星球大战图库中,我们的 app 可以自动抓取并缓存它们。以下片段实现了这样的策略:

    如果请求 URL 在缓存中不可用,我们将使用 await fetch(request) 从网络请求中请求资源。之后,我们将响应的克隆放入缓存。putInCache() 函数使用 caches.open('v1') 和 cache.put() 将资源增加到缓存中。它的原始响应会返回给浏览器以提供给调用它的页面。

    克隆响应是必要的,因为请求和响应流仅可以读取一次。为了返回响应到浏览器,并将其放入缓存中,我们得克隆它。因此原始的资源会返回给浏览器,克隆的资源会发送到缓存。它们都只能被读取一次。

    如果启用了导航预加载 (en-US)功能,其将在发出 fetch 请求后,立即开始下载资源,并同时激活 service worker。这确保了在导航到一个页面时,立即开始下载,而不是等到 service worker 被激活。这种延迟发生的次数相对较少,但是一旦发生就不可避免,而且可能很重要。

    首先,必须在 service worker 激活期间使用 registration.navigationPreload.enable() (en-US) 来启用该功能:

    然后使用 event.preloadResponse (en-US) 等待预加载的资源在 fetch 事件处理程序中完成下载。

    继续前几节的示例,我们插入代码,以便在缓存检查后等待预加载的资源,如果失败,则再从网络中获取。

    新流程是:

    1.检查缓存

    如果你的 service worker 已经被安装,但是刷新页面时有一个新版本的可用,新版的 service worker 会在后台安装,但是仍然不会被激活。当不再有任何已加载的页面在使用旧版的 service worker 的时候,新版本才会激活。一旦再也没有这样的已加载的页面,新的 service worker 就会被激活。

    你想把你的新版的 service worker 里的 install 事件监听器改成下面这样(注意新的版本号):

    当安装发生的时候,前一个版本依然在响应请求。新的版本正在后台安装。我们调用了一个新的缓存 v2,所以前一个 v1 版本的缓存不会被扰乱。

    当没有页面在使用之前的版本的时候,这个新的 service worker 就会激活并开始响应请求。

    •Chrome

    •Firefox

    •Firefox 工具栏自定义选项中的“Forget about this site”按钮可用于清除 service worker 及其缓存。

    •Edge

  4. 我們從理論開始,逐漸熟悉使用 JavaScript 的原因,以及你可以用它做些什麼。 過程中你看到了一些程式碼範例,學到如何將 JavaScript 與你網站的其它東西放在一起。

  5. 概览. HTTP 缓存会存储与请求关联的响应,并将存储的响应复用于后续请求。. 可复用性有几个优点。. 首先,由于不需要将请求传递到源服务器,因此客户端和缓存越近,响应速度就越快。. 最典型的例子是浏览器本身为浏览器请求存储缓存。. 此外,当响应可 ...

  6. 原因是缓存可能会被浏览器或用户清除。 虽然这不太可能发生,但如果不能回退到网络请求,会导致 PWA 不可用。 参见 删除缓存数据 。

  1. 其他人也搜尋了