服务工作者无法在具有节点js服务器的脱机模式下工作

B. *_* B. 6 javascript localhost node.js service-worker progressive-web-apps

  • 我正在尝试使用脱机第一个策略构建PWA.
    • 源文件的服务器NodeJS服务器.
    • 我目前正在localhost节点服务器上测试它(不确定它有影响吗?).
    • 服务工作者+缓存似乎很好,但在离线模式下我只能获得Chrome离线页面.

让我们进入细节:

提供的页面(通过http:// localhost:8080/place/test url)有一些客户端JS,我在其中注册一个Service Worker:

client.js

    if ('serviceWorker' in navigator) {
        navigator.serviceWorker
                 .register(rootPath+'/js/service-worker.js')
                 .then(function() { console.log('Service Worker Registered'); });
    }
Run Code Online (Sandbox Code Playgroud)

service-worker.js(基于Google PWA教程)

var cacheName = 'myCacheVersion';
var filesToCache = [
    '../',
    '../place/test',
    '../js/client.js',
    '../js/service-worker.js',
    "../css/style.css"
];


self.addEventListener('install', function(e) {
  console.log('[ServiceWorker] Install');
  e.waitUntil(
    caches.open(cacheName).then(function(cache) {
      console.log('[ServiceWorker] Caching app shell');
      return cache.addAll(filesToCache);
    })
  );
});

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

self.addEventListener('fetch', function(e) {
  console.log('[ServiceWorker] Fetch', e.request.url);
  e.respondWith(
    caches.match(e.request).then(function(response) {
      return response || fetch(e.request);
    })
  );
});
Run Code Online (Sandbox Code Playgroud)

在Dev Tools控制台中,一切似乎都很好:

  • SW已注册
  • 缓存包含我想要缓存的元素

但是,当我选中离线模式复选框并刷新我的页面网址:http:// localhost:8080/place/test时,我只会获得Google Chrome离线网页.

=>我在那里错过了什么?(它与nodeJs有关吗?与localhost环境一起?我的实现?)

我一直在努力与这一个...现在...

我已经检查了"应用程序"选项卡,我的服务工作人员显示为已激活且正在运行.

注意:如果在这里找到类似的问题,但那里没有令人满意的答案:服务工作者不能使用nodejs服务器在离线模式下运行

Ed.*_*Ed. 8

从根本上说,这与此处回答的问题相同:服务工作者正在缓存文件,但从未触发获取事件

如果您查看控制台,您会看到在安装,激活,缓存和注册都发生时,"获取"不会.这是因为您找到了服务工作者js,因此出于安全原因,Chrome(等)不会将其用于除同一目录或下面的URL之外的任何URL.

如果你把你的client.jsservice-worker.js放在同一级别而不是在js子目录中,它将全部开始工作.这将需要更新文件的内容,我将在下面显示以供参考.

一个小小的警告:我愚蠢地在Windows机箱上使用IIS来处理这个问题,在它和Chrome之间,他们就像过时的JS文件位置那样对缓存的HTML文件感到严峻的死亡.我不得不将它们复制到一个子目录中,制作新的URL来测试解决方案.

index.html:

<head>
<script src="client.js"></script>
</head>
<body>
<a href="cachetest.html">link to ct</a>
</body>
Run Code Online (Sandbox Code Playgroud)

cachetest.html:

<head>
<script src="client.js"></script>
</head>
<body>cachetest</body>
Run Code Online (Sandbox Code Playgroud)

client.js:

if ('serviceWorker' in navigator) {
    navigator.serviceWorker
             .register('service-worker.js')
             .then(function() { console.log('Service Worker Registered'); });
}
Run Code Online (Sandbox Code Playgroud)

serviceworker.js:

var cacheName = 'myCacheVersion';
var filesToCache = [
    '',
    'cachetest.html',
    'client.js',
    'service-worker.js',
//    "css/style.css"
];


self.addEventListener('install', function(e) {
  console.log('[ServiceWorker] Install');
  e.waitUntil(
    caches.open(cacheName).then(function(cache) {
      console.log('[ServiceWorker] Caching app shell');
      return cache.addAll(filesToCache);
    })
  );
});

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

self.addEventListener('fetch', function(e) {
  console.log('[ServiceWorker] Fetch', e.request.url);
  e.respondWith(
    caches.match(e.request).then(function(response) {
      return response || fetch(e.request);
    })
  );
});
Run Code Online (Sandbox Code Playgroud)

  • 你钉了它!我只需要**将我的service-worker.js移到我的根目录**,并对文件路径+缓存文件列表路径进行一些更改以使其起作用即可...稍后注意:仅记住service-worker可以访问其级别或更低的级别...非常感谢!(我赞成您的回答,但这里是新手,它尚未显示...) (2认同)