我有一个具有这种结构的应用程序:
- webapp
- - resources
- - - js
- - - - main.js
- - WEB-INF
- - - views
- - - - index.jsp
我开始使用渐进式webapp,我只想让index.jsp与其他视图一起使用。
index.jsp
<head>
<script defer src="resources/js/main.js"></script>
</head>
main.js
navigator.serviceWorker && navigator.serviceWorker.register('resources/js/sw.js').then(function(registration) {
console.log('Excellent, registered with scope: ', registration.scope);
}).catch(function(error) {
console.log('Service worker registration failed, error:', error);
alert(error);
});
&#13;
sw.js
/** An empty service worker! */
self.addEventListener('fetch', function(event) {
/** An empty fetch handler! */
});
&#13;
AppWebConfiguration.java
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/resources/");
}
我从Chrome上的控制台收到以下消息:Excellent, registered with scope: http://localhost:8080/MyProject/resources/js/
我需要使用根应用程序http://localhost:8080/MyProject
创建服务工作者,但如果我将sw.js
放在根目录中,则无法访问。
有没有办法访问root上的sw.js
或配置为使用应用程序的根作为范围?
我尝试使用navigator.serviceWorker.register('resources/js/sw.js', { scope: './' })
,但它没有用。
答案 0 :(得分:1)
不,使用比SW.js所在范围更广的范围是不可能的。换句话说:您可以使用scope选项来限制SW,但是您无法将SW的范围向上扩展到目录结构。
为了使用“/”作为范围,您必须从“/SW.js”提供SW.js。
但是,您可以在html中添加一个特殊的标题,为SW提供更宽范围的访问权限。阅读更多相关信息here。
答案 1 :(得分:1)
我解决了我的问题,使用Spring的ResourceHandlers将service-worker映射到应用程序的根目录。
AppWebConfiguration.java
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/resources/");
registry.addResourceHandler("/**")
.addResourceLocations("/resources/js/sw.js");
}
通过以下内容,我可以使用以下脚本访问应用程序根目录下的sw.js:
main.js
navigator.serviceWorker && navigator.serviceWorker.register('./sw.js').then(function(registration) {
console.log('Excellent, registered with scope: ', registration.scope);
}).catch(function(error) {
console.log('Service worker registration failed, error:', error);
alert(error);
});