blob: 4adbe7b38c9a3b6c4521e869cef1d7f98b682e30 [file] [log] [blame] [view]
# 103 Early Hints
Contact: early-hints-experiment@chromium.org
As of version 94, Chrome experimentally supports
[Early Hints](https://datatracker.ietf.org/doc/html/rfc8297).
Early Hints enable browsers to start preloading before the main response is
served. In addition, this can be used with other
[Resource Hints](https://w3c.github.io/resource-hints/) APIs like preconnect.
Currently Chrome is running A/B testing in the field to evaluate the performance
impact of Early Hints. Chrome also provides some ways to opt-in Early Hints for
web developers who want to try the feature. This document describes the status
of the current implementation and how to enable Early Hints support.
## What’s supported
Chrome supports [preloading](https://web.dev/preload-critical-assets/) in
Early Hints for top-level frame navigation. See the
[explainer](https://github.com/bashi/early-hints-explainer/blob/main/explainer.md)
how it works.
## What’s not supported
To reduce security and privacy implications, Chrome ignores Early hints sent in
the following situations.
* Early Hints sent on subresource requests
* Early Hints sent on iframe navigation
* Early Hints sent on HTTP/1.1 or earlier
Chrome doesnt handle resource hints other than preloading in Early Hints yet.
For example, [preconnect](https://web.dev/preconnect-and-dns-prefetch/) and
[prefetch](https://web.dev/link-prefetch/) don’t work with Early Hints. We
consider supporting them in the future.
## Activation
Early Hints preloading can be enabled by a command line flag, or via
[Origin Trial](https://developer.chrome.com/blog/origin-trials/).
### Using command line flag
Passing the `--enable-features=EarlyHintsPreloadForNavigation` command line flag
to Chrome enables Early Hints preloading support.
### Using Origin Trial
You can opt any page on your origin into Early Hints preloading by
[requesting a token for your origin](https://developer.chrome.com/origintrials/#/view_trial/2856408063659737089).
Include the token in both Early Hints and the final response so that Chrome can
recognize your pages opted in Early Hints preloading.
```
HTTP/1.1 103 Early Hints
Origin-Trial: **your token**
Link: </style.css>; rel="preload"; as="style"
HTTP/1.1 200 OK
Origin-Trial: **your token**
Link: </style.css>; rel="preload"; as="style"
Content-Type: text/html; charset=utf-8
<!DOCTYPE html>
...
```
`<meta http-equiv=”origin-trial” content=”**your token**”>` also works for the
final response but doesnt work for Early Hints since Early Hints cannot convey
a response body.
### Checking Early Hints preloading is working
If a resource is preloaded by Early Hints, the corresponding
[PerformanceResourceTiming](https://w3c.github.io/resource-timing/#sec-performanceresourcetiming)
object reports `initiatorType` is "early-hints".
```
performance.getEntriesByName('https://a.test/style.css”)[0].initiatorType
// => 'early-hints'
```
## Resources
* [Fastly's test page](https://early-hints.fastlylabs.com/)