We expect this release to ship in the DevTools of Chrome 84.
Notable changes
So many! See the Lighthouse 6.0: What's New blog post for an in-depth look.
🆕 New audits
- Largest Contentful Paint (LCP) is a new metric that measures the time from navigation until the largest content element in the viewport is rendered (#9905, #10213, #10452, #10529).
- Cumulative Layout Shift (CLS) is a new metric that measures the amount of unexpected movement of content as a page loads (#9037, #10427, #10495, #10570, #10728).
layout-shift-elements
is another companion diagnostic that gives information about the elements that shifted as the page loaded (#10702).
unused-javascript
is an audit that has been kicking around for some time but is only now turned on by default. It accounts for what JavaScript was loaded but never executed during page load and estimates the load time that could be saved via code splitting, dead code elimination, or judicious use of the delete key (#9854).- A PWA
maskable-icon
just looks better on your homescreen, so this new audit encourages you to have at least one available in your manifest (#10370). timing-budget
expands budget assertions to now be settable on all the performance metrics (#9901, #9925).- The new
charset
audit ensures a proper character encoding for page content (#10284, #10389, #10689). image-size-responsive
checks that images have an aspect ratio and resolution that match well with how they are displayed on a page (#10460).- Updating to the latest version of
axe-core
has unlocked a number of new accessibility audits:aria-hidden-body
,aria-hidden-focus
,aria-input-field-name
,aria-toggle-field-name
,duplicate-id-active
,duplicate-id-aria
,form-field-multiple-labels
,heading-order
(#9798).
⚗️ Experimental audits
These audits are not yet part of the default Lighthouse experience, but they will provide performance advice based on analysis of a page's JavaScript bundles. They can be tested today on the command line with the --preset=experimental
flag.
legacy-javascript
rummages through your bundles looking for polyfills and bundler transforms that aren't necessary or are outdated (#10303, #10568, #10564).duplicated-javascript
also takes a dive through a page's JavaScript looking for code that has ended up duplicated within bundles or across multiple bundles (#10314).unused-javascript
now runs by default (as mentioned above), but when run underexperimental
, the audit can use source maps to show what original source code was never run and could be postponed or eliminated (#10090).
New contributors!
Thanks to @TGiles, @roelfjan, @chruxin, @warrengm, @alexgreencode, @mikedijkstra, @egsweeny, @johnsampson, @jazyan, @b3none, @mattjared, @Malvoz, @Beytoven, @Munter, @jayaddison, @msomji, @piotrzarycki, @awdltd, @mathiasbynens, @Carr1005, @staabm, @SphinxKnight, @sk-, @AndreasKubasa, @jantimon, @kmanuel, @Kikobeats, @RolandBurrows, @nxqamar, @catalinred, and @baseeee for their first contributions! So many!
💥 Breaking changes
- Performance metric scores have been reweighted to better reflect a user's loading experience (#9949).
- Metric score curves have been updated when running a desktop Lighthouse test to account for the faster connection and CPU (#9911, #10756).
frameNavigated
events are now used to track redirects, which means JS redirects are now accounted for when determining the run'sfinalUrl
(#10339).- The emulated mobile device has moved from the Nexus 5x to the Moto G4 (but the existing DPR has been left unchanged) (#10191, #10749).
- The
mixed-content
preset has been removed as it was not widely used and takes too long to be added to the default Lighthouse experience (#10159, #10750). - The
full
preset has been renamedexperimental
to signify that the code there may not be ready for running by default (#9930, #10311, #10333, #10585). - The emulated Chrome UA string has been updated to Chrome 80 (#9967).
installable-manifest
: icons in the Web app manifest must be fetchable to be considered installable (#10168, #10320)
🤖💥 Breaking changes for programmatic users
These changes are unlikely to affect end users, but may be important if you are writing custom configs, plugins, or processing the Lighthouse JSON output.
LH.Audit.Context
passed into audits is now treated as immutable. If code previously pushed tocontext.LighthouseRunWarnings
to get a top-level warning, it should now pass that back inrunWarnings
on the audit's product (#10555).Audit.computeLogNormalScore
has been redefined to specify log-normal curves with median and p10 points (dropping the "point of diminishing returns"). Existing audits have been moved to this new definition so that no score changes should occur (#10715).- A
loadFailureMode
setting has been added toConfig
passes to control behavior in case of page load failure. Previously this was implicitly controlled (e.g. no offline page available did not cause an error) (#9987) time-to-first-byte
has been renamedserver-response-time
to better reflect what is being measured by the audit (#10735).resource-summary
:details.items.size
has been renamed totransferSize
for clarity (#10700, #10743).
🧱 Core
Improvements, bug fixes, clarifications
The following changes are considered to be bug fixes or updates to better match what was intended to be audited, but the changes may cause adjustments in audit scores or behavior.
- add top-level warning if Lighthouse hit a timeout before load was complete (#10538)
- add top-level warning if tested URL was redirected (#10157)
- FCP + 5 seconds is now included as a minimum time that must be reached before the test page is considered loaded (#10505, #10516)
- load simulation: add edges from
initiatorRequest
when there are duplicate records (#10097) - load simulation: keep first layout/paint/parse events regardless of duration (#9922)
- load simulation: do not create self-dependencies via timers (#10280)
- load simulation: remove min task duration on CPU nodes (#9910)
- load simulation: use fixed times for data URLs since they've already been loaded (#9932)
- load simulation: link layout nodes to root frame request (#9727)
- tracehouse: improved attribution for XHRs + paint/layout/HTML (#10001)
offscreen-images
: look outside three viewports for possible images to defer (#10643)uses-responsive-images
: include offscreen images larger than viewport (#10506, #10561)accessibility
: includeaxe-core
'incomplete' results in artifact to include even partial a11y results (#10072, #10270)audio-caption
: remove check that has been disabled byaxe-core
(#10453)link-text
: Add more keywords to blocklist (#9986)font-size
: don't allow a deleted node to fail gatherer (#9928)installable-manifest
: lower required icon size from 192px to 144px (#10175)is-on-https
: addfilesystem
to secure schemes (#10073)offscreen-images
: excludelazy
oreager
loading
images (#10117)resource-summary
: don't include favicon.ico in summary (#10190)uses-rel-preconnect
: warn if more than three preconnects found (#9903, #10293)third-party-summary
: don't include main resource if origin in third-party list (#10006)js-lib-detector
: handle new fast lib detection entries, version heterogeneity (#9888, #10295, #10176)is-on-https
: update description to reference mixed content (#10712)definition-list
: mention<div>
is allowed to group content in<dl>
(#10479)offline-start-url
: improve failure messages (#9982)- update and fix links to docs in audit and stack-pack descriptions (#9850, #9863, #10019, #10069, #10246, #10496, #10714)
New things for programmatic users
- audit results now have a
numericUnit
property to specify the units for theirnumericResult
(#9979) ImageElements
: addusesPixelArtScaling
andusesSrcSetDensityDescriptor
properties (#10481)MetaElements
: includeproperty
attribute (#9978)- add new base artifact
HostFormFactor
(#9923) - refactor to share
unused-javascript-summary
as a computed artifact (#10387, #10634) - add new source-map computed artifact,
js-bundles
(#10078) - refactor to share
unused-css
as a computed artifact (#10160) - refactor to share metric timing as a computed artifact (#9814)
- budgets: add support for CLS and LCP budgets (#10579, #10625)
- budgets: add
firstPartyHostnames
to the API (#10105, #10324) - budgets: remove unused
tolerance
property from API (#9770)
Internal refactors and improvements
- ensure
axe-core
errors are properly serialized (#10646) - cleanup of
audit-details
type names (#10603) - include
finished
state on hiddennetwork-requests
audit (#10530) - fetch source maps outside of test page so not blocked by CORS (#9459)
driver
: dead code cleanup (#10491, #10571)- add internal-only
__internalOptionalArtifacts
for experimental artifacts (#10355) font-size
: useDOMSnapshot.captureSnapshot
for better performance (#10200)- use isolated
evaluateAsync
when fetching content from the test page (#10130) - budgets: centralize path-matching logic (#9895)
script-elements
: fetch script content in parallel (#9713)- include
GatherRunner.runPass
in internal perf timing numbers (#10205) - rename
GatherRunner.isPerfPass
for clarity (#9896) - migrate to flattened Chrome DevTools Protocol (#9783)
💻 CLI
- add support for multiple
--chrome-flags
(#10607) - allow comma-separated values for
--output
(#10188) - add
--chrome-ignore-default-flags
(#10184) - allow
--extra-headers
as object (#9962)
📔 Report
- add "Trust and Safety" group in the Best Practices category (#10623)
- add link to score calculator populated with current metric scores (#10754, #10763, #10773, #10767)
- improve display of top-level warnings (#10636, #10765)
external-anchors-use-rel-noopener
: usenode
audit details type (#10242)is-crawlable
: includerobots.txt
line number that blocks crawling (#10154)- temporary test of css grid for metrics (#10695, #10778)
- define monospace
font-size
relative toreport-font-size
(#10761) - link to updated scoring documentation (#10725)
- add non-
null
jsdoc type annotations for internal linter (#10454) - clarify "size" as either transfer or resource size (#10420)
- update table and inline code formatting (#10437)
- fix link contrast in dark mode (#10364)
- add
channel
to runtime settings (#10099) - align audit warnings (#10232)
- close drop-down menu when focus is lost (#10208)
- hide drop-down menu when printing (#10216)
- move
Util.UIStrings
toUtil.i18n
(#10153) - add initial support for subrows within a table (#10084)
- adjust score gauge's arc length to account for rounded linecap (#9913)
- fix header-shifting flicker during scrolling (#9955)
- add
source-location
details for linking to source code (#9354) - CSV report: add tested URLs to entries (#10656, #10675)
- viewer: add option for loading JSON from any URL (#10608)
- viewer: mention other lighthouse channels (#10384)
- viewer: add page and cursor styling to signal loading (#10305, #10348)
- viewer: use new logo (#9991, #9999, #10002)
👥 Clients
- retire extension; replace with PSI launcher (#9193, #9988, #9989)
- extension: add firefox support (#10332)
- extension: remove content security policy (#10380)
- devtools: share desktop throttling settings with lightrider (#10322)
- devtools: split up
runLighthouseInWorker
and expose to worker (#10005) - devtools: add
settings.internalDisableDeviceScreenEmulation
(#9377) - devtools: include
lighthouse-plugin-publisher-ads
in bundle (#9924, #10583, #10682) - devtools: update
roll-to-devtools
and track upstream changes (#9942, #10310, #10036, #10758, #10762)
🌍 i18n
- new strings: audits, stack packs, headings, and corrections (#9940, #10244, #10245, #10645)
- localize runtime settings and tools in report (#9166)
- don't give unused arguments for localized protocol errors (#9935)
- use
log.verbose()
for outdated-strings warning (#9931) - centralize strings for metric names (#9871)
Docs
- plugins: update recipe and docs to use
NODE_PATH
(#9997, #10028) - plugins: update example list (#9917)
- scoring: update for v6, defer to web.dev for performance (#10223, #10633, #10676)
- lantern: add deep-dive video (#10546)
- new-audits: emphasize what makes a good audit (#10376)
- hacking-tips: link to gist on using audit results directly (#10480)
- variability: expand on hardware recommendations (#10483)
- throttling: add devtools-throttling deprecation notice (#9933)
- auth: use
--disable-storage-reset
in recipe (#10189) - tweak authenticated-pages and puppeteer docs (#10277)
- add integration-test recipe for using Lighthouse and Jest (#9722)
- add performance-budgets doc (#10542)
- add recipe for using puppeteer in a custom gatherer (#10253, #10447)
- add readme for
build/
directory (#10004) - readme: add variability and throttling to FAQ (#10631)
- readme: add a table of contents (#10283)
- readme: add note about
yarn test-docs
(#10263) - readme: fix typos (#10179, #10694)
- readme: add protobuf install directions (#10250)
- readme: separate free and paid integrations (#10027)
- readme: add new and updated integrations (#9954, #9984, #10018, #9985, #10156, #9836, #10385, #10466, #10475, #10609, #10745)
Tests
- remove protobuf roundtrip check (and local protobuf dev requirement) from
yarn update:sample-json
(#10557, #10661) - run CI tests on new github action (#10418, #10551, #10620, #10622, #10627)
- report to buildtracker on commit via CI github action (#10550, #10718)
- lantern: update golden trace collection script and recollect them (#9662, #10129, #10209, #10279, #10663)
- smokehouse: refactor to be able to integration test all lighthouse clients (#9843, #10158)
- smokehouse: add
bundle.js
runner for driving bundled lighthouse tests (#9943) - bundle smokehouse +
bundle.js
runner + bundled lighthouse for integration testing in a browser (#9873, #10727) - smokehouse: use ranges for some expectations to work in varying environments (#10227, #10473)
- smokehouse: add
static-server
hook to modify response body (#9872) - smokehouse: adjust expectation handling and logging for compatibility (#10361)
- smokehouse: commit copy of
pwa.rocks
for testing (#10648) - add type checking to
driver-test
(#10135, #10123) - add type checking to
gather-runner-test
(#10136, #10215, #10230) - fix
i18n-test.js
bugs in Node 13 (#10595) - i18n: add check of locale files for strings that are probably wrong (#9847)
- use
assert
in strict assertion mode (#10606, #10733) report-ui-features
: add tests and remove interdependencies (#10199, #10201)- update
coveragePathIgnore
jest configuration (#10448) speedline
: remove flaky test (#10181)- remove
global.URL
for jsdom tests (#10186) - viewer-test: don't override
puppeteer
's chromium (#9877) - fix appveyor cache failures (#10281)
- use lighthouse tarball for recipe tests (#10254)
- stage viewer per PR with
yarn now-build
(#10151)
Misc
- update license headers to credit
Lighthouse Authors
(#10469) - add
timings-data/
to.npmignore
(#10584) - update commitlint config to latest, loosen subject-case (#10371)
- tweak
CODEOWNERS
for codereview assignment (#10265, #10274, #10282) - release script push tag (#10193)
- add a
bump-versions.js
release script (#9998) - add comment about minimum chrome version for LCP (#9889)
- update changelog order and add chrome note placeholder (#9859)
- add
.mailmap
file (#10766) - add chrome version field to bug report template (#9866)
- upgrade Lighthouse CI dogfood script (#9879, #9951, #9972, #10482)
- updates and new features for internal
compare-runs
script (#10296, #10519, #10526, #10652) - add
git3po
scripts for managing Github issues and PRs (#10231, #10266, #10255, #10271, #10338, #10256, #10304, #10658, #10257)
Deps
lighthouse-plugin-publisher-ads
: upgrade to 1.1.0-beta.0 (#10544, #10776)chrome-launcher
: upgrade to 0.13.2 (#9904, #10535, #10724)yargs-parser
: upgrade to 18.1.3 (#10723)third-party-web
: upgrade to 0.11.1 (#10711)axe-core
: upgrade to 3.5.3 (#10056, #10344, #10637)typescript
: upgrade to 3.8.3 (#10461)puppeteer
: upgrade to 1.20.0 (#10275)bundlesize
: upgrade to to 0.18.0 (#10272)devtools-protocol
: upgrade to 0.0.729809 (#10207)- check
angular
test fixture into repo (#10086) - remove
mkdirp
andmake-dir
forfs.mkdir
(#9858) - update snyk snapshot (#10771, #10670, #10621, #10559, #10066, #9929, #10531, #10478, #10423, #10163, #9965)