在 PWA 的 service worker 中一次兑现所有静态资产
Cashing all the static assets at once in a service worker in PWA
我的问题是关于在 PWA 中的服务工作者中一次性缓存存在于单独目录中的所有静态资产(对我来说是 'static')。正如我们所知,我们需要提供一条通往要兑现资产的路径。例如,如果我们想缓存图像 'img.png' 那么我们需要做这样的事情;
cache.add(/static/img.png)
其中缓存是 caches.open()
返回的元素。
如果我们想添加多个文件,我们可以这样做;
assets = [
'static/img1.png',
'static/img2.png'
] // and so on.
cache.addAll(assets);
我想知道的是,如果有任何方法可以直接传递静态文件夹中存在的所有文件,例如;
cache.add(/static);
但上面的行不起作用,因为我们只能传递有效路径 (URL) 而不是文件夹或文件。
现在我发布这个问题已经1个月了。在做了一些研究(实际上很多)之后,我认为没有任何办法可以这样做。一次在 PWA 中缓存资产是不可能的,我们需要为每个资产单独提供路径(url),并且它不受资产是否位于同一目录(或其他位置)或不是。重要的是给定的路径是否有效。
您可以以编程方式生成静态资产列表,并使用 Django TemplateView 呈现包含静态资产列表的 sw.js 文件。
sw.js
位于您的 Django templates
目录中
const CACHE_NAME = 'YourApp-1.0.0'
const appShell = [
{% for asset_url in static_assets %}'{{ asset_url }}',{% endfor %}
].map((partialUrl) => `${location.protocol}//${location.host}${partialUrl}`);
addEventListener('install', (event) => {
event.waitUntil((async () => {
const cache = await caches.open(CACHE_NAME);
await cache.addAll(appShell);
})());
});
views.py
class ServiceWorkerView(TemplateView):
template_name = 'sw.js'
content_type = 'application/javascript'
name = 'sw.js'
def get_context_data(self, **kwargs):
storage = ManifestStaticFilesStorage()
static_assets = []
for folder in ('css', 'icons', 'images', 'js', 'webfonts'):
static_assets += list(get_files(storage, location=folder))
return {
'static_assets': static_assets
}
urls.py
urlpatterns = [
# Service Worker
path('sw.js', views.ServiceWorkerView.as_view(), name=views.ServiceWorkerView.name), ]
我的问题是关于在 PWA 中的服务工作者中一次性缓存存在于单独目录中的所有静态资产(对我来说是 'static')。正如我们所知,我们需要提供一条通往要兑现资产的路径。例如,如果我们想缓存图像 'img.png' 那么我们需要做这样的事情;
cache.add(/static/img.png)
其中缓存是 caches.open()
返回的元素。
如果我们想添加多个文件,我们可以这样做;
assets = [
'static/img1.png',
'static/img2.png'
] // and so on.
cache.addAll(assets);
我想知道的是,如果有任何方法可以直接传递静态文件夹中存在的所有文件,例如;
cache.add(/static);
但上面的行不起作用,因为我们只能传递有效路径 (URL) 而不是文件夹或文件。
现在我发布这个问题已经1个月了。在做了一些研究(实际上很多)之后,我认为没有任何办法可以这样做。一次在 PWA 中缓存资产是不可能的,我们需要为每个资产单独提供路径(url),并且它不受资产是否位于同一目录(或其他位置)或不是。重要的是给定的路径是否有效。
您可以以编程方式生成静态资产列表,并使用 Django TemplateView 呈现包含静态资产列表的 sw.js 文件。
sw.js
位于您的 Django templates
目录中
const CACHE_NAME = 'YourApp-1.0.0'
const appShell = [
{% for asset_url in static_assets %}'{{ asset_url }}',{% endfor %}
].map((partialUrl) => `${location.protocol}//${location.host}${partialUrl}`);
addEventListener('install', (event) => {
event.waitUntil((async () => {
const cache = await caches.open(CACHE_NAME);
await cache.addAll(appShell);
})());
});
views.py
class ServiceWorkerView(TemplateView):
template_name = 'sw.js'
content_type = 'application/javascript'
name = 'sw.js'
def get_context_data(self, **kwargs):
storage = ManifestStaticFilesStorage()
static_assets = []
for folder in ('css', 'icons', 'images', 'js', 'webfonts'):
static_assets += list(get_files(storage, location=folder))
return {
'static_assets': static_assets
}
urls.py
urlpatterns = [
# Service Worker
path('sw.js', views.ServiceWorkerView.as_view(), name=views.ServiceWorkerView.name), ]