Angular 服务工作者问题的模板缓存
Angular Template Cache with Service Worker Issue
我有一个 gulp 设置,可以将我所有的 html 放入模板缓存中,以便在 angular 中更快地访问。我正在尝试使用 sw-precache 将服务工作者添加到我的项目中,以便它可以离线使用。如果我连接到网络,一切正常。当我离线时,对 html 资源(在模板缓存中)的请求失败,因为它似乎正在从网络请求路径。
我是否需要在我的 sw-precache 配置中添加一些东西才能让它推迟到 angular 来处理 html 文件的检索?
好的,这就是我解决这个问题的方法。我正在使用带有 sw-precache 的 Angular JS 1.6.4。
我通过 service workers 有 CacheStorage,所以使用 service workers 我知道我希望设备支持某些功能,在我的情况下,我们知道我们的用户将拥有 Android 平板电脑 Chrome 和支持有效。
我正在开发具有离线功能的渐进式网络应用程序。
那么,理论...我有指令,其中有模板Urls。
使用这个 post:https://thinkster.io/templatecache-tutorial
我基本上有我的指令代码:
angular.module('app').directive('location',
['$timeout', 'notify.service', 'user.settings.service', 'log.service',
function ($timeout, notify, userSettings, log) {
return {
restrict: 'EA',
... controller etc..,
templateUrl: '/App/core/directives/location.html'
}
}
]);
现在,当此应用程序离线时,内容的缓存实例不会启动 - 烦人。
所以,在拖延很久之后,我变得沮丧和肮脏。
我的解决方案是,保持模板不变Url,但通过 $templateCache 服务覆盖内容。
为此,您在指令中附加一个 运行 函数(为清楚起见)。我们知道 Url 文件的服务工作者缓存表示包含公共路径,在我的例子中是:'/App/core/directives/location.html'。
因此,在浏览器中使用新技术,window.caches 让我可以访问服务人员使用的 CacheStorage,然后我可以使用 API 可用的:https://developer.mozilla.org/en-US/docs/Web/API/Cache
然后我可以使用 match 方法找到匹配的 service worker 缓存内容,读取二进制流并转换为 HTML,然后告诉 $templateCache 用 service worker 缓存值替换它。
因此,为了完整性(您可以创建一个通用服务来替换基于模板的缓存值 Url - 我将为每个指令执行此操作)
(function () {
'use strict';
var templateUrl = '/App/core/directives/location.html';
// <location on-location='someFunc'></location>
// provides a form/control to find a location either by GEO location or manual city search
angular.module('app')
.run(['$templateCache', function ($templateCache) {
var cache = window.caches;
cache.match(templateUrl, { ignoreSearch: true }).then(function (response) {
if (response) {
response.body.getReader().read().then(function (cachedResponse) {
// convert the Uint8Array value to HTML string
var content = new TextDecoder('utf-8').decode(cachedResponse.value);
$templateCache.put(templateUrl, content);
//console.log($templateCache.get(templateUrl)); // debug
});
}
});
}])
.directive('location',
['$timeout', 'notify.service', 'user.settings.service', 'log.service',
function ($timeout, notify, userSettings, log) {
return {
restrict: 'EA',
... controller, scope etc...
templateUrl: templateUrl
}
}
]);
})();
缺点...运行 过程是同步的,因此最初他们必须先在线访问该站点...但这就是 service worker 无论如何需要工作的方式,所以这在培训中得到处理:)
我希望有更好的选择,但目前这就是我的解决方案,我将创建一个模板服务,用于根据 var 模板 Url 每个指令替换 $templateCache 值有,所以代码在每个指令中变得更清晰....我考虑过有一个全局的模板和文件,但是,有点模糊,认为每个指令都更清晰
我的原始解决方案不是 100%
要解决这个问题,请使用 sw-precache 和 sw-toolbox
使用 gulp 配置,您可以设置 sw-precache 来缓存您的内容,并使用 sw-toolbox 扩展它以使用基于路由配置的缓存响应
参见:https://developers.google.com/web/ilt/pwa/using-sw-precache-and-sw-toolbox
我有一个 gulp 设置,可以将我所有的 html 放入模板缓存中,以便在 angular 中更快地访问。我正在尝试使用 sw-precache 将服务工作者添加到我的项目中,以便它可以离线使用。如果我连接到网络,一切正常。当我离线时,对 html 资源(在模板缓存中)的请求失败,因为它似乎正在从网络请求路径。
我是否需要在我的 sw-precache 配置中添加一些东西才能让它推迟到 angular 来处理 html 文件的检索?
好的,这就是我解决这个问题的方法。我正在使用带有 sw-precache 的 Angular JS 1.6.4。
我通过 service workers 有 CacheStorage,所以使用 service workers 我知道我希望设备支持某些功能,在我的情况下,我们知道我们的用户将拥有 Android 平板电脑 Chrome 和支持有效。
我正在开发具有离线功能的渐进式网络应用程序。
那么,理论...我有指令,其中有模板Urls。
使用这个 post:https://thinkster.io/templatecache-tutorial
我基本上有我的指令代码:
angular.module('app').directive('location',
['$timeout', 'notify.service', 'user.settings.service', 'log.service',
function ($timeout, notify, userSettings, log) {
return {
restrict: 'EA',
... controller etc..,
templateUrl: '/App/core/directives/location.html'
}
}
]);
现在,当此应用程序离线时,内容的缓存实例不会启动 - 烦人。
所以,在拖延很久之后,我变得沮丧和肮脏。
我的解决方案是,保持模板不变Url,但通过 $templateCache 服务覆盖内容。
为此,您在指令中附加一个 运行 函数(为清楚起见)。我们知道 Url 文件的服务工作者缓存表示包含公共路径,在我的例子中是:'/App/core/directives/location.html'。
因此,在浏览器中使用新技术,window.caches 让我可以访问服务人员使用的 CacheStorage,然后我可以使用 API 可用的:https://developer.mozilla.org/en-US/docs/Web/API/Cache
然后我可以使用 match 方法找到匹配的 service worker 缓存内容,读取二进制流并转换为 HTML,然后告诉 $templateCache 用 service worker 缓存值替换它。
因此,为了完整性(您可以创建一个通用服务来替换基于模板的缓存值 Url - 我将为每个指令执行此操作)
(function () {
'use strict';
var templateUrl = '/App/core/directives/location.html';
// <location on-location='someFunc'></location>
// provides a form/control to find a location either by GEO location or manual city search
angular.module('app')
.run(['$templateCache', function ($templateCache) {
var cache = window.caches;
cache.match(templateUrl, { ignoreSearch: true }).then(function (response) {
if (response) {
response.body.getReader().read().then(function (cachedResponse) {
// convert the Uint8Array value to HTML string
var content = new TextDecoder('utf-8').decode(cachedResponse.value);
$templateCache.put(templateUrl, content);
//console.log($templateCache.get(templateUrl)); // debug
});
}
});
}])
.directive('location',
['$timeout', 'notify.service', 'user.settings.service', 'log.service',
function ($timeout, notify, userSettings, log) {
return {
restrict: 'EA',
... controller, scope etc...
templateUrl: templateUrl
}
}
]);
})();
缺点...运行 过程是同步的,因此最初他们必须先在线访问该站点...但这就是 service worker 无论如何需要工作的方式,所以这在培训中得到处理:)
我希望有更好的选择,但目前这就是我的解决方案,我将创建一个模板服务,用于根据 var 模板 Url 每个指令替换 $templateCache 值有,所以代码在每个指令中变得更清晰....我考虑过有一个全局的模板和文件,但是,有点模糊,认为每个指令都更清晰
我的原始解决方案不是 100%
要解决这个问题,请使用 sw-precache 和 sw-toolbox
使用 gulp 配置,您可以设置 sw-precache 来缓存您的内容,并使用 sw-toolbox 扩展它以使用基于路由配置的缓存响应
参见:https://developers.google.com/web/ilt/pwa/using-sw-precache-and-sw-toolbox