Webpack中如何从内存缓存加载Web Worker?已无法复现原问题
Web Worker离线加载失败问题的解决方案
问题原因
浏览器对Web Worker脚本的缓存机制和普通JS模块存在差异:普通模块经Webpack处理后,runtime会直接从内存缓存读取;而Worker脚本默认会发起条件请求验证资源是否更新,离线时请求失败就会导致加载失败。
解决办法
调整Webpack缓存配置
给Worker文件添加哈希后缀,并配置缓存头让浏览器直接缓存,不再发起验证请求。如果使用create-react-app,需要通过react-app-rewired或eject修改Webpack配置:module.exports = function override(config) { config.output.assetModuleFilename = 'workers/[name].[contenthash].js'; config.module.rules.push({ test: /\.worker\.ts$/, use: { loader: 'worker-loader', options: { filename: 'workers/[name].[contenthash].js' }, }, type: 'javascript/auto', }); // 开发环境配置缓存头,生产环境需在服务器设置 if (config.devServer) { config.devServer.headers = { ...config.devServer.headers, 'Cache-Control': 'public, max-age=31536000, immutable', }; } return config; };用Service Worker拦截请求
利用create-react-app集成的Workbox,在Service Worker中给Worker脚本配置StaleWhileRevalidate策略,离线时直接返回缓存内容:workbox.routing.registerRoute( /workers\/.*\.js$/, new workbox.strategies.StaleWhileRevalidate({ cacheName: 'worker-scripts', plugins: [new workbox.cacheableResponse.CacheableResponsePlugin({ statuses: [0, 200] })], }) );内联Worker代码
将Worker脚本转为Blob URL,直接嵌入主文件,彻底避免网络请求:const workerScript = ` self.onmessage = (event) => { // Worker业务逻辑 self.postMessage('处理完成'); }; `; const blobUrl = URL.createObjectURL(new Blob([workerScript], { type: 'application/javascript' })); export function createWorker() { return new Worker(blobUrl); }
后续说明
提问者后续确认无法复现该问题,推测是浏览器临时故障导致,并为此致歉。
内容的提问来源于stack exchange,提问作者wvdz
相关产品推荐
相关产品推荐

