微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在部署时找不到404服务工作者:React-Django-Heroku

如何解决在部署时找不到404服务工作者:React-Django-Heroku

我正在尝试让我的第一位服务人员在Heroku应用程序上注册。前端是使用create-react-app构建的,后端是在同一服务器上使用Django的。我已经制作了一个基本的“ hello world”服务工作者,该工作者可以在开发中工作,但在生产中会出现404错误。我想我可能会误解我在生产中使用的基本文件系统。

我本地目录中的文件系统基本上是这样的:

root
 - public
    - index.html
    - sw.js
    static
     - manifest.json
 - src
    - app.js
    - serviceWorker.js
...

serviceWorker.js检查浏览器,然后尝试注册服务工作者:

...
navigator.serviceWorker
  .register(`${process.env.PUBLIC_URL}/sw.js`)
  .then(registration => {
...
//process.env.PUBLIC_URL returns http://localhost:3000/ in development,and https://www.mydomain.app/ in production

sw.js仅包含伪代码

self.addEventListener('install',function(event) {
  console.log("Hello World")
})

将其部署到Heroku后,yarn build将所有内容打包到一个构建目录中,如下所示:

build
 - index.html
 - sw.js
 - service-worker.js // added automatically by web-pack
 - asset-manifest.json // added automatically by web-pack
 - precache-manifest.xyz.js // added automatically by web-pack
 - static
    - css
    - js
    - manifest.json

在生产中,这在register()函数期间找不到文件sw.js。自动生成的service-worker.js发生了相同的错误,在开发环境中有效,但在生产环境中无效(404):

"TypeError: Failed to register a ServiceWorker for scope ('https://www.mydomain.app/') with script ('https://www.mydomain.app/sw.js'): A bad HTTP response code (404) was received when fetching the script."

我认为我对PUBLIC_URL的使用是正确的,因为它在开发和生产中都可以在<link rel="manifest" href="%PUBLIC_URL%/static/manifest.json" />处找到manifest.json。我已经使用heroku run bash检查了文件系统,似乎一切都在正确的位置,我想念的是什么?

解决方法

找到答案here,也许这会对其他人有所帮助。

我需要将sw.js文件作为带有Django URL的视图提供:

from django.views.generic.base import TemplateView
urlpatterns = [ 
    ...   
    path('sw.js',TemplateView.as_view(template_name="sw.js",content_type='application/javascript'),name='sw.js'),...
]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。