我想知道这里是否有人有在SFCC/Demandware中实现服务工作者的经验。
我用sw-precache-webpack-plugin和Webpack一起生成了一个服务工作者
问题是:服务工作者应该从域的根目录中可用。所以site.com/sw.js。JS文件通常会出现在static/文件夹中。谁知道如何在Demandware/SFCC中从项目的根目录中提供这个JS文件?
发布于 2019-07-16 16:45:17
不幸的是,在比服务工作者文件本身更高的路径中的作用域中注册服务工作者不起作用(如MDN中所述):
(来源:https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers)
解决方案
以下是在Demandware (销售团队)中提供"/sw.js“服务的工作方法的建议:
(dw.content.ContentMgr.getContent() )或者直接读取带有dw.io.File / dw.io.FileReader);
{
...
"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接受两个参数:" name“(可以是内容库中的文件名或内容资产ID)和"source”(可以是" file“或" asset "):
...
{
"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“没有太多说明;您应该知道这是内容库中的路径还是相对于”cartridges//static/default/js/“的路径)。
动态内容
由于建议的方法使用控制器,因此您可以在将内容提供给用户之前对其进行动态处理(例如,如果您需要在DMW链接中添加/删除"/v12435145145/“部分)。天空是你的极限。:)
发布于 2018-11-14 23:15:26
我现在也在和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]不幸的是,我不能让service worker文件中的任何代码行工作,即使我在Safari上尝试过,因为它在develop菜单中有一个Service Workers选项,但是它没有显示任何服务worker正在运行。
我希望它能对你有所帮助。
https://stackoverflow.com/questions/53061466
复制相似问题