如何检查给定URL中是否存在service-worker?

RNA*_*RNA 5 javascript node.js meteor service-worker

我可以区分给定的外部网站是否有"服务工作者"?

我最好的猜测是:

  1. 从给定的URL检索所有js文件
  2. 搜索字符串'sw.js'

(我不确定如何做到这一点)

鉴于数据将是这样的:

const sitesToCheck = {
    'www.site1.com',
    'www.site2.com',
    'www.site3.com',
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 16

如果要在代码中执行此操作,则只能在与要检查的工作程序相同的原点内执行此操作.在同一个源中,您可以使用getRegistration(url)(它为您提供将解析为URL undefinedServiceWorkerRegistration对象或URL 的对象),或getRegistrations()(它为您提供ServiceWorkerRegistration对象数组的承诺).例如:

navigator.serviceWorker.getRegistrations().then(registrations => {
    console.log(registrations);
});
Run Code Online (Sandbox Code Playgroud)

  • @RNA:据我所知,没有,在网络浏览器中; 由于某种原因,这些东西被限制在同一个起源.**不是**来自浏览器,您可以下载所有网站的JavaScript并检查对`navigator.serviceWorker.register`的调用(这需要****分析,处理诸如`const sw = navigator.serviceWorker; sw.register(...);`,或`const foo ="ister"; navigator ["ser"+"vice"+"Work"+"er"] ["reg"+ foo](...) ;`). (2认同)

noo*_*_es 5

正如Nicolas所建议的,这项检查可以使用无头 Chrome 来完成。

下面是一个使用Puppeteer的例子:

'use strict'

const puppeteer = require('puppeteer');

(async() => {

  try {
    // Step 1: launch browser and open a new page.
    const browser = await puppeteer.launch()
    const page = await browser.newPage()

    // Step 2: Go to a URL and wait for a service worker to register.
    var url = 'https://web.dev/'
    await page.goto(url)
    const swTarget = await browser.waitForTarget(target => target.type() === 'service_worker')

    // Step 3a: If a service worker is registered, print URL of SW file to the console 
    if(swTarget) {
      console.log(swTarget._targetInfo['url'])
    }
    // Step 4: Done. Close.
    await browser.close()

  } catch (err) {
    // The process will timeout after 30s, if no service worker is registered
    console.error(err.message)
  }
})()
Run Code Online (Sandbox Code Playgroud)