GoogleChrome / webdev-infra

Apache License 2.0
37 stars 28 forks source link

Implement unified CSS transform #36

Closed matthiasrohmer closed 1 year ago

matthiasrohmer commented 1 year ago

This PR tries to create a unified implementation for the CSS purify transforms living at

https://github.com/GoogleChrome/developer.chrome.com/blob/d8c4a0514b67863d2e38b738d38ee4e78c0c8b9c/site/_transforms/purify-css.js#L27-L34

and

https://github.com/GoogleChrome/web.dev/blob/725beb67e239556c4cbf600b2080ba4abad9dd7c/src/site/_transforms/purify-css.js#L37-L44

while implementing the best practices learnt in https://github.com/matthiasrohmer/developer.chrome.com/pull/2, like reading the CSS only once, minifying it once and also read the JS source ourselves instead of letting PurgeCSS do it as this would do a fs.access and fs.readFile call for every JavaScript file we have, for every page rendered (nuts!).

This is the API for usage:

    eleventyConfig.addTransform('purifyCss', (new CssTransform()).configure({
      cssPath: 'dist/css/main.css',
      jsPaths: [
        'dist/js/**/*.js'
      ],
      insert: (content, result) => {
        return content.replace('</head>', `<style>${result}</style></head>`)
      }
    }));

Open tasks:

devnook commented 1 year ago

👍

matthiasrohmer commented 1 year ago

After figuring out https://github.com/GoogleChrome/developer.chrome.com/pull/4201 here is the detailed size increase for d.c.c which would happen if we only minify the input CSS once, instead of individually minifying the purged result. The average across all 4097 pages is 0.25KB.

{
  '-0.00KB': [ '/en/docs/extensions/reference/i18n/index.html' ],
  '-0.01KB': [
    '/en/blog/webauthn-tab/index.html',
    '/en/docs/handbook/test-post/index.html'
  ],
  '-0.02KB': [
    '/en/blog/credential-management-updates/index.html',
    '/en/blog/fledge-api/index.html',
    '/en/docs/crux/methodology/index.html',
    '/en/docs/native-client/cds2014/cpp/index.html',
    '/en/docs/native-client/cds2014/python/index.html',
    '/en/docs/native-client/devguide/devcycle/vs-addin/index.html',
    '/en/docs/native-client/reference/pnacl-bitcode-manual/index.html',
    '/ja/blog/fledge-api/index.html'
  ],
  '-0.03KB': [ '/en/docs/devtools/accessibility/navigation/index.html' ],
  '-0.04KB': [ '/en/docs/handbook/style-guide/index.html' ],
  '-0.05KB': [
    '/en/blog/audio-worklet-design-pattern/index.html',
    '/en/docs/apps/offline_storage/index.html',
    '/en/docs/handbook/components/index.html',
    '/en/docs/native-client/reference/sandbox_internals/arm-32-bit-sandbox/index.html'
  ],
  '-0.06KB': [ '/en/docs/native-client/rest-devsite-examples/index.html' ],
  '-0.07KB': [ '/en/docs/devtools/recorder/reference/index.html' ],
  '0.00KB': [
    '/en/docs/native-client/io2014/index.html',
    '/en/docs/workbox/faster-multipage-applications-with-streams/index.html'
  ],
  '0.01KB': [
    '/en/blog/show-picker/index.html',
    '/en/docs/web-platform/webgpu/index.html',
    '/es/docs/web-platform/webgpu/index.html',
    '/pt/docs/web-platform/webgpu/index.html'
  ],
  '0.02KB': [
    '/algolia.json',
    '/en/docs/native-client/faq/index.html',
    '/en/docs/native-client/nacldev/index.html',
    '/en/docs/native-client/reference/pnacl-undefined-behavior/index.html',
    '/en/docs/privacy-sandbox/cds21-update/index.html'
  ],
  '0.06KB': [
    '/en/blog/memory-inspector/index.html',
    '/en/docs/apps/offline_apps/index.html',
    '/en/docs/extensions/mv3/external_extensions/index.html',
    '/en/docs/privacy-sandbox/feedback/report-2022-q3/index.html',
    '/ja/docs/privacy-sandbox/feedback/report-2022-q2/index.html'
  ],
  '0.07KB': [ '/en/blog/puppeteer-typescript/index.html' ],
  '0.08KB': [
    '/en/docs/extensions/mv2/external_extensions/index.html',
    '/en/docs/extensions/mv3/getstarted/extensions-101/index.html',
    '/en/docs/extensions/mv3/manifest/web_accessible_resources/index.html',
    '/en/docs/native-client/devguide/tutorial/tutorial-part2/index.html',
    '/en/docs/privacy-sandbox/feedback/report-2022-q1/index.html',
    '/en/docs/privacy-sandbox/feedback/report-2022-q2/index.html',
    '/en/docs/privacy-sandbox/storage-partitioning/index.html',
    '/en/docs/web-platform/navigation-api/index.html',
    '/en/docs/web-platform/pop-up-api/defaultopen-attribute/index.html',
    '/en/docs/web-platform/pop-up-api/hidepopover-method/index.html',
    '/en/docs/web-platform/pop-up-api/index.html',
    '/en/docs/web-platform/pop-up-api/popover-attribute/index.html',
    '/en/docs/web-platform/pop-up-api/popover-property/index.html',
    '/en/docs/web-platform/pop-up-api/showpopup-method/index.html',
    '/en/docs/webstore/review-process/index.html',
    '/en/docs/webstore/troubleshooting/index.html',
    '/en/docs/webstore/webstore_api/items/index.html',
    '/en/docs/webstore/webstore_api/userLicenses/index.html',
    '/ja/docs/privacy-sandbox/feedback/report-2022-q1/index.html',
    '/ja/docs/privacy-sandbox/storage-partitioning/index.html'
  ],
  '0.09KB': [
    '/en/docs/apps/autoupdate/index.html',
    '/en/docs/crux/bigquery/index.html',
    '/en/docs/crux/release-notes/index.html',
    '/en/docs/devtools/css/reference/index.html',
    '/en/docs/extensions/mv3/getstarted/index.html',
    '/en/docs/extensions/mv3/intro/index.html',
    '/en/docs/extensions/mv3/mv3-migration/index.html',
    '/en/docs/native-client/cds2014/index.html',
    '/en/docs/native-client/devguide/coding/application-structure/index.html',
    '/en/docs/native-client/devguide/coding/audio/index.html',
    '/en/docs/native-client/devguide/coding/progress-events/index.html',
    '/en/docs/native-client/devguide/coding/view-focus-input-events/index.html',
    '/en/docs/native-client/devguide/devcycle/building/index.html',
    '/en/docs/native-client/devguide/devcycle/debugging/index.html',
    '/en/docs/native-client/devguide/devcycle/dynamic-loading/index.html',
    '/en/docs/privacy-sandbox/unified-origin-trial/index.html',
    '/en/docs/webstore/webstore_api/inAppProducts/index.html',
    '/en/docs/webstore/webstore_api/licenses/index.html',
    '/en/docs/webstore/webstore_api/payments/index.html',
    '/en/docs/workbox/navigation-preload/index.html'
  ],
  '0.10KB': [
    '/de/docs/privacy-sandbox/attribution-reporting-introduction/index.html',
    '/de/docs/privacy-sandbox/first-party-sets/index.html',
    '/en/docs/android/trusted-web-activity/integration-guide/index.html',
    '/en/docs/devtools/open/index.html',
    '/en/docs/devtools/rendering/apply-effects/index.html',
    '/en/docs/extensions/mv2/sandboxingEval/index.html',
    '/en/docs/extensions/mv3/sandboxingEval/index.html',
    '/en/docs/extensions/reference/devtools_inspectedWindow/index.html',
    '/en/docs/extensions/reference/runtime/index.html',
    '/en/docs/lighthouse/accessibility/custom-controls-labels/index.html',
    '/en/docs/lighthouse/accessibility/focusable-controls/index.html',
    '/en/docs/multidevice/android/intents/index.html',
    '/en/docs/privacy-sandbox/attribution-reporting/index.html',
    '/en/docs/privacy-sandbox/faq/index.html',
    '/en/docs/privacy-sandbox/fenced-frame/index.html',
    '/en/docs/privacy-sandbox/first-party-sets/index.html',
    '/en/docs/privacy-sandbox/fledge/index.html',
    '/en/docs/privacy-sandbox/permissions-policy/index.html',
    '/en/docs/privacy-sandbox/shared-storage/ab-testing/index.html',
    '/en/docs/privacy-sandbox/trust-tokens/index.html',
    '/en/docs/versionhistory/guide/index.html',
    '/en/docs/web-platform/capture-handle/index.html',
    '/en/docs/web-platform/origin-trial-troubleshooting/index.html',
    '/en/docs/web-platform/origin-trials/index.html',
    '/en/docs/web-platform/screen-sharing-controls/index.html',
    '/en/docs/web-platform/virtual-keyboard/index.html',
    '/en/docs/workbox/caching-strategies-overview/index.html',
    '/en/docs/workbox/managing-fallback-responses/index.html',
    '/en/docs/workbox/precaching-with-workbox/index.html',
    '/es/docs/privacy-sandbox/attribution-reporting-introduction/index.html',
    '/es/docs/privacy-sandbox/first-party-sets/index.html',
    '/es/docs/privacy-sandbox/topics/index.html',
    '/es/docs/privacy-sandbox/trust-tokens/index.html',
    '/fr/docs/privacy-sandbox/attribution-reporting-introduction/index.html',
    '/fr/docs/privacy-sandbox/first-party-sets/index.html',
    '/ja/docs/privacy-sandbox/attribution-reporting/index.html',
    '/ja/docs/privacy-sandbox/attribution-reporting-introduction/index.html',
    '/ja/docs/privacy-sandbox/fenced-frame/index.html',
    '/ja/docs/privacy-sandbox/first-party-sets/index.html',
    '/ja/docs/privacy-sandbox/fledge/index.html',
    '/ja/docs/privacy-sandbox/permissions-policy/index.html',
    '/ja/docs/privacy-sandbox/topics/index.html',
    '/ko/docs/privacy-sandbox/attribution-reporting-introduction/index.html',
    '/ko/docs/privacy-sandbox/first-party-sets/index.html',
    '/ko/docs/privacy-sandbox/topics/index.html',
    '/pt/docs/privacy-sandbox/attribution-reporting-introduction/index.html',
    '/pt/docs/privacy-sandbox/first-party-sets/index.html',
    '/pt/docs/privacy-sandbox/topics/index.html',
    '/pt/docs/privacy-sandbox/trust-tokens/index.html',
    '/ru/docs/privacy-sandbox/attribution-reporting-introduction/index.html',
    '/ru/docs/privacy-sandbox/first-party-sets/index.html',
    '/ru/docs/privacy-sandbox/topics/index.html',
    '/zh/docs/privacy-sandbox/attribution-reporting-introduction/index.html',
    '/zh/docs/privacy-sandbox/first-party-sets/index.html',
    '/zh/docs/privacy-sandbox/topics/index.html'
  ],
  '0.11KB': [
    '/de/docs/privacy-sandbox/attribution-reporting/index.html',
    '/de/docs/privacy-sandbox/fledge/index.html',
    '/de/docs/privacy-sandbox/glossary/index.html',
    '/de/docs/privacy-sandbox/overview/index.html',
    '/de/docs/privacy-sandbox/trust-tokens/index.html',
    '/en/articles/renderingng/index.html',
    '/en/blog/extensions-getting-started-guides/index.html',
    '/en/blog/shared-element-transitions-for-spas/index.html',
    '/en/blog/string-matchall/index.html',
    '/en/docs/android/trusted-web-activity/index.html',
    '/en/docs/android/trusted-web-activity/quick-start/index.html',
    '/en/docs/apps/app_architecture/index.html',
    '/en/docs/apps/app_external/index.html',
    '/en/docs/apps/contentSecurityPolicy/index.html',
    '/en/docs/apps/overview/index.html',
    '/en/docs/apps/sencha_framework/index.html',
    '/en/docs/devtools/command-menu/index.html',
    '/en/docs/devtools/console/reference/index.html',
    '/en/docs/devtools/console/utilities/index.html',
    '/en/docs/devtools/css/animations/index.html',
    '/en/docs/devtools/css/container-queries/index.html',
    '/en/docs/devtools/css/flexbox/index.html',
    '/en/docs/devtools/css/grid/index.html',
    '/en/docs/devtools/css-overview/index.html',
    '/en/docs/devtools/customize/index.html',
    '/en/docs/devtools/elements/badges/index.html',
    '/en/docs/devtools/evaluate-performance/reference/index.html',
    '/en/docs/devtools/issues/index.html',
    '/en/docs/devtools/javascript/index.html',
    '/en/docs/devtools/javascript/snippets/index.html',
    '/en/docs/devtools/memory-problems/memory-101/index.html',
    '/en/docs/devtools/network/index.html',
    '/en/docs/devtools/overview/index.html',
    '/en/docs/devtools/performance-insights/index.html',
    '/en/docs/devtools/recorder/index.html',
    '/en/docs/devtools/rendering/emulate-css/index.html',
    '/en/docs/devtools/resources/index.html',
    '/en/docs/devtools/sources/index.html',
    '/en/docs/devtools/storage/indexeddb/index.html',
    '/en/docs/extensions/mv2/content_scripts/index.html',
    '/en/docs/extensions/mv2/devtools/index.html',
    '/en/docs/extensions/mv2/runtime_host_permissions/index.html',
    '/en/docs/extensions/mv3/content_scripts/index.html',
    '/en/docs/extensions/mv3/devtools/index.html',
    '/en/docs/extensions/mv3/getstarted/development-basics/index.html',
    '/en/docs/extensions/mv3/getstarted/tut-focus-mode/index.html',
    '/en/docs/extensions/mv3/getstarted/tut-reading-time/index.html',
    '/en/docs/extensions/mv3/getstarted/tut-tabs-manager/index.html',
    '/en/docs/extensions/mv3/migrating_to_service_workers/index.html',
    '/en/docs/extensions/reference/tabs/index.html',
    '/en/docs/handbook/how-to/add-a-glitch-embed/index.html',
    '/en/docs/handbook/how-to/add-a-youtube-embed/index.html',
    '/en/docs/handbook/how-to/add-an-iframe/index.html',
    '/en/docs/lighthouse/overview/index.html',
    '/en/docs/lighthouse/performance/first-contentful-paint/index.html',
    '/en/docs/lighthouse/performance/first-meaningful-paint/index.html',
    '/en/docs/lighthouse/performance/font-display/index.html',
    '/en/docs/lighthouse/performance/third-party-facades/index.html',
    '/en/docs/lighthouse/performance/uses-rel-preconnect/index.html',
    '/en/docs/lighthouse/performance/uses-rel-preload/index.html',
    '/en/docs/lighthouse/pwa/apple-touch-icon/index.html',
    '/en/docs/multidevice/android/index.html',
    '/en/docs/multidevice/webview/tipsandtricks/index.html',
    '/en/docs/native-client/community/security-contest/contest-announcement/index.html',
    '/en/docs/native-client/welcome-to-native-client/index.html',
    '/en/docs/privacy-sandbox/glossary/index.html',
    '/en/docs/privacy-sandbox/overview/index.html',
    '/en/docs/privacy-sandbox/private-aggregation/index.html',
    '/en/docs/privacy-sandbox/shared-storage/creative-rotation/index.html',
    '/en/docs/privacy-sandbox/shared-storage/frequency-control/index.html',
    '/en/docs/privacy-sandbox/shared-storage/known-customer/index.html',
    '/en/docs/privacy-sandbox/topics/index.html',
    '/en/docs/puppeteer/get-started/index.html',
    '/en/docs/puppeteer/overview/index.html',
    '/en/docs/web-platform/region-capture/index.html',
    '/en/docs/web-platform/storage-foundation/index.html',
    '/en/docs/webstore/i18n/index.html',
    '/en/docs/workbox/caching-resources-during-runtime/index.html',
    '/en/docs/workbox/troubleshooting-and-logging/index.html',
    '/en/docs/workbox/using-plugins/index.html',
    '/es/docs/lighthouse/performance/first-meaningful-paint/index.html',
    '/es/docs/lighthouse/performance/third-party-facades/index.html',
    '/es/docs/privacy-sandbox/glossary/index.html',
    '/es/docs/privacy-sandbox/overview/index.html',
    '/fr/docs/privacy-sandbox/attribution-reporting/index.html',
    '/fr/docs/privacy-sandbox/fledge/index.html',
    '/fr/docs/privacy-sandbox/glossary/index.html',
    '/fr/docs/privacy-sandbox/overview/index.html',
    '/fr/docs/privacy-sandbox/trust-tokens/index.html',
    '/ja/docs/lighthouse/performance/third-party-facades/index.html',
    '/ja/docs/privacy-sandbox/glossary/index.html',
    '/ja/docs/privacy-sandbox/overview/index.html',
    '/ja/docs/privacy-sandbox/shared-storage/index.html',
    '/ja/docs/privacy-sandbox/trust-tokens/index.html',
    '/ja/docs/privacy-sandbox/use-shared-storage/index.html',
    '/ko/docs/lighthouse/performance/first-meaningful-paint/index.html',
    '/ko/docs/lighthouse/performance/third-party-facades/index.html',
    '/ko/docs/privacy-sandbox/glossary/index.html',
    '/ko/docs/privacy-sandbox/overview/index.html',
    '/ko/docs/privacy-sandbox/trust-tokens/index.html',
    ... 12 more items
  ],
  '0.12KB': [
    '/de/docs/privacy-sandbox/attribution-reporting-migration/index.html',
    '/en/articles/hidden-until-found/index.html',
    '/en/articles/inert/index.html',
    '/en/blog/300ms-tap-delay-gone-away/index.html',
    '/en/blog/anonymous-iframe-origin-trial/index.html',
    '/en/blog/ar-for-the-web/index.html',
    '/en/blog/autoplay/index.html',
    '/en/blog/autoplay-2/index.html',
    '/en/blog/background-sync/index.html',
    '/en/blog/broadcastchannel/index.html',
    '/en/blog/coep-credentialless-origin-trial/index.html',
    '/en/blog/colrv1-fonts/index.html',
    '/en/blog/compression-streams-api/index.html',
    '/en/blog/cq-polyfill/index.html',
    '/en/blog/credential-management-api/index.html',
    '/en/blog/css-grid-tooling/index.html',
    '/en/blog/cvd/index.html',
    '/en/blog/devtools-modern-web-debugging/index.html',
    '/en/blog/enabling-shared-array-buffer/index.html',
    '/en/blog/feature-policy/index.html',
    '/en/blog/has-with-cq-m105/index.html',
    '/en/blog/interactive-globe-with-css-shaders-google-maps/index.html',
    '/en/blog/media-updates-in-chrome-58/index.html',
    '/en/blog/media-updates-in-chrome-70/index.html',
    '/en/blog/migrating-to-typescript/index.html',
    '/en/blog/new-in-chrome-102/index.html',
    '/en/blog/new-in-chrome-104/index.html',
    '/en/blog/new-in-chrome-107/index.html',
    '/en/blog/new-in-chrome-94/index.html',
    '/en/blog/new-in-devtools-65/index.html',
    '/en/blog/new-in-devtools-71/index.html',
    '/en/blog/new-in-devtools-72/index.html',
    '/en/blog/position-sticky/index.html',
    '/en/blog/privacy-sandbox-unified-origin-trial/index.html',
    '/en/blog/progress-in-the-privacy-sandbox-2021-09/index.html',
    '/en/blog/scrolling-intervention/index.html',
    '/en/blog/scrolling-intervention-2/index.html',
    '/en/blog/sw-readablestreams/index.html',
    '/en/blog/user-agent-reduction-origin-trial/index.html',
    '/en/blog/viewport-resize-behavior/index.html',
    '/en/blog/wasm-debugging-2019/index.html',
    '/en/blog/wasm-module-sharing-restricted-to-same-origin/index.html',
    '/en/blog/web-custom-formats-for-the-async-clipboard-api/index.html',
    '/en/blog/what-is-the-top-layer/index.html',
    '/en/blog/yo-polymer-a-whirlwind-tour-of-web-component-tooling/index.html',
    '/en/docs/android/custom-tabs/low-level-api/index.html',
    '/en/docs/android/trusted-web-activity/android-browser-helper-migration/index.html',
    '/en/docs/android/trusted-web-activity/offline-first/index.html',
    '/en/docs/android/trusted-web-activity/play-billing/index.html',
    '/en/docs/android/trusted-web-activity/receive-payments-play-billing/index.html',
    '/en/docs/android/trusted-web-activity/web-share-target/index.html',
    '/en/docs/apps/app_codelab_basics/index.html',
    '/en/docs/apps/app_codelab_filesystem/index.html',
    '/en/docs/apps/app_codelab_publish/index.html',
    '/en/docs/apps/app_identity/index.html',
    '/en/docs/apps/game_engines/index.html',
    '/en/docs/apps/manifest/action_handlers/index.html',
    '/en/docs/apps/manifest/bluetooth/index.html',
    '/en/docs/apps/manifest/externally_connectable/index.html',
    '/en/docs/apps/manifest/sockets/index.html',
    '/en/docs/devtools/accessibility/contrast/index.html',
    '/en/docs/devtools/console/api/index.html',
    '/en/docs/devtools/console/index.html',
    '/en/docs/devtools/console/log/index.html',
    '/en/docs/devtools/css/index.html',
    '/en/docs/devtools/device-mode/testing-other-browsers/index.html',
    '/en/docs/devtools/dom/index.html',
    '/en/docs/devtools/evaluate-performance/index.html',
    '/en/docs/devtools/javascript/reference/index.html',
    '/en/docs/devtools/lighthouse/index.html',
    '/en/docs/devtools/memory-problems/index.html',
    '/en/docs/devtools/network/reference/index.html',
    '/en/docs/devtools/progressive-web-apps/index.html',
    '/en/docs/devtools/rendering/performance/index.html',
    '/en/docs/extensions/mv2/architecture-overview/index.html',
    '/en/docs/extensions/mv2/i18n-messages/index.html',
    '/en/docs/extensions/mv2/inline_faq/index.html',
    '/en/docs/extensions/mv2/manifest/cross_origin_embedder_policy/index.html',
    '/en/docs/extensions/mv2/manifest/cross_origin_opener_policy/index.html',
    '/en/docs/extensions/mv2/manifest/event_rules/index.html',
    '/en/docs/extensions/mv2/manifest/externally_connectable/index.html',
    '/en/docs/extensions/mv2/manifest/web_accessible_resources/index.html',
    '/en/docs/extensions/mv2/override/index.html',
    '/en/docs/extensions/mv2/overview/index.html',
    '/en/docs/extensions/mv2/performance/index.html',
    '/en/docs/extensions/mv2/settings_override/index.html',
    '/en/docs/extensions/mv2/shared_modules/index.html',
    '/en/docs/extensions/mv2/user_interface/index.html',
    '/en/docs/extensions/mv2/user_privacy/index.html',
    '/en/docs/extensions/mv3/i18n-messages/index.html',
    '/en/docs/extensions/mv3/manifest/cross_origin_embedder_policy/index.html',
    '/en/docs/extensions/mv3/manifest/cross_origin_opener_policy/index.html',
    '/en/docs/extensions/mv3/manifest/event_rules/index.html',
    '/en/docs/extensions/mv3/manifest/externally_connectable/index.html',
    '/en/docs/extensions/mv3/override/index.html',
    '/en/docs/extensions/mv3/settings_override/index.html',
    '/en/docs/extensions/mv3/single_purpose/index.html',
    '/en/docs/extensions/mv3/tut_oauth/index.html',
    '/en/docs/extensions/mv3/user_interface/index.html',
    '/en/docs/extensions/mv3/user_privacy/index.html',
    ... 227 more items
  ],
  '0.13KB': [
    '/de/docs/privacy-sandbox/floc/index.html',
    '/de/docs/privacy-sandbox/status/index.html',
    '/en/articles/register-secure-payment-confirmation/index.html',
    '/en/blog/a2hs-updates/index.html',
    '/en/blog/chrome-70-media-updates/index.html',
    '/en/blog/chromium-chronicle-4/index.html',
    '/en/blog/css-hyphens/index.html',
    '/en/blog/devtools-digest-film-strip-and-a-new-home-for-throttling/index.html',
    '/en/blog/devtools-revolutions-2013/index.html',
    '/en/blog/full-accessibility-tree/index.html',
    '/en/blog/help-css-nesting/index.html',
    '/en/blog/infinite-scroller/index.html',
    '/en/blog/inp-tools-2022/index.html',
    '/en/blog/lighthouse-8-4/index.html',
    '/en/blog/new-in-chrome-88/index.html',
    '/en/blog/new-in-chrome-90/index.html',
    '/en/blog/new-in-devtools-100/index.html',
    '/en/blog/new-in-devtools-101/index.html',
    '/en/blog/new-in-devtools-102/index.html',
    '/en/blog/new-in-devtools-103/index.html',
    '/en/blog/new-in-devtools-104/index.html',
    '/en/blog/new-in-devtools-105/index.html',
    '/en/blog/new-in-devtools-106/index.html',
    '/en/blog/new-in-devtools-107/index.html',
    '/en/blog/new-in-devtools-59/index.html',
    '/en/blog/new-in-devtools-60/index.html',
    '/en/blog/new-in-devtools-61/index.html',
    '/en/blog/new-in-devtools-62/index.html',
    '/en/blog/new-in-devtools-63/index.html',
    '/en/blog/new-in-devtools-64/index.html',
    '/en/blog/new-in-devtools-66/index.html',
    '/en/blog/new-in-devtools-67/index.html',
    '/en/blog/new-in-devtools-68/index.html',
    '/en/blog/new-in-devtools-70/index.html',
    '/en/blog/new-in-devtools-73/index.html',
    '/en/blog/new-in-devtools-74/index.html',
    '/en/blog/new-in-devtools-75/index.html',
    '/en/blog/new-in-devtools-76/index.html',
    '/en/blog/new-in-devtools-77/index.html',
    '/en/blog/new-in-devtools-78/index.html',
    '/en/blog/new-in-devtools-80/index.html',
    '/en/blog/new-in-devtools-81/index.html',
    '/en/blog/new-in-devtools-83/index.html',
    '/en/blog/new-in-devtools-84/index.html',
    '/en/blog/new-in-devtools-85/index.html',
    '/en/blog/new-in-devtools-86/index.html',
    '/en/blog/new-in-devtools-87/index.html',
    '/en/blog/new-in-devtools-88/index.html',
    '/en/blog/new-in-devtools-89/index.html',
    '/en/blog/new-in-devtools-90/index.html',
    '/en/blog/new-in-devtools-91/index.html',
    '/en/blog/new-in-devtools-92/index.html',
    '/en/blog/new-in-devtools-93/index.html',
    '/en/blog/new-in-devtools-94/index.html',
    '/en/blog/new-in-devtools-95/index.html',
    '/en/blog/new-in-devtools-96/index.html',
    '/en/blog/new-in-devtools-97/index.html',
    '/en/blog/new-in-devtools-98/index.html',
    '/en/blog/new-in-devtools-99/index.html',
    '/en/blog/notification-permission-data-in-crux/index.html',
    '/en/blog/performant-parallaxing/index.html',
    '/en/blog/present-web-pages-to-secondary-attached-displays/index.html',
    '/en/blog/profiling-long-paint-times-with-devtools-continuous-painting-mode/index.html',
    '/en/blog/pwa-manifest-id/index.html',
    '/en/blog/richer-pwa-installation/index.html',
    '/en/blog/top-layer-devtools/index.html',
    '/en/blog/vp9-webrtc/index.html',
    '/en/docs/android/custom-tabs/best-practices/index.html',
    '/en/docs/android/custom-tabs/headers/index.html',
    '/en/docs/android/custom-tabs/index.html',
    '/en/docs/android/custom-tabs/integration-guide/index.html',
    '/en/docs/android/trusted-web-activity/android-for-web-devs/index.html',
    '/en/docs/android/trusted-web-activity/lay-of-the-land/index.html',
    '/en/docs/android/trusted-web-activity/multi-origin/index.html',
    '/en/docs/android/trusted-web-activity/query-parameters/index.html',
    '/en/docs/android/trusted-web-activity/whats-new/index.html',
    '/en/docs/apps/analytics/index.html',
    '/en/docs/apps/angular_framework/index.html',
    '/en/docs/apps/app_bluetooth/index.html',
    '/en/docs/apps/app_codelab_alarms/index.html',
    '/en/docs/apps/app_codelab_images/index.html',
    '/en/docs/apps/app_codelab_import_todomvc/index.html',
    '/en/docs/apps/app_codelab_webview/index.html',
    '/en/docs/apps/app_frameworks/index.html',
    '/en/docs/apps/app_lifecycle/index.html',
    '/en/docs/apps/app_network/index.html',
    '/en/docs/apps/app_serial/index.html',
    '/en/docs/apps/app_storage/index.html',
    '/en/docs/apps/app_usb/index.html',
    '/en/docs/apps/chrome_apps_on_mobile/index.html',
    '/en/docs/apps/first_app/index.html',
    '/en/docs/apps/manifest/index.html',
    '/en/docs/apps/manifest/kiosk_enabled/index.html',
    '/en/docs/apps/manifest/name/index.html',
    '/en/docs/apps/manifest/storage/index.html',
    '/en/docs/apps/manifest/usb_printers/index.html',
    '/en/docs/apps/manifest/version/index.html',
    '/en/docs/apps/manifestVersion/index.html',
    '/en/docs/apps/migration/index.html',
    '/en/docs/apps/nativeMessaging/index.html',
    ... 460 more items
  ],
  '0.14KB': [
    '/en/articles/authenticate-secure-payment-confirmation/index.html',
    '/en/articles/bluetooth/index.html',
    '/en/articles/eyedropper/index.html',
    '/en/articles/fetch-streaming-requests/index.html',
    '/en/articles/layoutng/index.html',
    '/en/articles/renderingng-architecture/index.html',
    '/en/articles/renderingng-data-structures/index.html',
    '/en/articles/usb/index.html',
    '/en/blog/2-cookie-handoff/index.html',
    '/en/blog/a-new-experimental-feature-style-scoped/index.html',
    '/en/blog/addeventlistener-once/index.html',
    '/en/blog/aligning-input-events/index.html',
    '/en/blog/alpha-transparency-in-chrome-video/index.html',
    '/en/blog/app-install-banners-native/index.html',
    '/en/blog/app-shell/index.html',
    '/en/blog/async-call-stack/index.html',
    '/en/blog/asynchronous-access-to-http-cookies/index.html',
    '/en/blog/auditpanel/index.html',
    '/en/blog/aurora-resource-inlining/index.html',
    '/en/blog/avoid-not-secure-warn/index.html',
    '/en/blog/background-fetch/index.html',
    '/en/blog/beyond-spa/index.html',
    '/en/blog/blob-support-for-Indexeddb-landed-on-chrome-dev/index.html',
    '/en/blog/cache-query-options/index.html',
    '/en/blog/capabilities/index.html',
    '/en/blog/cascade-layers/index.html',
    '/en/blog/chips-origin-trial/index.html',
    '/en/blog/chrome-52-deprecations/index.html',
    '/en/blog/chrome-58-deprecations/index.html',
    '/en/blog/chrome-61-deprecations/index.html',
    '/en/blog/chrome-61-media-updates/index.html',
    '/en/blog/chrome-62-deprecations/index.html',
    '/en/blog/chrome-76-deps-rems/index.html',
    '/en/blog/chrome-87-deps-rems/index.html',
    '/en/blog/chrome-dev-summit-applied-science-runtime-perf/index.html',
    '/en/blog/chrome-dev-summit-mobile-summary/index.html',
    '/en/blog/chrome-dev-summit-open-web-platform-summary/index.html',
    '/en/blog/chrome-dev-summit-performance-summary/index.html',
    '/en/blog/chrome-dev-summit-platforms-summary/index.html',
    '/en/blog/chrome-dev-summit-polymer-declarative-encapsulated-reusable-components/index.html',
    '/en/blog/chrome-for-android-accelerating-the-mobile-web/index.html',
    '/en/blog/chromium-chronicle-1/index.html',
    '/en/blog/chromium-chronicle-14/index.html',
    '/en/blog/chromium-chronicle-15/index.html',
    '/en/blog/chromium-chronicle-17/index.html',
    '/en/blog/chromium-chronicle-18/index.html',
    '/en/blog/chromium-chronicle-25/index.html',
    '/en/blog/chromium-chronicle-7/index.html',
    '/en/blog/content-security-policy-1-0-is-officially-awesome/index.html',
    '/en/blog/creating-semantic-sites-with-web-components-and-jsonld/index.html',
    '/en/blog/cross-device-webotp/index.html',
    '/en/blog/crx-scripting-api/index.html',
    '/en/blog/csp/index.html',
    '/en/blog/css-filter-effects-landing-in-webkit/index.html',
    '/en/blog/css-variables-why-should-you-care/index.html',
    '/en/blog/cut-and-copy-commands/index.html',
    '/en/blog/cws-analytics-revamp/index.html',
    '/en/blog/datalist-for-range-color-inputs-offer-some-default-choices/index.html',
    '/en/blog/defining-scope-In-indexeddb-transactions/index.html',
    '/en/blog/deps-rems-103/index.html',
    '/en/blog/deps-rems-91/index.html',
    '/en/blog/desynchronized/index.html',
    '/en/blog/device-orientation-changes/index.html',
    '/en/blog/devtools-2013-11/index.html',
    '/en/blog/devtools-answers-what-font-is-that/index.html',
    '/en/blog/devtools-better-angular-debugging/index.html',
    '/en/blog/devtools-digest-2016-06/index.html',
    '/en/blog/devtools-digest-cds-edition/index.html',
    '/en/blog/devtools-digest-supercharged-remote-debugging/index.html',
    '/en/blog/devtools-introduction-part-1/index.html',
    '/en/blog/devtools-javascript-cpu-profile-migration/index.html',
    '/en/blog/devtools-javascript-cpu-profile-migration-2/index.html',
    '/en/blog/devtools-mobile/index.html',
    '/en/blog/devtools-timeline-now-providing-the-full-story/index.html',
    '/en/blog/devtools-tips-15/index.html',
    '/en/blog/disabling-hardware-noise-suppression/index.html',
    '/en/blog/early-hints/index.html',
    '/en/blog/embed-content/index.html',
    '/en/blog/first-input-delay-in-crux/index.html',
    '/en/blog/first-party-sets-sameparty/index.html',
    '/en/blog/fledge-service-overview/index.html',
    '/en/blog/focus-start-point/index.html',
    '/en/blog/font-display/index.html',
    '/en/blog/foreign-fetch/index.html',
    '/en/blog/formdata-methods-for-inspection-and-modification/index.html',
    '/en/blog/frame-timing-api/index.html',
    '/en/blog/fresher-sw/index.html',
    '/en/blog/fugu-showcase/index.html',
    '/en/blog/fundamental-of-mobile-web-development/index.html',
    '/en/blog/geolocation-on-secure-contexts-only/index.html',
    '/en/blog/get-on-the-css-grid/index.html',
    '/en/blog/get-ready-for-cds/index.html',
    '/en/blog/has-m105/index.html',
    '/en/blog/heavy-ad-interventions/index.html',
    '/en/blog/hotpath-with-wasm/index.html',
    '/en/blog/houdini/index.html',
    '/en/blog/how-to-measure-browser-graphics-performance/index.html',
    '/en/blog/immutable-document-domain/index.html',
    '/en/blog/introduction-to-custom-filters-aka-css-shaders/index.html',
    '/en/blog/is-project-fugu-done/index.html',
    ... 160 more items
  ],
  '0.15KB': [
    '/en/articles/blinkng/index.html',
    '/en/articles/periodic-background-sync/index.html',
    '/en/articles/videong/index.html',
    '/en/blog/5-tricks-to-use-in-the-console-panel/index.html',
    '/en/blog/DOM-attributes-now-on-the-prototype-chain/index.html',
    '/en/blog/a-more-compatible-smoother-touch/index.html',
    '/en/blog/a-new-home-for-devtools/index.html',
    '/en/blog/abortable-fetch/index.html',
    '/en/blog/advanced-web-apps-fund/index.html',
    '/en/blog/angular-image-directive/index.html',
    '/en/blog/animated-blur/index.html',
    '/en/blog/attribution-reporting-jan-2022-updates/index.html',
    '/en/blog/attribution-reporting-updates-june-2022/index.html',
    '/en/blog/audio-worklet/index.html',
    '/en/blog/auto-dark-theme/index.html',
    '/en/blog/autocapitalize/index.html',
    '/en/blog/automating-resource-selection-with-client-hints/index.html',
    '/en/blog/automating-web-performance-measurement/index.html',
    '/en/blog/auxclick/index.html',
    '/en/blog/avoiding-oversharing-when-screen-sharing/index.html',
    '/en/blog/background_tabs/index.html',
    '/en/blog/big-boost-to-dom-performance-webkit-s-innerhtml-is-240-faster/index.html',
    '/en/blog/browser-flags/index.html',
    '/en/blog/budget-api/index.html',
    '/en/blog/canvas-driven-background-images/index.html',
    '/en/blog/canvas2d/index.html',
    '/en/blog/capture-stream/index.html',
    '/en/blog/chrome-107-beta/index.html',
    '/en/blog/chrome-108-beta/index.html',
    '/en/blog/chrome-47-webrtc/index.html',
    '/en/blog/chrome-49-deprecations/index.html',
    '/en/blog/chrome-50-deprecations/index.html',
    '/en/blog/chrome-51-deprecations/index.html',
    '/en/blog/chrome-53-deprecations/index.html',
    '/en/blog/chrome-54-deprecations/index.html',
    '/en/blog/chrome-55-deprecations/index.html',
    '/en/blog/chrome-56-deprecations/index.html',
    '/en/blog/chrome-57-deprecations/index.html',
    '/en/blog/chrome-58-media-updates/index.html',
    '/en/blog/chrome-59-deprecations/index.html',
    '/en/blog/chrome-60-deprecations/index.html',
    '/en/blog/chrome-63-deprecations/index.html',
    '/en/blog/chrome-64-deprecations/index.html',
    '/en/blog/chrome-65-deprecations/index.html',
    '/en/blog/chrome-66-deprecations/index.html',
    '/en/blog/chrome-67-deps-rems/index.html',
    '/en/blog/chrome-68-deps-rems/index.html',
    '/en/blog/chrome-70-deps-rems/index.html',
    '/en/blog/chrome-71-deps-rems/index.html',
    '/en/blog/chrome-72-deps-rems/index.html',
    '/en/blog/chrome-73-deps-rems/index.html',
    '/en/blog/chrome-74-deps-rems/index.html',
    '/en/blog/chrome-75-deps-rems/index.html',
    '/en/blog/chrome-77-deps-rems/index.html',
    '/en/blog/chrome-78-deps-rems/index.html',
    '/en/blog/chrome-79-deps-rems/index.html',
    '/en/blog/chrome-80-deps-rems/index.html',
    '/en/blog/chrome-81-deps-rems/index.html',
    '/en/blog/chrome-83-deps-rems/index.html',
    '/en/blog/chrome-84-deps-rems/index.html',
    '/en/blog/chrome-85-deps-rems/index.html',
    '/en/blog/chrome-86-deps-rems/index.html',
    '/en/blog/chrome-88-deps-rems/index.html',
    '/en/blog/chrome-loadtimes-deprecated/index.html',
    '/en/blog/chromium-chronicle-2/index.html',
    '/en/blog/chromium-chronicle-20/index.html',
    '/en/blog/chromium-chronicle-22/index.html',
    '/en/blog/chromium-chronicle-28/index.html',
    '/en/blog/chromium-chronicle-3/index.html',
    '/en/blog/chromium-chronicle-6/index.html',
    '/en/blog/chromium-chronicle-9/index.html',
    '/en/blog/conformance/index.html',
    '/en/blog/createimagebitmap-in-chrome-50/index.html',
    '/en/blog/cross-origin-isolated-hr-timers/index.html',
    '/en/blog/cross-origin-prefetch/index.html',
    '/en/blog/csp-issues/index.html',
    '/en/blog/css-background-shorthand-coming-to-mobile-webkit-browsers/index.html',
    '/en/blog/css-containment/index.html',
    '/en/blog/css-grid/index.html',
    '/en/blog/css-layout-gets-smarter-with-calc/index.html',
    '/en/blog/cssom/index.html',
    '/en/blog/custom-scrollbar/index.html',
    '/en/blog/custom-tabs-android-11/index.html',
    '/en/blog/deprecating-web-sql/index.html',
    '/en/blog/deps-rems-100/index.html',
    '/en/blog/deps-rems-101/index.html',
    '/en/blog/deps-rems-102/index.html',
    '/en/blog/deps-rems-104/index.html',
    '/en/blog/deps-rems-105/index.html',
    '/en/blog/deps-rems-106/index.html',
    '/en/blog/deps-rems-89/index.html',
    '/en/blog/deps-rems-90/index.html',
    '/en/blog/deps-rems-92/index.html',
    '/en/blog/deps-rems-93/index.html',
    '/en/blog/deps-rems-94/index.html',
    '/en/blog/deps-rems-95/index.html',
    '/en/blog/deps-rems-96/index.html',
    '/en/blog/deps-rems-97/index.html',
    '/en/blog/deps-rems-98/index.html',
    '/en/blog/deps-rems-99/index.html',
    ... 171 more items
  ],
  '0.16KB': [
    '/en/articles/secure-payment-confirmation/index.html',
    '/en/blog/animation-worklet/index.html',
    '/en/blog/chromium-chronicle-5/index.html',
    '/en/blog/css-in-js/index.html',
    '/en/blog/devtools-digest-december-2013/index.html',
    '/en/blog/fedcm-origin-trial/index.html',
    '/en/blog/inside-browser-part2/index.html',
    '/en/blog/inside-browser-part3/index.html',
    '/en/blog/issues-tab/index.html',
    '/en/blog/lighthouse-jan/index.html',
    '/en/blog/lighthouse3/index.html',
    '/en/blog/migrating-to-js-modules/index.html',
    '/en/docs/extensions/reference/accessibilityFeatures/index.html',
    '/en/docs/extensions/reference/app_runtime/index.html',
    '/en/docs/extensions/reference/app_window/index.html',
    '/en/docs/extensions/reference/audio/index.html',
    '/en/docs/extensions/reference/bluetooth/index.html',
    '/en/docs/extensions/reference/bluetoothLowEnergy/index.html',
    '/en/docs/extensions/reference/bluetoothSocket/index.html',
    '/en/docs/extensions/reference/bookmarks/index.html',
    '/en/docs/extensions/reference/browserAction/index.html',
    '/en/docs/extensions/reference/history/index.html',
    '/en/docs/extensions/reference/idle/index.html',
    '/en/docs/extensions/reference/input_ime/index.html',
    '/en/docs/extensions/reference/loginState/index.html',
    '/en/docs/extensions/reference/management/index.html',
    '/en/docs/extensions/reference/windows/index.html',
    '/en/docs/workbox/reference/workbox-build/index.html',
    '/en/docs/workbox/reference/workbox-core/index.html',
    '/en/docs/workbox/reference/workbox-precaching/index.html',
    '/en/docs/workbox/reference/workbox-streams/index.html',
    '/en/docs/workbox/reference/workbox-webpack-plugin/index.html',
    '/en/tags/privacy/index.html'
  ],
  '0.17KB': [
    '/en/blog/faster-stack-traces/index.html',
    '/en/docs/extensions/mv2/faq/index.html',
    '/en/docs/extensions/mv3/faq/index.html',
    '/en/docs/extensions/reference/action/index.html',
    '/en/docs/extensions/reference/alarms/index.html',
    '/en/docs/extensions/reference/appviewTag/index.html',
    '/en/docs/extensions/reference/browser/index.html',
    '/en/docs/extensions/reference/browsingData/index.html',
    '/en/docs/extensions/reference/devtools_network/index.html',
    '/en/docs/extensions/reference/documentScan/index.html',
    '/en/docs/extensions/reference/dom/index.html',
    '/en/docs/extensions/reference/enterprise_deviceAttributes/index.html',
    '/en/docs/extensions/reference/enterprise_hardwarePlatform/index.html',
    '/en/docs/extensions/reference/enterprise_networkingAttributes/index.html',
    '/en/docs/extensions/reference/enterprise_platformKeys/index.html',
    '/en/docs/extensions/reference/events/index.html',
    '/en/docs/extensions/reference/hid/index.html',
    '/en/docs/extensions/reference/instanceID/index.html',
    '/en/docs/extensions/reference/pageCapture/index.html',
    '/en/docs/extensions/reference/sockets_tcpServer/index.html',
    '/en/docs/extensions/reference/system_cpu/index.html',
    '/en/docs/extensions/reference/system_memory/index.html',
    '/en/docs/extensions/reference/system_network/index.html',
    '/en/docs/extensions/reference/virtualKeyboard/index.html',
    '/en/docs/workbox/reference/workbox-background-sync/index.html',
    '/en/docs/workbox/reference/workbox-broadcast-update/index.html',
    '/en/docs/workbox/reference/workbox-cacheable-response/index.html',
    '/en/docs/workbox/reference/workbox-expiration/index.html',
    '/en/docs/workbox/reference/workbox-google-analytics/index.html',
    '/en/docs/workbox/reference/workbox-navigation-preload/index.html',
    '/en/docs/workbox/reference/workbox-range-requests/index.html',
    '/en/docs/workbox/reference/workbox-recipes/index.html',
    '/en/docs/workbox/reference/workbox-routing/index.html',
    '/en/docs/workbox/reference/workbox-strategies/index.html',
    '/en/docs/workbox/reference/workbox-window/index.html'
  ],
  '0.18KB': [
    '/authors/alexandrawhite/index.html',
    '/authors/kevinkiklee/index.html',
    '/authors/paulkinlan/index.html',
    '/authors/paullewis/index.html',
    '/authors/samdutton/2/index.html',
    '/authors/sethladd/index.html',
    '/en/blog/28/index.html',
    '/en/blog/29/index.html',
    '/en/blog/4/index.html',
    '/en/blog/puppetaria/index.html',
    '/en/tags/experiment/index.html',
    '/es/blog/28/index.html',
    '/es/blog/29/index.html',
    '/es/blog/4/index.html',
    '/ja/blog/28/index.html',
    '/ja/blog/29/index.html',
    '/ko/blog/28/index.html',
    '/ko/blog/29/index.html',
    '/ko/blog/4/index.html',
    '/pt/blog/28/index.html',
    '/pt/blog/29/index.html',
    '/pt/blog/4/index.html',
    '/ru/blog/28/index.html',
    '/ru/blog/29/index.html',
    '/ru/blog/4/index.html',
    '/zh/blog/28/index.html',
    '/zh/blog/29/index.html',
    '/zh/blog/4/index.html'
  ],
  '0.21KB': [
    '/en/blog/modernising-css-infra-in-devtools/index.html',
    '/en/blog/performance-insights/index.html'
  ],
  '0.22KB': [
    '/en/blog/migrating-to-web-components/index.html',
    '/en/privacy-sandbox/index.html'
  ],
  '0.23KB': [ '/en/blog/framework-fund-2022/index.html' ],
  '0.26KB': [ '/en/docs/lighthouse/accessibility/scoring/index.html' ],
  '0.28KB': [
    '/en/docs/apps/api_other/index.html',
    '/en/docs/extensions/mv3/hosting/index.html'
  ],
  '0.29KB': [
    '/en/blog/extend-recorder/index.html',
    '/en/docs/native-client/glossary/index.html'
  ],
  '0.30KB': [
    '/en/blog/webdriver-bidi/index.html',
    '/en/docs/extensions/mv3/declare_permissions/index.html',
    '/en/docs/extensions/mv3/manifest/nacl_modules/index.html',
    '/en/docs/extensions/mv3/manifest/requirements/index.html',
    '/en/docs/extensions/mv3/manifest/sandbox/index.html',
    '/en/docs/handbook/how-to/create-anchor-redirects/index.html',
    '/en/docs/handbook/how-to/display-a-banner/index.html',
    '/en/docs/webstore/program-policies/chrome-apps/index.html'
  ],
  '0.31KB': [
    '/en/blog/domtokenlist-validation-added-in-chrome-50/index.html',
    '/en/blog/history-api-scroll-restoration/index.html',
    '/en/blog/touch-action/index.html',
    '/en/docs/apps/manifest/icons/index.html',
    '/en/docs/crux/about/index.html',
    '/en/docs/devtools/accessibility/focus/index.html',
    '/en/docs/devtools/device-mode/geolocation/index.html',
    '/en/docs/devtools/device-mode/orientation/index.html',
    '/en/docs/devtools/device-mode/override-user-agent/index.html',
    '/en/docs/extensions/mv3/mv2-sunset/index.html',
    '/en/docs/extensions/mv3/samples/index.html',
    '/en/docs/extensions/reference/experimental_devtools/index.html',
    '/en/docs/extensions/reference/experimental_inputUI/index.html',
    '/en/docs/extensions/reference/location/index.html',
    '/en/docs/extensions/reference/webstore/index.html',
    '/en/docs/native-client/community/application-gallery/index.html',
    '/en/docs/native-client/community/middleware/index.html',
    '/en/docs/native-client/image-list/index.html',
    '/en/docs/native-client/pepper_beta/c/struct_p_p_b___instance__1__0/index.html',
    '/en/docs/native-client/pepper_beta/cpp/classpp_1_1_instance/index.html',
    '/en/docs/native-client/pepper_dev/c/struct_p_p_b___instance__1__0/index.html',
    '/en/docs/native-client/pepper_dev/cpp/classpp_1_1_instance/index.html',
    '/en/docs/native-client/pepper_stable/c/struct_p_p_b___instance__1__0/index.html',
    '/en/docs/native-client/pepper_stable/cpp/classpp_1_1_instance/index.html',
    '/en/docs/native-client/version/index.html',
    '/en/docs/webstore/program-policies/accepting-payment/index.html',
    '/en/docs/workbox/different-architectures/index.html',
    '/en/docs/workbox/what-is-workbox/index.html'
  ],
  '0.32KB': [
    '/en/blog/7-minute-videos-javascript-console-protips-newish-dom-apis/index.html',
    '/en/blog/absolute-positioned-children/index.html',
    '/en/blog/back-forward-cache/index.html',
    '/en/blog/canvas-toblob-in-chrome-50/index.html',
    '/en/blog/chips-origin-trial-extended/index.html',
    '/en/blog/chrome-developer-tools-for-speed/index.html',
    '/en/blog/chromium-chronicle-16/index.html',
    '/en/blog/chromium-chronicle-21/index.html',
    '/en/blog/chromium-chronicle-23/index.html',
    '/en/blog/crux-2017-12/index.html',
    '/en/blog/datalist-landed-in-chrome-canary/index.html',
    '/en/blog/devtools-tips-10/index.html',
    '/en/docs/apps/manifest/file_handlers/index.html',
    '/en/docs/apps/manifest/nacl_modules/index.html',
    '/en/docs/apps/manifest/requirements/index.html',
    '/en/docs/apps/manifest/sandbox/index.html',
    '/en/docs/apps/manifest/url_handlers/index.html',
    '/en/docs/extensions/mv2/declare_permissions/index.html',
    '/en/docs/extensions/mv2/manifest/nacl_modules/index.html',
    '/en/docs/extensions/mv2/manifest/requirements/index.html',
    '/en/docs/extensions/mv2/manifest/sandbox/index.html',
    '/en/docs/extensions/mv3/manifest/icons/index.html',
    '/en/docs/native-client/pepper_beta/c/group___enums/index.html',
    '/en/docs/native-client/pepper_beta/c/group___functions/index.html',
    '/en/docs/native-client/pepper_beta/c/group___typedefs/index.html',
    '/en/docs/native-client/pepper_beta/c/pp__array__output_8h/index.html',
    '/en/docs/native-client/pepper_beta/c/struct_p_p_b___host_resolver__1__0/index.html',
    '/en/docs/native-client/pepper_beta/c/struct_p_p_b___i_m_e_input_event__1__0/index.html',
    '/en/docs/native-client/pepper_beta/c/struct_p_p_b___image_data__1__0/index.html',
    '/en/docs/native-client/pepper_beta/c/struct_p_p_b___input_event__1__0/index.html',
    '/en/docs/native-client/pepper_beta/c/struct_p_p_b___keyboard_input_event__1__2/index.html',
    '/en/docs/native-client/pepper_beta/c/struct_p_p_b___media_stream_audio_track__0__1/index.html',
    '/en/docs/native-client/pepper_beta/c/struct_p_p_b___media_stream_video_track__1__0/index.html',
    '/en/docs/native-client/pepper_beta/c/struct_p_p_b___message_loop__1__0/index.html',
    '/en/docs/native-client/pepper_beta/c/struct_p_p_b___messaging__1__2/index.html',
    '/en/docs/native-client/pepper_beta/c/struct_p_p_b___mouse_cursor__1__0/index.html',
    ... 321 more items
  ],
  '0.33KB': [
    '/de/docs/privacy-sandbox/index.html',
    '/en/blog/chromium-chronicle-10/index.html',
    '/en/blog/crux-2018-01/index.html',
    '/en/blog/film-strips-in-network-panel/index.html',
    '/en/blog/getting-gmail-to-handle-all-mailto-links-with-registerprotocolhandler/index.html',
    '/en/blog/notification-actions/index.html',
    '/en/docs/android/index.html',
    '/en/docs/apps/app_codelab_intro/index.html',
    '/en/docs/apps/event_pages/index.html',
    '/en/docs/apps/index.html',
    '/en/docs/apps/manifest/app/index.html',
    '/en/docs/apps/manifest/default_locale/index.html',
    '/en/docs/apps/manifest/description/index.html',
  ],
  '0.34KB': [
    '/en/blog/100-web-moments/index.html',
    '/en/blog/add-a-new-custom-device-as-a-preset/index.html',
    '/en/blog/advanced-web-apps-fund-oct-22/index.html',
    '/en/blog/alt-click-to-expand-all-child-nodes/index.html',
    '/en/blog/alt-click-to-expand-all-child-nodes-2/index.html',
    '/en/blog/announcing-new-game-the-conference-for-html5-game-developers/index.html',
    '/en/blog/app-cache-tools-and-auto-generators/index.html',
    ... 29 more items
  ],
  '0.35KB': [
    '/authors/arthursonzogni/index.html',
    '/en/blog/2/index.html',
    '/en/tags/security/index.html',
    '/es/blog/2/index.html',
    '/ja/blog/2/index.html',
    '/ko/blog/2/index.html',
    '/pt/blog/2/index.html',
    '/ru/blog/2/index.html',
    '/zh/blog/2/index.html'
  ],
  '0.36KB': [
    '/en/docs/native-client/pepper_beta/c/globals_defs/index.html',
    '/en/docs/native-client/pepper_beta/c/group___interfaces/index.html',
    '/en/docs/native-client/pepper_beta/c/group___structs/index.html',
    '/en/docs/native-client/pepper_beta/c/pp__instance_8h/index.html',
    '/en/docs/native-client/pepper_beta/c/pp__module_8h/index.html',
    '/en/docs/native-client/pepper_beta/c/ppb__text__input__controller_8h/index.html',
    '/en/docs/native-client/pepper_beta/c/ppb__udp__socket_8h/index.html',
    '/en/docs/native-client/pepper_beta/c/ppb__url__loader_8h/index.html',
    '/en/docs/native-client/pepper_beta/c/ppb__url__request__info_8h/index.html',
    ... 690 more items
  ],
  '0.37KB': [
    '/authors/aaronhk/index.html',
    ... 596 more items
  ],
  '0.38KB': [
    '/en/100/index.html',
    '/en/404/index.html',
    '/en/capabilities/index.html',
    '/en/meet-the-team/index.html',
    '/en/payments/index.html',
    '/en/preview/index.html',
    '/en/workbox/index.html',
    '/es/404/index.html',
    '/es/index.html',
    '/ja/404/index.html',
    '/ja/index.html',
    '/ko/404/index.html',
    '/ko/index.html',
    '/pt/404/index.html',
    '/pt/index.html',
    '/ru/404/index.html',
    '/ru/index.html',
    '/zh/404/index.html',
    '/zh/index.html'
  ],
  '0.41KB': [
    '/en/index.html',
    '/en/password-manager-compatible/index.html',
    '/ja/privacy-sandbox/index.html'
  ]
}
matthiasrohmer commented 1 year ago

The decrease in build times is it worth though I think. All tests ran with csso 5.05 and purgecss 5.0.0, which are the recent versions and newer than what we currently have on main. The first run shows timings with all ELEVENTY_IGNORE flags set to true, the second timing is for a full production build.

Old transformer: [11ty] Copied 721 files / Wrote 84 files in 6.67 seconds (79.4ms each, v1.0.1) [11ty] Copied 721 files / Wrote 4038 files in 317.50 seconds (78.6ms each, v1.0.1)

Old transformer, full build, after JS fix [11ty] Copied 721 files / Wrote 4097 files in 406.03 seconds (99.1ms each, v1.0.1)

New transformer: [11ty] Copied 721 files / Wrote 84 files in 5.20 seconds (61.9ms each, v1.0.1) [11ty] Copied 721 files / Wrote 4038 files in 231.61 seconds (57.4ms each, v1.0.1)

New transformer, full build, after JS fix [11ty] Copied 721 files / Wrote 4097 files in 313.01 seconds (76.4ms each, v1.0.1)

matthiasrohmer commented 1 year ago

With the shortcode-based solution, which allows to include arbitrary CSS, we are at 66.9ms per page.