@@ -302,15 +302,30 @@ export class ServiceWorkerMessageSend implements Message {
302302 }
303303}
304304
305- // Offscreen端通过navigator.serviceWorker.controller.postMessage向SW发送消息
305+ // Offscreen端通过navigator.serviceWorker向SW发送postMessage消息
306306// 与ServiceWorkerMessageSend配对使用,实现Offscreen→SW的postMessage通道
307+ // 注意: 扩展offscreen页面的navigator.serviceWorker.controller通常为null,
308+ // 需要通过navigator.serviceWorker.ready获取registration.active
307309export class ServiceWorkerClientMessage implements MessageSend {
308310 EE = new EventEmitter < string , any > ( ) ;
309311
312+ private sw : ServiceWorker | null = null ;
313+ private swReady : Promise < ServiceWorker > ;
314+
310315 constructor ( ) {
311316 navigator . serviceWorker . addEventListener ( "message" , ( e ) => {
312317 this . messageHandle ( e . data ) ;
313318 } ) ;
319+ // controller在扩展offscreen页面中通常为null,通过ready获取active
320+ this . sw = navigator . serviceWorker . controller ;
321+ if ( this . sw ) {
322+ this . swReady = Promise . resolve ( this . sw ) ;
323+ } else {
324+ this . swReady = navigator . serviceWorker . ready . then ( ( reg ) => {
325+ this . sw = reg . active ! ;
326+ return this . sw ;
327+ } ) ;
328+ }
314329 }
315330
316331 messageHandle ( data : WindowMessageBody ) {
@@ -325,7 +340,12 @@ export class ServiceWorkerClientMessage implements MessageSend {
325340 }
326341
327342 private postToServiceWorker ( message : any ) {
328- navigator . serviceWorker . controller ! . postMessage ( message ) ;
343+ if ( this . sw ) {
344+ this . sw . postMessage ( message ) ;
345+ } else {
346+ // 初始化期间还没获取到SW引用,等待ready后发送
347+ this . swReady . then ( ( sw ) => sw . postMessage ( message ) ) ;
348+ }
329349 }
330350
331351 async connect ( data : TMessage ) : Promise < MessageConnect > {
0 commit comments