离子 PWA 服务工作者 - 没有 CORS

于尔根

我需要实现 serviceworker 文件缓存,但使用 no-cors 标志。这是因为我的网络服务器上出现以下代码的 CORS 错误。代码来自标准的 Ionic 2 入门模板(在 serviceworker.js 中)。我无法使用标准代码,因为出于某种原因,请求会触发身份验证流,其中重定向到某个 URL,但由于 CORS 错误而失败。

我将如何以最好的(cq。最简单的)方式做到这一点?

// TODO: Implement this without CORS (set no-cors flag)
self.toolbox.precache(
  [
    // './build/main.js',
    // './build/vendor.js',
    // './build/main.css',
    // './build/polyfills.js',
   // 'index.html',
   // 'manifest.json'
  ]
);

编辑:这并不是真正发生的身份验证错误,用户肯定已经过身份验证。但是由于身份验证期间的重定向,对上述文件的请求出错了。我找到了这篇文章:什么是不透明请求,它的用途是什么?这表明设置 no cors 标志将是解决方案。我得到的错误,就像在那个页面上一样:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问源 ' http://abc '。如果不透明响应满足您的需求,请将请求的模式设置为“no-cors”以在禁用 CORS 的情况下获取资源。

于尔根

像下面这样自己解决了。install 事件触发应用程序在本地存储文件。

/**
 * Check out https://googlechromelabs.github.io/sw-toolbox/ for
 * more info on how to use sw-toolbox to custom configure your service worker.
 */


'use strict';
importScripts('./build/sw-toolbox.js');

self.toolbox.options.cache = {
  name: 'ionic-cache'
};

// pre-cache our key assets
// TODO: Implemente this without using CORS (set no-cors flag)
/*
self.toolbox.precache(
  [
    './build/main.js',
    './build/vendor.js',
    './build/main.css',
    './build/polyfills.js',
    'index.html',
    'manifest.json'
  ]
);
*/

// MANUAL precaching in order to evade CORS error on SharePoint

var aFilesToCache = [
  './assets/json/propertyLUT.js',
  './assets/json/propertyvalues.js',
  './build/main.js',
  './build/vendor.js',
  './build/main.css',
  './build/polyfills.js',
  'index.html',
  'manifest.json'
];

self.addEventListener('fetch', function(event) {
  console.log('Handling fetch event for', event.request.url);

  event.respondWith(

    // Opens Cache objects that start with 'font'.
    caches.open('pwa_').then(function(cache) {
      return cache.match(event.request).then(function(response) {
        if (response) {
          console.log('Found response in cache:', response);

          return response;
        } 
      }).catch(function(error) {

        // Handles exceptions that arise from match() or fetch().
        console.error('Error in fetch handler:', error);

        throw error;
      });
    })
  );
});

self.addEventListener('install', event => {
  function onInstall(event, filesToCache) {
    console.log('Hit event INSTALL');
    return Promise.all(filesToCache.map(function(aUrl) 
    {
      return caches.open('pwa_').then(function(cache) 
      {
        debugger;
        aUrl = resolveURL(aUrl, self.location.href);
        return fetch(aUrl, { mode: 'no-cors' })
            .then(function(response) 
            {
              return cache.put(aUrl, response.clone());
            });

      })
    }))
  }

  event.waitUntil(
    onInstall(event, aFilesToCache).then( () => self.skipWaiting() )
  );
});

function resolveURL(relative, base) {
  var stack = base.split("/"),
      parts = relative.split("/");
  stack.pop(); // remove current file name (or empty string)
               // (omit if "base" is the current folder without trailing slash)
  for (var i=0; i<parts.length; i++) {
      if (parts[i] == ".")
          continue;
      if (parts[i] == "..")
          stack.pop();
      else
          stack.push(parts[i]);
  }
  return stack.join("/");
}
/*
foreach(aUrl in aFilesToCache)
{
  var corsRequest = new Request(url, {mode: 'no-cors'});
  fetch(corsRequest).then(response => {
    return cache.put("pwa_" + url, response);
  }); // response won't be opaque.
}
*/

// dynamically cache any other local assets
self.toolbox.router.any('/*', self.toolbox.fastest);

// for any other requests go to the network, cache,
// and then only use that cached resource if your user goes offline
self.toolbox.router.default = self.toolbox.networkFirst;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

PWA-服务工作者(反应)如何工作?

PWA:如果我的Web应用程序有没有清单文件的服务工作者,会发生什么?

PWA服务工作者缓存/更新预期行为

如何防止服务工作者删除缓存,PWA

服务工作者在Firefox上导致CORS问题

具有SSL证书缓存的服务工作者

使用Workbox CLI及其服务工作者生成器的PWA无法离线工作

使用 PWA 服务工作者在离线模式下保存/提供 Web 服务

创建反应应用程序 pwa 打字稿模板无法检测服务工作者

React PWA:如何正确设置清单文件并注册服务工作者

Angular PWA错误无法安装站点:未检测到匹配的服务工作者

在线时影响非 GET 请求的服务工作者 - @angular/pwa

同时使用GWT火力地堡服务工作者没有找到(404错误)

由于PWA服务工作者缓存,Auth basic 401页面不提示输入凭据

如何在其他所有请求之前加载服务工作者?

如何安装带有单个Javascript标记的服务工作者和清单?

将服务工作者保存在缓存中有意义吗?

具有自签名证书的高级Web应用程序服务工作者

需要有关在域中使用多服务工作者的信息

成功注册服务工作者后,为什么没有点击ServiceWorkerRegistration回调?

Ionicview和离子服务CORS

Vue CLI 4 - 清单中的 PWA 插件预缓存无法获取 index.html 并且未注册服务工作者

服务工作者列出缓存中的所有URL并传递给另一个函数

`pushManager.subscribe`和`pushManager.getSubscription`服务工作者之间有什么区别

离子 - 被 CORS 政策阻止:没有“访问控制允许来源”

有没有办法告诉您是否正在从服务工作者那里获取缓存的数据?

带有ReactJS和Webpack的Firebase FCM无法正常工作:我们无法注册默认服务工作者

离子PWA部署

Chrome DevTools“禁用缓存”:它除了做什么外(对于服务工作者脚本)实际上有什么作用?