我想知道这里是否有人在SFCC / Demandware中实现服务工作者的经验。
我通过sw-precache-webpack-plugin的Webpack生成了一个服务工作者
问题是:服务工作者应该从域的根目录可用。所以site.com/sw.js
。
JS文件通常会位于static/
文件夹中。
有谁知道如何从Demandware / SFCC项目的根目录提供此JS文件?
答案 0 :(得分:0)
我目前也在与DW的服务人员打交道。
就我而言,我已将脚本直接添加到footer.isml
文件中,如下所示:
<script>
//init service worker
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker
.register("${URLUtils.staticURL('/lib/sw/sw.js')}")
.then(registration => {
console.log(
`Service Worker registered! Scope: ${registration.scope}`
);
})
.catch(err => {
console.log(`Service Worker registration failed: ${err}`);
});
});
}
</script>
这对我有用,至少我可以看到Service Worker registered
消息。
由于SSL证书,我也遇到了一些问题,因为我的开发环境没有正确的SSL,但是它使用的是HTTPs路由,因此chrome对此有所抱怨,我需要使用以下命令通过终端运行chrome:>
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --user-data-dir=/tmp/foo --ignore-certificate-errors --unsafely-treat-insecure-origin-as-secure=[YOUR DOMAIN]
不幸的是,即使在Safari上,我也无法在该服务工作程序文件中的任何代码行工作,因为它在开发菜单中具有服务工作程序选项,但未显示任何正在运行的服务工作程序。 / p>
我希望它将对您有帮助。
答案 1 :(得分:0)
不幸的是,在比服务工作者文件本身更高路径的作用域下注册服务工作者无效(如MDN中所述):
- 服务工作者仅会在服务工作者的范围内捕获来自客户端的请求。
- 服务工作者的最大范围是该工作者的位置。
(来源:https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers)
以下是在Demandware(销售团队)中为“ /sw.js”提供服务的一种可行方法的建议:
{
...
"your-host" : [
...,
{
"if-site-path": "/sw.js",
"pipeline": "ServiceWorker-GetFile"
}
]
}
这似乎是不必要的开销,但这是我找到用于为URI中带有根路径的文件提供服务的唯一方法。
通过扩展控制器(将其重命名为“ Content-GetFile”,并添加GET / POST参数,例如“ name”和/或“ source”),这也可以方便地用于其他文件(“ / manifest” .json”,“ /。well-known / assetlinks.json”等)。在Business Manager / ... / Aliases的下一个示例中,让Content-GetFile接受两个参数:“名称”(将是内容库中的文件名或内容资产ID)和“源”(将是“文件”或“资产”):
...
{
"if-site-path": "/sw.js",
"pipeline": "Content-GetFile",
"params": {
"name": "/ServiceWorker/sw.js",
"source": "file"
}
},
{
"if-site-path": "/manifest.json",
"pipeline": "Content-GetFile",
"params": {
"name": "MANIFEST_JSON",
"source": "asset"
}
}
请注意,您的代码应适当地处理资源的基本路径(例如,上例中的“ /ServiceWorker/sw.js”并不多说;您应该知道这是内容库中的路径还是路径相对于“墨盒// static / default / js /”)。
由于建议的方法使用控制器,因此您可以在将内容提供给用户之前动态处理内容(例如,如果需要从DMW链接中添加/删除“ / v12435145145 /”部分)。天空是您的极限。 :)