close
The Wayback Machine - https://web.archive.org/web/20210921000105/https://github.com/facebook/react/commits/main
Skip to content
Permalink
main

Commits on Sep 20, 2021

  1. Fix typo in types.js (react-devtools-shared) (#22299)

    Fix typo:
    
    becuase -> because
    KonstHardy committed Sep 20, 2021
  2. Implement getServerSnapshot in userspace shim (#22359)

    * Convert useSES shim tests to use React DOM
    
    Idea is that eventually we'll run these tests against an actual build of
    React DOM 17 to test backwards compatibility.
    
    * Implement getServerSnapshot in userspace shim
    
    If the DOM is not present, we assume that we are running in a server
    environment and return the result of `getServerSnapshot`.
    
    This heuristic doesn't work in React Native, so we'll need to provide
    a separate native build (using the `.native` extension). I've left this
    for a follow-up.
    
    We can't call `getServerSnapshot` on the client, because in versions of
    React before 18, there's no built-in mechanism to detect whether we're
    hydrating. To avoid a server mismatch warning, users must account for
    this themselves and return the correct value inside `getSnapshot`.
    
    Note that none of this is relevant to the built-in API that is being
    added in 18. This only affects the userspace shim that is provided
    for backwards compatibility with versions 16 and 17.
    acdlite committed Sep 20, 2021
  3. Implement useSyncExternalStore on server (#22347)

    Adds a third argument called `getServerSnapshot`.
    
    On the server, React calls this one instead of the normal `getSnapshot`.
    We also call it during hydration.
    
    So it represents the snapshot that is used to generate the initial,
    server-rendered HTML. The purpose is to avoid server-client mismatches.
    What we render during hydration needs to match up exactly with what we
    render on the server.
    
    The pattern is for the server to send down a serialized copy of the
    store that was used to generate the initial HTML. On the client, React
    will call either `getSnapshot` or `getServerSnapshot` on the client as
    appropriate, depending on whether it's currently hydrating.
    
    The argument is optional for fully client rendered use cases. If the
    user does attempt to omit `getServerSnapshot`, and the hook is called
    on the server, React will abort that subtree on the server and
    revert to client rendering, up to the nearest Suspense boundary.
    
    For the userspace shim, we will need to use a heuristic (canUseDOM)
    to determine whether we are in a server environment. I'll do that in
    a follow up.
    acdlite committed Sep 20, 2021
  4. replace-fork should not clear uncommitted changes (#22348)

    The replace-fork script depends on ESLint to fix the reconciler imports
    — `.old` -> `.new` or vice versa. If ESLint crashes, it can leave the
    imports in an incorrect state.
    
    As a convenience, @bvaughn updated the script to automatically run
    `git checkout -- .` if the ESLint command fails. An unintended
    consequence of the strategy is that if the working directory is not
    clean, then any uncommitted changes will be lost.
    
    We need a better strategy for this that prevents the accidental loss of
    work. One option is to exit early if the working directory is not clean
    before you run the script, though that affects the usability of
    the script.
    
    An ideal solution would reset the working directory back to whatever
    state it was in before the script ran, perhaps by stashing all the
    changes and restoring them if the script aborts.
    
    Until we think of something better, I've commmented out the branch.
    acdlite committed Sep 20, 2021
  5. Delete useMutableSource implementation (#22292)

    This API was replaced by useSyncExternalStore
    acdlite committed Sep 20, 2021

Commits on Sep 15, 2021

  1. Fixed broken build script --unsafe-partial flag (#22324)

    This flag was broken due to a buggy race case in the ncp() command. The fix is amittedly a hack but improves on the existing behavior (of leaving the workspace in a broken state).
    bvaughn committed Sep 15, 2021

Commits on Sep 14, 2021

  1. [useSES shim] Import prefixed native API (#22310)

    Until useSyncExternalStore is finalized, the shim should import the
    prefixed version (unstable_useSyncExternalStore), which is available
    in the experimental builds. That way our early testers can start
    using it.
    acdlite committed Sep 14, 2021

Commits on Sep 13, 2021

  1. [useSES/extra] Reuse old selection if possible (#22307)

    When you pass an unmemoized selector to useSyncExternalStoreExtra, we
    have to reevaluate it on every render because we don't know whether
    it depends on new props.
    
    However, after reevalutating it, we should still compare the result
    to the previous selection with `isEqual` and reuse the old one if it
    hasn't changed.
    
    Originally I did not implement this, because if the selector changes due
    to new props or state, the component is going to have to re-render
    anyway. However, it's still useful to return a memoized selection
    when possible, because it may be the input to a downstream memoization.
    
    In the test I wrote, the example I chose is selecting a list of
    items from the store, and passing the list as a prop to a memoized
    component. If the list prop is memoized, we can bail out.
    acdlite committed Sep 13, 2021
  2. Check for store mutations before commit (#22290)

    * [useSyncExternalStore] Remove extra hook object
    
    Because we already track `getSnapshot` and `value` on the store
    instance, we don't need to also track them as effect dependencies. And
    because the effect doesn't require any clean-up, we don't need to track
    a `destroy` function.
    
    So, we don't need to store any additional state for this effect. We can
    call `pushEffect` directly, and only during renders where something
    has changed.
    
    This saves some memory, but my main motivation is because I plan to use
    this same logic to schedule a pre-commit consistency check. (See the
    inline comments for more details.)
    
    * Split shouldTimeSlice into two separate functions
    
    Lanes that are blocking (SyncLane, and DefaultLane inside a blocking-
    by-default root) are always blocking for a given root. Whereas expired
    lanes can expire while the render phase is already in progress.
    
    I want to check if a lane is blocking without checking whether it
    expired, so I split `shouldTimeSlice` into two separate functions.
    
    I'll use this in the next step.
    
    * Check for store mutations before commit
    
    When a store is read for the first time, or when `subscribe` or
    `getSnapshot` changes, during a concurrent render, we have to check
    at the end of the render phase whether the store was mutated by
    an concurrent event.
    
    In the userspace shim, we perform this check in a layout effect, and
    patch up any inconsistencies by scheduling another render + commit.
    However, even though we patch them up in the next render, the parent
    layout effects that fire in the original render will still observe an
    inconsistent tree.
    
    In the native implementation, we can instead check for inconsistencies
    right after the root is completed, before entering the commit phase. If
    we do detect a mutaiton, we can discard the tree and re-render before
    firing any effects. The re-render is synchronous to block further
    concurrent mutations (which is also what we do to recover from tearing
    bugs that result in an error). After the synchronous re-render, we can
    assume the tree the tree is consistent and continue with the normal
    algorithm for finishing a completed root (i.e. either suspend
    or commit).
    
    The result is that layout effects will always observe a consistent tree.
    acdlite committed Sep 13, 2021

Commits on Sep 12, 2021

  1. Fix link (#22296)

    Fix link (branch master was renamed to main): 
    
    master -> main
    KonstHardy committed Sep 12, 2021

Commits on Sep 11, 2021

Commits on Sep 10, 2021

  1. Replaced network.onRequestFinished() caching with network.getHAR() (#…

    …22285)
    
    Replaced network.onRequestFinished() caching with network.getHAR() so that we can avoid redundantly (pre) caching JavaScript content. In the event that the HAR log doesn't contain a match, we'll fall back to fetching from the Network (and hoping for a cache hit from that layer).
    
    I've tested both internally (internal Facebook DEV server) and externally (Code Sandbox) and it seems like this approach results in cache hits, so long as DevTools is opened when the page loads. (Otherwise it falls back to fetch().)
    bvaughn committed Sep 10, 2021
  2. update error message to include useLayoutEffect or useEffect on bad e… (

    #22279)
    
    * update error message to include useLayoutEffect or useEffect on bad effect return
    
    * Update packages/react-reconciler/src/ReactFiberCommitWork.new.js
    
    Co-authored-by: Ricky <rickhanlonii@gmail.com>
    
    * use existing import
    
    Co-authored-by: Ricky <rickhanlonii@gmail.com>
    salazarm and rickhanlonii committed Sep 10, 2021

Commits on Sep 9, 2021

  1. [DevTools] Fix react-devtools-extension build error and `react-devt…

    …ools-inline`'s `package.json` (#22281)
    lunaruan committed Sep 9, 2021
  2. Revert Suspense cache Thenable.catch() change (#22280)

    Reverts part of #22275 (adding .catch() to Thenables in Suspense caches) in response to #22275 (comment).
    
    After taking another look with fresh eyes, I think I see the "uncaught error" issue I initially noticed was in checkForUpdate() (which did not pass an error handler to .then)
    bvaughn committed Sep 9, 2021
Older