代码可编译但无法在浏览器显示,误删register service worker文件如何恢复?
关于代码编译正常但浏览器不显示 + 恢复Service Worker注册文件的解决方案
嘿,我来帮你一步步理清这个问题~
先搞清楚:Service Worker注册文件丢失会导致页面不显示吗?
通常来说,不会直接导致!Service Worker主要负责离线缓存、后台同步这类进阶功能,核心的页面渲染还是依赖你的HTML/CSS/JS主文件。不过也有极少数例外:如果你的项目是用某些脚手架(比如Create React App、Vue CLI)生成的,且你之前手动修改过和Service Worker绑定的初始化逻辑,但这种情况非常少见。
更可能的原因是这些:
- 路由配置错误(比如单页应用的路由没匹配到)
- 主文件路径写错(比如JS/CSS文件返回404)
- 控制台有报错(按F12打开「Console」面板看看有没有红色错误提示)
- DOM渲染逻辑有问题(打开「Elements」面板看有没有生成对应的DOM节点)
初学者如何恢复Service Worker注册文件?
分两种情况来操作,你可以根据自己的项目类型选:
情况1:用脚手架生成的项目(比如Create React App、Vue CLI)
Create React App 项目
- 在
src文件夹下新建serviceWorkerRegistration.js,把下面的代码复制进去:
const isLocalhost = Boolean( window.location.hostname === 'localhost' || window.location.hostname === '[::1]' || window.location.hostname.match( /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ ) ); export function register(config) { if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); if (publicUrl.origin !== window.location.origin) { return; } window.addEventListener('load', () => { const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; if (isLocalhost) { checkValidServiceWorker(swUrl, config); navigator.serviceWorker.ready.then(() => { console.log( 'This web app is being served cache-first by a service ' + 'worker.' ); }); } else { registerValidSW(swUrl, config); } }); } } function registerValidSW(swUrl, config) { navigator.serviceWorker .register(swUrl) .then((registration) => { registration.onupdatefound = () => { const installingWorker = registration.installing; if (installingWorker == null) { return; } installingWorker.onstatechange = () => { if (installingWorker.state === 'installed') { if (navigator.serviceWorker.controller) { console.log( 'New content is available and will be used when all ' + 'tabs for this page are closed.' ); if (config && config.onUpdate) { config.onUpdate(registration); } } else { console.log('Content is cached for offline use.'); if (config && config.onSuccess) { config.onSuccess(registration); } } } }; }; }) .catch((error) => { console.error('Error during service worker registration:', error); }); } function checkValidServiceWorker(swUrl, config) { fetch(swUrl, { headers: { 'Service-Worker': 'script' }, }) .then((response) => { const contentType = response.headers.get('content-type'); if ( response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1) ) { navigator.serviceWorker.ready.then((registration) => { registration.unregister().then(() => { window.location.reload(); }); }); } else { registerValidSW(swUrl, config); } }) .catch(() => { console.log( 'No internet connection found. App is running in offline mode.' ); }); } export function unregister() { if ('serviceWorker' in navigator) { navigator.serviceWorker.ready .then((registration) => { registration.unregister(); }) .catch((error) => { console.error(error.message); }); } }
- 打开
src/index.js,添加导入和注册代码:
// 顶部导入 import * as serviceWorkerRegistration from './serviceWorkerRegistration'; // 文件末尾调用 serviceWorkerRegistration.register();
Vue CLI PWA 项目
- 在
src文件夹下新建registerServiceWorker.js,复制下面的代码:
/* eslint-disable no-console */ import { register } from 'register-service-worker' if (process.env.NODE_ENV === 'production') { register(`${process.env.BASE_URL}service-worker.js`, { ready () { console.log( 'App is being served from cache by a service worker.' ) }, registered () { console.log('Service worker has been registered.') }, cached () { console.log('Content has been cached for offline use.') }, updatefound () { console.log('New content is downloading.') }, updated () { console.log('New content is available; please refresh.') }, offline () { console.log('No internet connection found. App is running in offline mode.') }, error (error) { console.error('Error during service worker registration:', error) } }) }
- 打开
src/main.js,添加导入:
import './registerServiceWorker'
情况2:自己手动搭建的纯静态项目
- 新建
register-sw.js文件,写入基础注册逻辑:
if ('serviceWorker' in navigator) { window.addEventListener('load', () => { navigator.serviceWorker.register('/service-worker.js') .then(registration => { console.log('ServiceWorker registered successfully: ', registration.scope); }) .catch(err => { console.log('ServiceWorker registration failed: ', err); }); }); }
- 在你的主HTML文件(比如
index.html)里引入这个脚本:
<script src="/register-sw.js"></script>
- 如果你之前还有
service-worker.js缓存文件,也可以新建一个基础版:
const CACHE_NAME = 'my-app-cache-v1'; // 把你需要缓存的文件路径填进去 const urlsToCache = [ '/', '/index.html', '/styles.css', '/app.js' ]; self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME) .then(cache => { return cache.addAll(urlsToCache); }) ); }); self.addEventListener('fetch', (event) => { event.respondWith( caches.match(event.request) .then(response => { // 优先用缓存,没有则请求网络 return response || fetch(event.request); }) ); });
最后提醒下:先去排查页面不显示的核心问题,Service Worker大概率不是罪魁祸首哦~
内容的提问来源于stack exchange,提问作者Osehimen
相关产品推荐
相关产品推荐

