- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此问题仅发生在 Netlify 的生产环境中。它不会出现在开发环境中。
通常,我潜伏并搜索以找到答案,或者从相关答案中汇总一些东西,但是这个让我很难过......
我有一个在 Netlify 上运行的 Vue CLI 项目,设置了一个过去部署的 PWA。
服务 worker 应该正在运行,并且可以安装应用程序以供离线使用。
现在它在控制台中给了我这个错误:
Uncaught (in promise) bad-precaching-response: bad-precaching-response :: [{"url":"https://<domain>/_redirects?__WB_REVISION__=d38a2b58df330c85e0029eecf71d7c26","status":404}]
at l.o (https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-precaching.prod.js:1:1749)
at async Promise.all (index 0)
at async l.install (https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-precaching.prod.js:1:1221)
const isValidResponse = cacheWillUpdateCallback ?
// Use a callback if provided. It returns a truthy value if valid.
cacheWillUpdateCallback({event, request, response}) :
// Otherwise, default to considering any response status under 400 valid.
// This includes, by default, considering opaque responses valid.
response.status < 400;
// Consider this a failure, leading to the `install` handler failing, if
// we get back an invalid response.
if (!isValidResponse) {
throw new WorkboxError('bad-precaching-response', {
url,
status: response.status,
});
}
{
"name": "<app-name>",
"version": "0.2.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"capacitor-copy": "vue-cli-service capacitor-copy",
"capacitor-init": "vue-cli-service capacitor-init",
"capacitor-open": "vue-cli-service capacitor-open",
"capacitor-update": "vue-cli-service capacitor-update",
"css:build": "postcss src/css/styles.css -o public/styles.css"
},
"dependencies": {
"@capacitor/cli": "^1.0.0-alpha.38",
"@capacitor/core": "^1.0.0-alpha.38",
"@fullhuman/postcss-purgecss": "^1.3.0",
"axios": "^0.19.1",
"core-js": "^3.4.4",
"moment": "^2.24.0",
"postcss": "^7.0.26",
"postcss-cli": "^6.1.3",
"register-service-worker": "^1.6.2",
"tailwindcss": "^1.1.4",
"vue": "^2.6.10",
"vue-router": "^3.1.3",
"vue-uuid": "^1.1.1",
"vuex": "^3.1.2"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^4.2.2",
"@vue/cli-plugin-eslint": "^4.2.2",
"@vue/cli-plugin-pwa": "^4.2.0",
"@vue/cli-plugin-router": "^4.2.2",
"@vue/cli-plugin-vuex": "^4.2.2",
"@vue/cli-service": "^4.1.0",
"babel-eslint": "^10.0.3",
"eslint": "^5.16.0",
"eslint-plugin-vue": "^5.0.0",
"vue-cli-plugin-pwa": "^1.0.0-alpha.1",
"vue-template-compiler": "^2.6.10"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"rules": {},
"parserOptions": {
"parser": "babel-eslint"
}
},
"browserslist": [
"> 1%",
"last 2 versions"
]
}
{
"short_name": "<name>",
"name": "<name>",
"description": "I have no idea what I'm doing with these build tools.",
"icons": [
{
"src": "./img/icons/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "./img/icons/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
},
{
"src": "./img/icons/apple-touch-icon-152x152.png",
"sizes": "152x152",
"type": "image/png"
},
{
"src": "./img/icons/favicon-16x16.png",
"sizes": "16x16",
"type": "image/png"
},
{
"src": "./img/icons/favicon-32x32.png",
"sizes": "32x32",
"type": "image/png"
},
{
"src": "./img/icons/msapplication-icon-144x144.png",
"sizes": "144x144",
"type": "image/png"
},
{
"src": "./img/icons/safari-pinned-tab.png",
"sizes": "144x144",
"type": "image/png"
}
],
"start_url": ".",
"background_color": "#2d3748",
"display": "standalone",
"scope": "/",
"theme_color": "#2d3748"
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta name="theme-color" content="#2d3748"/>
<link rel="manifest" href="manifest.json">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<link rel="stylesheet" href="<%= BASE_URL %>styles.css">
<title>NAME</title>
</head>
<body>
<noscript>
<strong>This app doesn't work at all without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
最佳答案
我发现了问题:
这是我在测试时的想法,也发布在其他地方:
我需要已发布的构建目录中的 _redirects 文件,但我想将它从生成的 list 中排除,服务 worker 使用该 list 来过滤到本地或 Internet Assets 的流量。
所以我将尝试为 _redirects 指定一个排除项
尝试:
从这里更改我的 vue.config.js(vue CLI 项目中 webpack.config 的代理):
module.exports = {
devServer: {
host: 'lite.bdfi.test'
},
pwa: {
name: 'BDFI',
themeColor: '#2d3748',
msTileColor: '#2d3748',
appleMobileWebAppCapable: 'no',
appleMobileWebAppStatusBarStyle: 'default',
manifestPath: 'manifest.json',
workboxPluginMode: 'GenerateSW'
}
}
对此:
module.exports = {
devServer: {
host: 'lite.bdfi.test'
},
pwa: {
name: 'BDFI',
themeColor: '#2d3748',
msTileColor: '#2d3748',
appleMobileWebAppCapable: 'no',
appleMobileWebAppStatusBarStyle: 'default',
manifestPath: 'manifest.json',
workboxPluginMode: 'InjectManifest',
workboxOptions: {
// swSrc is required in InjectManifest mode.
swSrc: 'service-worker.js',
// ...other Workbox options...
exclude: [/_redirects/],
}
}
}
这意味着我现在正在为 service worker 指定输入,所以我需要从某个地方获取 service worker。
workbox.core.setCacheNameDetails({prefix: "lite-bdfi-app"});
self.addEventListener('message', (event) => {
if (event.data && event.data.type === 'SKIP_WAITING') {
self.skipWaiting();
}
});
self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
构建后与注入(inject)的 list 和工作箱脚本相同:
importScripts("/precache-manifest.54b556dfe16cf1359c2f3257fa76ade9.js", "https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
而且,本地“dist”目录确认“_redirects”文件被省略。
PrecacheController.mjs:194 Uncaught (in promise) bad-precaching-response: bad-precaching-response :: [{"url":"http://127.0.0.1:8887/css/app.159bf243.css.map?__WB_REVISION__=b04e3357da21d1241e39","status":404}]
at l.o (https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-precaching.prod.js:1:1749)
at async Promise.all (index 0)
at async l.install (https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-precaching.prod.js:1:1221)
n @ WorkboxError.mjs:30
o @ PrecacheController.mjs:194
看起来很眼熟,现在有 5 个,都在寻找扩展名为 .map 的文件……
workboxOptions: {
// swSrc is required in InjectManifest mode.
swSrc: 'service-worker.js',
// ...other Workbox options...
exclude: [/\.map$/, /_redirects/], //this fixed it.
}
再次运行构建,检查 dist 文件夹 list , list 中不包含 .map 文件。
关于vue.js - 部署到生产 Netlify 的 Vue CLI 3 PWA 提供 Workbox 错误 : bad-precaching-response . .._redirects?__WB_REVISION__...404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60189243/
我正在尝试为一个小型静态站点设置一个简单的 Service Worker,但出现 Service Worker 控制台错误:sw.js:59 Uncaught TypeError: workbox.e
我正在开发一个 pwa(带有类星体的 vue 应用程序),我真的很困惑,因为按照指示包含选项会导致我的服务 worker workbox.core.skipWaiting() 中的指令导致Servic
有人可以帮忙告诉我如何使用 workbox-build 缓存谷歌字体吗?我想在文件中包含要预缓存的 url,但这对我来说是不可能的。与普通的 service worker 不同,我所要做的就是在安装事
我正在玩工作箱,但出现以下错误: Skipping file 'app.js' due to size. [Max size supported is 2097152, this file is 47
我在 Wokbox 中遇到了一个似乎是 Sitecore 错误的问题。当“每页项目”下拉菜单设置为“全部”以外的任何内容时,我可以展开工作流程中的“草稿”和“等待批准”列表。 但是当“每页项目数”设置
我是服务人员的新手,并且正在使用Workbox来预缓存我的应用程序 shell 并缓存我的api数据。 Assets 的预缓存工作正常,正在创建和填充缓存。 在我第二次重新加载页面之前,运行时缓存不会
默认情况下 Sitecore 工作框显示项目名称,我想显示“标题”字段(自定义字段)。我怎样才能做到这一点? 最佳答案 我有一个类似的要求,客户需要 Workbox 来显示项目的“路径”而不是它的名称
在某些操作的 sitecore 工作箱中,我们可以通过关闭“禁止消息”属性来允许用户输入一些评论。是否有可能使它们成为必需? 最佳答案 我写了一篇关于为 发表评论的博客文章拒绝 命令是强制性的。您应该
我有一个 Sitecore 工作流程。当我使用项目旁边的“批准”按钮批准项目时,它会要求发表评论。当我使用“批准”(选定)或“批准”(全部)按钮批准多个项目时,它不会要求发表评论。这是为什么?我可以让
我正在使用 create-react-app 和 react-app-rewired-workbox 构建一个 React 应用程序使用工作箱。 我想使用 workbox 的 networkOnly
我想要一个数组来配置部分路径(当响应与请求的 URL 匹配时缓存响应)和过期时间(在 X 秒后使缓存过期),但我无法创建“处理程序” ' 才能正常工作。 这是配置路径和过期时间的数组: const P
我一直在使用 Google 的 workbox library现在有一段时间,在非常基本的水平上。大部分效果很好,但由于某些原因,我的 manifest.json 中的 start_url 未在初始页
我正在使用 Nuxt.js 框架,我的 WorkBox 配置如下所示 workbox: { workboxURL: 'https://cdn.jsdelivr.net/npm/workbox-
我希望使用 Workbox 缓存本地和远程图像 Assets 。目前是否支持,如果支持,如何支持? 基本上我想有以下功能: workboxBuild.injectManifest({ swSr
我已经实现了 Workbox 来使用 webpack 生成我的服务 worker 。 这很好用 - 我可以确认 revision运行时在生成的服务 worker 中更新 yarn run genera
我正在处理我的 PWA 应用程序。 所以我有一个问题,我找不到任何如何解决的信息。 我将工作箱与 webpack InjectManifest 一起使用(但也尝试过 webpack offline-p
如何在 WorkboxSW 中使用以下代码来注册所有每个缓存 URL 的路由。这个每个缓存的 url 包含 ajax,也会发送到服务器! $.ajax({ url : '/MyAPI/Recor
我正在尝试使用 Workbox 缓存整个页面,但它无法按照我的要求工作我只想缓存而不是 html 我想使用 Image、Js、Css 缓存整个页面目前它仅缓存 html workbox.routing
在 javascript webapp 的服务 worker 中使用 Workbox。想要清除所有内容的整个工作箱/应用程序缓存...基本上回到与第一次将应用程序加载到浏览器之前的状态尽可能相似的状态
通常每当我阅读有关 PWA 的博客文章时,该教程似乎只是预缓存每一个 Assets 。但这似乎有点违背应用程序外壳模式,据我了解,它是:缓存最基本的必需品(仅应用程序外壳),并在运行时缓存运行时。 (
我是一名优秀的程序员,十分优秀!