ServiceWorker 报 MIME 类型错误

发生背景

笔者写前端埋点 SDK 时遇到问题,sw 文件是写在 sdk 里的,注册逻辑也写在 sdk 里了;但最终 sdk 是在 demo 里用的,导致 demo 里一直显示:

js 复制代码
SecurityError: Failed to register a ServiceWorker for scope ('http://localhost:5173/') with script ('http://localhost:5173/sw.js'): 、The script has an unsupported MIME type ('text/html').

笔者的 sw 引入:

js 复制代码
// sdk/src/xxx.ts

const registerServiceWorker = () => {
        if ('ServiceWorker' in window) {
            const swURL = './sw.js'
            navigator.serviceWorker
                .register(swURL)
                .then((reg) => console.log('SW registered:', reg))
                .catch((err) => console.error(err))
        }
    }

解决过程

按理来说 sw.js 应该要塞到 demo 的 ./public 文件夹里,笔者试了,的确成功了。但笔者不能让 sdk 使用者自己复制 sw.js 然后粘贴到自己的项目里,笔者不喜欢这个方案。

去网上查资料,看到有个评论说 可能是 service worker 文件没找到 导致的,笔者觉得他说的对!

想起刚刚看的资料,资料作者在vite里配置了路径,也许我也可以试试。

于是笔者打开 vite 的文档,找到静态资源处理那栏(因为正确放置位置是 public 下面,所以笔者把它当静态资源看),找到了这样的信息:

解决方案

于是笔者改为使用ESM动态导入,就像这样:

js 复制代码
    const registerServiceWorker = () => {
        ...
            const swURL = new URL('./sw.js', import.meta.url).href
        ...
    }

锵锵,解决哩!要是你遇到了和我一样的麻烦,不妨试一试😋☝️

资料: Service Worker 使用指南service worker用的可能不多,但在很多时候却有着不可替代的作用,现在很 - 掘金

相关推荐
少油少盐不要辣11 分钟前
前端如何处理AI模型返回的流数据
前端·javascript·人工智能
IT_陈寒13 分钟前
Java21新特性实战:5个杀手级改进让你的开发效率提升40%
前端·人工智能·后端
跟着珅聪学java14 分钟前
以下是使用JavaScript动态拼接数组内容到HTML的多种方法及示例:
开发语言·前端·javascript
BD_Marathon17 分钟前
NPM_配置的补充说明
前端·npm·node.js
巴拉巴拉~~21 分钟前
KMP 算法通用图表组件:KmpChartWidget 多维度可视化 + PMT 表渲染 + 性能对比
前端·javascript·microsoft
智算菩萨27 分钟前
基于spaCy的英文自然语言处理系统:低频词提取与高级文本分析
前端·javascript·easyui
刘一说38 分钟前
Vue单页应用(SPA)开发全解析:从原理到最佳实践
前端·javascript·vue.js
疯狂成瘾者39 分钟前
前端vue核心知识点
前端·javascript·vue.js
Laravel技术社区2 小时前
用PHP8实现斗地主游戏,实现三带一,三带二,四带二,顺子,王炸功能(第二集)
前端·游戏·php
m0_738120723 小时前
应急响应——知攻善防Web-3靶机详细教程
服务器·前端·网络·安全·web安全·php