Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Force unwind work loop during selective hydration #25695

Merged
merged 1 commit into from
Nov 17, 2022

Commits on Nov 17, 2022

  1. Force unwind work loop during selective hydration

    When an update flows into a dehydrated boundary, React cannot apply the
    update until the boundary has finished hydrating. The way this currently
    works is by scheduling a slightly higher priority task on the boundary,
    using a special lane that's reserved only for this purpose. Because
    the task is slightly higher priority, on the next turn of the work loop,
    the Scheduler will force the work loop to yield (i.e. shouldYield starts
    returning `true` because there's a higher priority task).
    
    The downside of this approach is that it only works when time slicing
    is enabled. It doesn't work for synchronous updates, because the
    synchronous work loop does not consult the Scheduler on each iteration.
    
    We plan to add support for selective hydration during synchronous
    updates, too, so we need to model this some other way.
    
    I've added a special internal exception that can be thrown to force the
    work loop to interrupt the work-in-progress tree. Because it's thrown
    from a React-only execution stack, throwing isn't strictly necessary —
    we could instead modify some internal work loop state. But using an
    exception means we don't need to check for this case on every iteration
    of the work loop. So doing it this way moves the check out of the
    fast path.
    
    The ideal implementation wouldn't need to unwind the stack at all — we
    should be able to hydrate the subtree and then apply the update all 
    within a single render phase. This is how we intend to implement it in
    the future, but this requires a refactor to how we handle "stack"
    variables, which are currently pushed to a per-render array. We need to
    make this stack resumable, like how context works in Flight and Fizz.
    acdlite committed Nov 17, 2022
    Configuration menu
    Copy the full SHA
    e86bb50 View commit details
    Browse the repository at this point in the history