quicklink
quicklink copied to clipboard
Allow multiple Speculation Rules
Is your feature request related to a problem? Please describe.
According to https://developer.chrome.com/blog/prerender-pages/#multiple-speculation-rules the Speculation API allows multiple Speculation Rules. Right now prerender: true can only prerender a single URL in viewport.
Describe the solution you'd like Remove https://github.com/GoogleChromeLabs/quicklink/blob/e6565ed12b4872b67a862b9fe2198fe0d73cb485/src/index.mjs#L247
Additional context Would be happy to open a PR for this.
Have a nice weekend midzer
I noticed this today too, did earlier versions of the API only support one script element, perhaps?
test/test-prerender-only.html can be used to reproduce the issue. Note how in the screenshot below, only 1.html will be prerendered:

did earlier versions of the API only support one script element, perhaps?
Yes that's correct. It's a relatively recent change (Chrome 107 I think) that allowed multiple prerenders.
I've had a look around the repo and made a few changes locally. I think there are a few things we will need to do:
- Remove
isSpecRulesExists()function definition and usage - Remove
prerenderLimitconst definition - Remove
if (toPrerender.size < prerenderLimit) {check - Add
toPrerender.clear();to the 'reset' function returned fromlisten()(toPrefetch.clear();is there already) - Call
toPrerender.clear();after adding the Speculation Rulesscriptelements to prevent a build up of the same URLs being included as new links are found on scroll (see example below), maybe add a mechanism to avoid adding a URL twice if ascriptelement is created for it once, then again when the user scrolls back to that part of the page? - Remove or update comments prerendering conditions comments now that '2)' has been removed: https://github.com/GoogleChromeLabs/quicklink/blob/e6565ed12b4872b67a862b9fe2198fe0d73cb485/src/index.mjs#L239-L258
Example of not clearing out the toPrerender set:
<script type="speculationrules">
{ "prerender": [{ "source": "list", "urls": ["http://localhost:8080/work"] }] }
</script>
<script type="speculationrules">
{ "prerender": [{ "source": "list", "urls": ["http://localhost:8080/work", "http://localhost:8080/contact"] }] }
</script>
<script type="speculationrules">
{ "prerender": [{ "source": "list", "urls": ["http://localhost:8080/work", "http://localhost:8080/contact", "http://localhost:8080/github-stars"] }] }
</script>
<script type="speculationrules">
{ "prerender": [{ "source": "list", "urls": ["http://localhost:8080/work", "http://localhost:8080/contact", "http://localhost:8080/github-stars", "http://localhost:8080/github-stars?no-js"] }] }
</script>
All that said, I did quite quickly start seeing Max number of prerendering exceeded/MaxNumOfRunningPrerendersExceeded messages in the experimental Prerender2 dev tools panel, so I'm thinking that Quicklink's approach of prerendering anything in the viewport might be a bit too resource intensive compared to only prerendering links that are being hovered over or touchstart'ed on.
Yeah there's current a limit of 10 prerenders. IMHO that is more than enough, and prerendering even that many (which I could easily see happening if prerendering all in-viewport links) seems like a lot to me.
quicklink export prerender API, currently, if call prerender multiple times, still throw this error. If user use prerender API manual, I think we should not limit prerender urls size.
Maybe should mv isSpecRulesExists check function into listen. 🤔