当前位置: 首页 > 知识库问答 >
问题:

服务工作者:缓存数据再次从服务器加载,不会触发提取

蓝侯林
2023-03-14

因此,清单已被弃用,试图在express web应用程序中实现服务工作者。这是我的项目结构:

    app.js
    views  >
            login > 
                   login.ejs 
    public >
        lib
        css
        images
        html
        js
        sw.js

在我的express应用程序中,我使用的公用文件夹如下:

app.use("/static", express.static(path.join(__dirname, 'public')));

登录。呈现的ejs模板

if ('serviceWorker' in navigator) {
    window.addEventListener('load', function() {
        navigator.serviceWorker.register('/static/sw.js').then(function(registration) {
        // Registration was successful
        console.log('ServiceWorker registration successful with scope: ', registration.scope);
        }, function(err) {
        // registration failed :(
        console.log('ServiceWorker registration failed: ', err);
        });
    });
}

注册成功。

和西南部。js

const CACHE_NAME = 'v3'

// list of files
const URLS_TO_CACHE = [
    "/static/images/favicon.ico",
    "/static/lib/bootstrap/img/off.png",
    "/static/lib/bootstrap/img/on.png",
    "/static/html/help/lib/css/style.css",
    "/static/lib/templates/login/account.js"
];

self.addEventListener("install", function (event) {
    console.log("[Service Worker] install");
    event.waitUntil(caches.open(CACHE_NAME).then(function (cache) {
        console.log("[Service Worker] Caching app shell");
        return cache.addAll(URLS_TO_CACHE);
    })
        .then(function () {
            self.skipWaiting();
        }));
});

self.addEventListener('activate', function (event) {
    console.log('[ServiceWorker] Activate');
    e.waitUntil(
        caches.keys().then(function (keyList) {
            return Promise.all(keyList.map(function (key) {
                if (key !== CACHE_NAME) {
                    console.log('[ServiceWorker] Removing old cache', key);
                    return caches.delete(key);
                }
            }));
        })
    );
    return self.clients.claim();
});

self.addEventListener('fetch', e =>{
    console.log("service worker : fetching");
    e.respondWith(
        fetch(e.request).catch(() => caches.match(e.request))
        )
});

安装

当同一个应用程序重新加载或页面导航时,读取不会触发,也不会从服务工作者加载数据,总是从服务器加载。

但是当我尝试在不同的浏览器选项卡中使用例如:http://localhost:3000/static/lib/bootstrap/img/off.png从服务人员的提取中加载。

当我研究时,我了解了范围,但这里我希望我的软件。js文件已在顶级作用域中,

我的预期行为是:在每个页面上加载/导航缓存的URL以代替服务器调用,请建议解决方法

共有1个答案

宋臻
2023-03-14

最终解决了范围问题,移动了软件。js文件从静态到项目根目录(与app.js并行),并像下面这样使用,问题解决了。

app.use('/sw', express.static(path.join(__dirname, '/sw.js')));

并更改了登录名。ejs如下所示

if ('serviceWorker' in navigator) {
    window.addEventListener('load', function() {
        navigator.serviceWorker.register('/sw.js').then(function(registration) {
        // Registration was successful
        console.log('ServiceWorker registration successful with scope: ', registration.scope);
        }, function(err) {
        // registration failed :(
        console.log('ServiceWorker registration failed: ', err);
        });
    });
}
 类似资料:
  • 我注意到,当服务工作人员脚本本身加载到浏览器中时,不再触发服务工作人员的读取事件。例如,当我们有一个新版本的服务辅助角色时,旧的服务辅助角色读取事件不会被触发。因此,旧的服务工作者不能再检查新服务工作者的内容。 我确信这以前是可能的,我想知道这是否是一个bug,或者是否对此进行了任何更改。我在官方存储库或W3C草稿中没有找到与此更改相关的任何内容。 为了验证fetch事件没有被触发,我用版本号(参

  • 我正在使用Service Worker创建一个渐进式Web应用程序,我正在使用Service Worker工具箱来缓存我的内容。Service Worker代码来缓存我的内容: 代码运行正常,因为我在控制台上没有看到任何错误。但是我如何检查是否从云前或上面配置的网址的图像正在缓存和从缓存本身渲染。

  • 我们在reactjs应用程序中安装了离线插件,该应用程序使用service worker缓存构建文件,未检查新构建的任何更新,因此,具有旧构建的用户仍在使用service worker中的缓存数据访问旧站点。这些文件没有过期设置,所以我想知道是否有任何解决方案可以强制用户刷新页面或将更新推给用户? 我在新版本中进行了更新,没有缓存头,离线插件自动更新,但我仍然无法找到将此更新推送到旧用户文件的方法

  • 我正在尝试将大量文件从服务器A传输到服务器B。我已经在A上设置了FTP(使用FileZilla)。 当我尝试从PC连接到A时,它工作正常。但当我尝试从B连接到A时,它不起作用。FTP用户登录,但目录列表命令一直处于停滞状态。 防火墙端口21已打开。我尝试了多台服务器、不同的FTP客户端,但没有用。除了FileZilla,我还尝试了内置FTP服务的ISS,得到了相同的结果。 使用相同凭据从本地完美连

  • 我正在开发一个渐进式web应用程序,目的是缓存所有离线使用的资产。这是我的服务人员 无论我是否在线,服务工作人员都无法缓存一些资产(在本例中bundle.js),并破坏了我的缓存优先系统,即使我在注册工作人员时记录了一条成功消息。 https://postimg.org/gallery/2yo1ig35y/

  • 问题内容: 我在将服务中的数据填充到视图中时遇到问题。我有这样定义的服务 和我的控制器 如果我从控制器使用$ http.get,数据将很好地填充,但是,如果我尝试从服务中调用数据,那么我什么也不会得到。我知道查询是异步的,但是我很难理解一旦返回数据就如何填充$ scope变量。我可以使用$ rootscope广播事件并在控制器中侦听它,但这似乎并不是完成此事件的正确方法。对于如何正确执行此操作的任