開始使用 PageSpeed Insights API

使用 PageSpeed Insights API 可執行下列操作:

  • 評估網頁效能。
  • 取得如何改善網頁成效、無障礙功能和 SEO 表現的建議。

PageSpeed Insights API 會傳回 Chrome 使用者體驗報告的實際資料,以及 Lighthouse 的實驗室資料。

API Explorer

如要呼叫 PageSpeed Insights API,但不想編寫任何程式碼,請查看 API Explorer

取得並使用 API 金鑰

取得金鑰

或者,您也可以在「憑證」頁面中建立一個。

取得 API 金鑰後,您的應用程式可以將查詢參數 key=yourAPIKey 附加到所有的要求網址。

API 金鑰可以安全地嵌入網址中,不需任何編碼。

curl

如要透過指令列試用 PageSpeed Insights API,請按照下列步驟操作:

  1. 開啟終端機。
  2. 執行下列指令。將 yourAPIKey 替換成您的 API 金鑰。

    curl https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://web.dev/&key=yourAPIKey

    回應是 JSON 物件。請參閱「回應」,進一步瞭解回應物件中的每個屬性。

    {
     "captchaResult": "CAPTCHA_NOT_NEEDED",
     "kind": "pagespeedonline#result",
     "id": "https://developers.google.com/",
     "loadingExperience": {
      "id": "https://developers.google.com/",
      "metrics": {
       "FIRST_CONTENTFUL_PAINT_MS": {
        "percentile": 3482,
        "distributions": [
         {
          "min": 0,
          "max": 1000,
          "proportion": 0.37151728768042963
         },
         {
          "min": 1000,
          "max": 2500,
          "proportion": 0.4244153519077991
         },
         {
          "min": 2500,
          "proportion": 0.2040673604117713
         }
        ],
        "category": "SLOW"
       },
       "FIRST_INPUT_DELAY_MS": {
        "percentile": 36,
        "distributions": [
         {
          "min": 0,
          "max": 50,
          "proportion": 0.960628961482204
         },
         {
          "min": 50,
          "max": 250,
          "proportion": 0.02888834714773281
         },
         {
          "min": 250,
          "proportion": 0.010482691370063388
         }
        ],
        "category": "FAST"
       }
      },
      "overall_category": "SLOW",
      "initial_url": "https://developers.google.com/"
     },
     "originLoadingExperience": {
      "id": "https://developers.google.com",
      "metrics": {
       "FIRST_CONTENTFUL_PAINT_MS": {
        "percentile": 2761,
        "distributions": [
         {
          "min": 0,
          "max": 1000,
          "proportion": 0.4236433226493666
         },
         {
          "min": 1000,
          "max": 2500,
          "proportion": 0.45045120795679117
         },
         {
          "min": 2500,
          "proportion": 0.1259054693938423
         }
        ],
        "category": "SLOW"
       },
       "FIRST_INPUT_DELAY_MS": {
        "percentile": 45,
        "distributions": [
         {
          "min": 0,
          "max": 50,
          "proportion": 0.9537371485251699
         },
         {
          "min": 50,
          "max": 250,
          "proportion": 0.03044972719889055
         },
         {
          "min": 250,
          "proportion": 0.01581312427593959
         }
        ],
        "category": "FAST"
       }
      },
      "overall_category": "SLOW",
      "initial_url": "https://developers.google.com/"
     },
     "lighthouseResult": {
      "requestedUrl": "https://developers.google.com/",
      "finalUrl": "https://developers.google.com/",
      "lighthouseVersion": "3.2.0",
      "userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/72.0.3584.0 Safari/537.36",
      "fetchTime": "2018-11-01T03:03:58.394Z",
      "environment": {
       "networkUserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3559.0 Safari/537.36",
       "hostUserAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/72.0.3584.0 Safari/537.36",
       "benchmarkIndex": 590.0
      },
      "runWarnings": [],
      "configSettings": {
       "emulatedFormFactor": "desktop",
       "locale": "en-US",
       "onlyCategories": [
        "performance"
       ]
      },
      "audits": {
       "estimated-input-latency": {
        "id": "estimated-input-latency",
        "title": "Estimated Input Latency",
        "description": "The score above is an estimate of how long your app takes to respond to user input, in milliseconds, during the busiest 5s window of page load. If your latency is higher than 50 ms, users may perceive your app as laggy. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/estimated-input-latency).",
        "score": 1.0,
        "scoreDisplayMode": "numeric",
        "displayValue": "30 ms"
       },
       "uses-rel-preconnect": {
        "id": "uses-rel-preconnect",
        "title": "Preconnect to required origins",
        "description": "Consider adding preconnect or dns-prefetch resource hints to establish early connections to important third-party origins. [Learn more](https://developers.google.com/web/fundamentals/performance/resource-prioritization#preconnect).",
        "score": 1.0,
        "scoreDisplayMode": "numeric",
        "details": {
         "headings": [],
         "type": "opportunity",
         "items": [],
         "overallSavingsMs": 0.0
        }
       },
       ...
      },
      "categories": {
       "performance": {
        "id": "performance",
        "title": "Performance",
        "score": 0.96,
        "auditRefs": [
         {
          "id": "first-contentful-paint",
          "weight": 3.0,
          "group": "metrics"
         },
         {
          "id": "first-meaningful-paint",
          "weight": 1.0,
          "group": "metrics"
         },
         ...
        ]
       }
      },
      "categoryGroups": {
       "a11y-element-names": {
        "title": "Elements Have Discernible Names",
        "description": "These are opportunities to improve the semantics of the controls in your application. This may enhance the experience for users of assistive technology, like a screen reader."
       },
       "a11y-language": {
        "title": "Page Specifies Valid Language",
        "description": "These are opportunities to improve the interpretation of your content by users in different locales."
       },
       ...
      },
      "i18n": {
       "rendererFormattedStrings": {
        "varianceDisclaimer": "Values are estimated and may vary.",
        "opportunityResourceColumnLabel": "Opportunity",
        "opportunitySavingsColumnLabel": "Estimated Savings",
        "errorMissingAuditInfo": "Report error: no audit information",
        "errorLabel": "Error!",
        "warningHeader": "Warnings: ",
        "auditGroupExpandTooltip": "Show audits",
        "passedAuditsGroupTitle": "Passed audits",
        "notApplicableAuditsGroupTitle": "Not applicable",
        "manualAuditsGroupTitle": "Additional items to manually check",
        "toplevelWarningsMessage": "There were issues affecting this run of Lighthouse:",
        "scorescaleLabel": "Score scale:",
        "crcLongestDurationLabel": "Maximum critical path latency:",
        "crcInitialNavigation": "Initial Navigation",
        "lsPerformanceCategoryDescription": "[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on an emulated mobile network. Values are estimated and may vary.",
        "labDataTitle": "Lab Data"
       }
      }
     },
     "analysisUTCTimestamp": "2018-11-01T03:03:58.394Z"
    }

JavaScript

如要透過 JavaScript 試用 PageSpeed Insights API,請按照下列步驟操作:

  1. 複製下方程式碼。程式碼會使用 PageSpeed Insights API 評估 https://web.dev/ 的效能,然後顯示結果。

    /**
     * Fetches and displays PageSpeed Insights data.
     */
    async function run() {
      const apiEndpoint =
          'https://www.googleapis.com/pagespeedonline/v5/runPagespeed';
      const targetUrl = 'https://web.dev/';
    
      const url = new URL(apiEndpoint);
      url.searchParams.set('url', targetUrl);
    
      try {
        const response = await fetch(url);
        if (!response.ok) {
          throw new Error(`HTTP error! status: ${response.status}`);
        }
        const json = await response.json();
    
        // See
        // https://developers.google.com/speed/docs/insights/v5/reference/pagespeedapi/runpagespeed#response
        // to learn more about each of the properties in the response object.
    
        showInitialContent(json.id);
    
        const cruxMetrics = {
          'First Contentful Paint':
              json.loadingExperience.metrics.FIRST_CONTENTFUL_PAINT_MS?.category,
          'Interaction to Next Paint':
              json.loadingExperience.metrics.INTERACTION_TO_NEXT_PAINT?.category,
        };
        showCruxContent(cruxMetrics);
    
        const lighthouse = json.lighthouseResult;
        const lighthouseMetrics = {
          'First Contentful Paint':
              lighthouse.audits['first-contentful-paint']?.displayValue,
          'Speed Index': lighthouse.audits['speed-index']?.displayValue,
          'Largest Contentful Paint':
              lighthouse.audits['largest-contentful-paint']?.displayValue,
          'Total Blocking Time':
              lighthouse.audits['total-blocking-time']?.displayValue,
          'Time To Interactive': lighthouse.audits['interactive']?.displayValue,
        };
        showLighthouseContent(lighthouseMetrics);
      } catch (error) {
        console.error('Fetching PageSpeed Insights failed:', error);
        document.body.textContent =
            `Failed to fetch PageSpeed data. Check the console for errors.`;
      }
    }
    
    /**
     * Displays initial content, including the page ID.
     * @param {string} id The ID of the page being tested.
     */
    function showInitialContent(id) {
      document.body.innerHTML = '';  // Clear previous content
      const title = document.createElement('h1');
      title.textContent = 'PageSpeed Insights API Demo';
      document.body.appendChild(title);
    
      const page = document.createElement('p');
      page.textContent = `Page tested: ${id}`;
      document.body.appendChild(page);
    }
    
    /**
     * Displays CrUX metrics.
     * @param {!Object} cruxMetrics The CrUX metrics to display.
     */
    function showCruxContent(cruxMetrics) {
      const cruxHeader = document.createElement('h2');
      cruxHeader.textContent = 'Chrome User Experience Report Results';
      document.body.appendChild(cruxHeader);
    
      for (const key in cruxMetrics) {
        const p = document.createElement('p');
        p.textContent = `${key}: ${cruxMetrics[key]}`;
        document.body.appendChild(p);
      }
    }
    
    /**
     * Displays Lighthouse metrics.
     * @param {!Object} lighthouseMetrics The Lighthouse metrics to display.
     */
    function showLighthouseContent(lighthouseMetrics) {
      const lighthouseHeader = document.createElement('h2');
      lighthouseHeader.textContent = 'Lighthouse Results';
      document.body.appendChild(lighthouseHeader);
    
      for (const key in lighthouseMetrics) {
        const p = document.createElement('p');
        p.textContent = `${key}: ${lighthouseMetrics[key]}`;
        document.body.appendChild(p);
      }
    }
    
    run();
  2. 將程式碼貼到 HTML 檔案中的 script 標記中。
  3. 在瀏覽器中開啟 HTML 檔案。完成後,頁面會顯示如圖 1 所示。

    圖 1。JavaScript 示範

後續步驟

意見回饋

本頁內容是否有幫助?