- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在使用 Google 的 workbox library现在有一段时间,在非常基本的水平上。大部分效果很好,但由于某些原因,我的 manifest.json
中的 start_url
未在初始页面加载时缓存(由 Lighthouse 报告,在开发工具中确认) .如果您四处浏览一下,或者软刷新页面几次,它似乎确实进行了缓存,只是最初没有进行缓存。
我假设我做错了什么,但我不清楚那是什么。演示网址和源代码如下。
import { skipWaiting, clientsClaim } from "workbox-core";
import { ExpirationPlugin } from "workbox-expiration";
import { precacheAndRoute } from "workbox-precaching";
import { setCatchHandler, registerRoute } from "workbox-routing";
import { CacheFirst, NetworkFirst } from "workbox-strategies";
skipWaiting();
clientsClaim();
/**
* Cache WordPress content
*/
registerRoute(
({ url }) => {
return (url.pathname && !url.pathname.match(/^\/(wp-admin|wp-content|wp-includes|wp-json|wp-login)/) && url.pathname.match(/\/$/));
},
new NetworkFirst({
cacheName: "new_site-content-cache",
plugins: [
new ExpirationPlugin({
maxAgeSeconds: 7 * 24 * 60 * 60,
}),
],
})
);
/**
* Cache CSS files
*/
registerRoute(
({ url }) => {
return (url.pathname && url.pathname.match(/\.css$/) && !url.pathname.match(/wp-admin|wp-includes|wp-json/));
},
new CacheFirst({
cacheName: "new_site-css-cache",
plugins: [
new ExpirationPlugin({
maxAgeSeconds: 7 * 24 * 60 * 60,
}),
],
})
);
/**
* Cache JS files
*/
registerRoute(
({ url }) => {
return (url.pathname && url.pathname.match(/\.js$/) && !url.pathname.match(/wp-admin|wp-includes|wp-json/) && !url.pathname.match(/redirection/));
},
new CacheFirst({
cacheName: "new_site-js-cache",
plugins: [
new ExpirationPlugin({
maxAgeSeconds: 7 * 24 * 60 * 60,
}),
],
})
);
/**
* Cache image files
*/
registerRoute(
({ url }) => {
return (url.pathname && url.pathname.match(/\.gif|jpeg|jpg|png|svg|webp$/) && !url.pathname.match(/wp-admin|wp-includes|wp-json/));
},
new CacheFirst({
cacheName: "new_site-image-cache",
plugins: [
new ExpirationPlugin({
maxAgeSeconds: 7 * 24 * 60 * 60,
}),
],
})
);
/**
* Cache font files
*/
registerRoute(
({ url }) => {
return (url.pathname && url.pathname.match(/\.otf|ttf|woff|woff2$/) && !url.pathname.match(/wp-admin|wp-includes|wp-json/));
},
new CacheFirst({
cacheName: "new_site-font-cache",
plugins: [
new ExpirationPlugin({
maxAgeSeconds: 7 * 24 * 60 * 60,
}),
],
})
);
/**
* Return "offline" page when visiting pages offline that haven't been cached
*/
setCatchHandler(() => {
return caches.match("/offline/");
});
/**
* Precache "offline" page
*/
precacheAndRoute([
{
url: "/offline/",
revision: __VERSION__,
},
]);
更新 1: 好的,所以我找到了 this issue我认为这是问题所在。似乎初始响应未被缓存,因为服务 worker 是在请求之后安装的,因此它没有任何内容可缓存。我仍然没有找到解决此问题的方法,但如果我取得任何进展,我会发布另一个更新。
更新 2: 似乎使用 skipWaiting()
和 clientsClaim()
是 应该解决这个问题,但在添加这些之后,它仍然没有按预期工作。奇怪的是,Lighthouse 报告“当前页面在离线时响应 200”,而且“离线时 start_url 不响应 200The start_url 确实响应,但不是通过 service worker。”这没有意义,因为它是同一个页面......也许我在尝试路由 /
时做错了什么?
更新 3: 尝试将我的第一个 registerRoute
中的最后一次检查更改为 /\/?$/
,但没有任何区别。还尝试将 NetworkFirst
更改为 CacheFirst
并且实际上工作正常......但我需要它是 NetworkFirst
,所以这不是一个真正可行的选择来解决这个问题。我也尝试过预缓存 /
,但这同样没有任何区别。
更新 4: 我怀疑 this "warm the runtime cache" recipe可能接近我的需要,但我无法成功实现...如果我对 start_url
进行硬编码,它至少会缓存 HTML,但会遗漏所有其他文件。好像this method of gathering all resources可能有用,但是 location.href
只是返回 service worker URL,即使不是,我也不确定如何将所有内容拆分到它们自己的缓存中,就像我一样'目前正在做。
最佳答案
正如the method of gathering all resources表示,页面和资源未被缓存,因为它们是在安装 service worker 之前加载的。
为什么不使用 workbox-build
在构建时注入(inject)必要的 预缓存 list ? Assets 将在服务 worker 安装时预缓存。
快速示例,将以下行添加到 service-worker.js
中:
precacheAndRoute(self.__WB_MANIFEST);
构建完成后运行以下js脚本:
const {injectManifest} = require('workbox-build');
const swSrc = 'src/sw.js';
const swDest = 'build/sw.js';
injectManifest({
swSrc,
swDest,
globDirectory: 'build',
globPatterns: ['*.@(js|css)']
}).then(({count, size}) => {
console.log(`Generated ${swDest}, which will precache ${count} files, totaling ${size} bytes.`);
});
您甚至可以将 swSrc
和 swDest
设置为相同,以在适当的位置注入(inject) list 。
我认为没有必要将 Assets 拆分到不同的缓存中,但可以使用 getManifest
模式,一次glob一种 Assets ,手动注入(inject)到service-worker.js
关于caching - Workbox 在初始加载时不缓存 start_url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64702655/
尝试产生“数字”或者可能获取start_url,然后解析start_url以获取数字: class EbaypriceSpider(Spider): name = "ebayprice"
我正在创建一个与服务人员脱机工作的 PWA。 现在它可以正常工作,但 Lighthouse Audit 存在问题。 当我运行 Lighthouse 时,在 PWA 部分我遇到了这个问题: 离线时 st
我正在尝试抓取网址并检索每个网址的h1。 url 存储在文本文件中。代码是: class MySpider(CrawlSpider): name = "sitemaplocation"
The script (下)来自 this教程包含两个 start_urls。 from scrapy.spider import Spider from scrapy.selector import
我一直在使用 Google 的 workbox library现在有一段时间,在非常基本的水平上。大部分效果很好,但由于某些原因,我的 manifest.json 中的 start_url 未在初始页
我刚刚将 scrapy 更新到 0.22,现在面临一些问题。 我使用的是基本的 Spider,只是想请求一个 start_url 并在 parse(self,response) 函数中查看结果。 cl
我想知道我可以分配给蜘蛛的 start_urls 的数量是否有限制?据我搜索,似乎没有关于列表限制的文档。 目前我已经设置了我的爬虫,以便从 csv 文件中读取 start_urls 列表。 url
我有一个工作的 scrapy 蜘蛛,我可以通过一个单独的脚本运行它,然后是 example here .我还为我的脚本创建了一个 wxPython GUI,它仅包含一个多行 TextCtrl,供用户输
我是 scrapy 和 python 的新手。我写了一个蜘蛛,它可以很好地处理初始化的 start_urls 值。 如果我在 Init 中的代码中放入文字,它也可以正常工作 { self.start_
我是 Python 和 Scrapy 新手。我希望 item['Source_Website'] 成为我正在抓取的网址。我怎样才能实现这个目标? 我尝试了 item['Source_Website']
我使用 scrapy 抓取 1000 个 url 并将抓取的项目存储在 mongodb 中。我想知道为每个网址找到了多少项目。从 scrapy stats 我可以看到 'item_scraped_co
我正在以与其他蜘蛛相同的结构运行我的蜘蛛,但对于这个特定的网站和这个特定的蜘蛛,它会在第一次请求启动 url 后关闭。可能是什么问题? 终端输出: ... 2022-04-03 17:42:34 [s
虽然我的简单代码根据 the official document 看起来不错,它会生成意外重复的结果,例如: 设置 3 个网址时为 9 行/结果 设置 2 个网址时为 4 行/结果 当我只设置 1 个
我想解析一个股票列表,所以我试图格式化我的 start_urls 的末尾列表,这样我就可以只添加符号而不是整个 url。 蜘蛛类 start_urls里面stock_list方法: class MyS
我有一个 ~2211 开始 url 的列表,scrapy 抓取了一些,但不是全部。当我将 start_url 设置为单个 url 时,它会抓取 URL,如果我在一个大列表中有 URL,scrapy 不
所以我正在使用 scrapy 库开发一个 scraper,为了便于使用,我想让它从 .csv 文件中获取它的起始 url。我已经对该主题进行了一些研究,我相信它可以正确地从 .csv 中获取 url,
背景(可略过): 我目前正在运行两个不同的 scrapy 爬虫。 第一个检索有关产品 x 的信息,第二个检索有关产品 x 的其他信息,这些信息是在第一个机器人抓取的 url 上找到的。 我的管道将每个
我已经从蜘蛛中抓取了项目,我正在编写另一个蜘蛛,它使用搜索引擎来填充一些缺失的数据。我想逐行更新第一个蜘蛛的项目。 但是,我不知道如何从 __init__ 方法传递当前行或 start_url。 我知
我正在创建 PWA 并偶然发现 manifest.json 文件中的“start_url”存在问题。我试图变成 PWA 的网站取决于查询参数,而 "start_url":"/"不会获取查询参数。 我尝
有没有办法在网络应用程序 list 中设置哈希值?类似的东西: "start_url": "/#/admin", 我试过了,但是不行。 有什么想法吗? 最佳答案 试试这个:"start_url": "
我是一名优秀的程序员,十分优秀!