Giter Club home page Giter Club logo

Comments (6)

philwolstenholme avatar philwolstenholme commented on August 11, 2024

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:

A screenshot showing the test-prerender-only.html HTML file from this repo running in a browser. A speculation rule set has only been created for one of the multiple links on the page

from quicklink.

tunetheweb avatar tunetheweb commented on August 11, 2024

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.

from quicklink.

philwolstenholme avatar philwolstenholme commented on August 11, 2024

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 prerenderLimit const definition
  • Remove if (toPrerender.size < prerenderLimit) { check
  • Add toPrerender.clear(); to the 'reset' function returned from listen() (toPrefetch.clear(); is there already)
  • Call toPrerender.clear(); after adding the Speculation Rules script elements 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 a script element 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:

    quicklink/src/index.mjs

    Lines 239 to 258 in e6565ed

    // prerendering preconditions:
    // 1) whether UA supports spec rules.. If not, fallback to prefetch
    if (!hasSpecRulesSupport()) {
    prefetch (urls);
    return Promise.reject(new Error('This browser does not support the speculation rules API. Falling back to prefetch.'));
    }
    // 2) whether spec rules is already defined (and with this we also covered when we have created spec rules before)
    if (isSpecRulesExists()) {
    return Promise.reject(new Error('Speculation Rules is already defined and cannot be altered.'));
    }
    // 3) whether it's a same origin url,
    for (const url of [].concat(urls)) {
    if (!isSameOrigin(url)) {
    return Promise.reject(new Error('Only same origin URLs are allowed: ' + url));
    }
    toPrerender.add(url);
    }

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>

from quicklink.

philwolstenholme avatar philwolstenholme commented on August 11, 2024

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.

from quicklink.

tunetheweb avatar tunetheweb commented on August 11, 2024

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.

from quicklink.

JiangWeixian avatar JiangWeixian commented on August 11, 2024

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. 🤔

from quicklink.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.