• 2021-05-08
  • Robin Shen committed 3 years ago
  • 2021-03-11
  • Robin Shen committed 3 years ago
  • Stop tracking roots with pending discrete updates (#20978)
    Now that discrete updates are flushed synchronously in a microtask,
    there's no need to track them in their on queue. They're already in
    the queue we use for all sync work. So we can call that directly.
    Andrew Clark committed with GitHub 3 years ago
  • 2021-03-10
  • Remove Blocking Mode (again) (#20974)
    * Remove Blocking Mode (again)
    
    * Rename batchingmode file and comment
    Ricky committed with GitHub 3 years ago
  • Unify InputDiscreteLane with SyncLane (#20968)
    * Unify sync priority and input discrete
    
    * Fix lint
    
    * Use update lane instead
    
    * Update sync lane labels
    Ricky committed with GitHub 3 years ago
  • Cleanup tests using runWithPriority. (#20958)
    * Remove Scheduler.runWithPriority from some tests
    
    * Mark experimental test experimental
    Ricky committed with GitHub 3 years ago
  • Land enableNativeEventPriorityInference (#20955)
    * Land enableNativeEventPriorityInference
    
    * Move schedulerPriorityToLanePriority
    
    * Remove obsolete comment
    Ricky committed with GitHub 3 years ago
  • 2021-03-09
  • 2021-03-08
  • Rick Hanlon committed 3 years ago
  • chore(build): Ensure experimental builds exists on windows (#20933)
    * chore(build): Throw if `rsync` fails
    
    * did not get cwrsync to work
    Sebastian Silbermann committed with GitHub 3 years ago
  • DevTools flushes updated passive warning/error info after delay (#20931)
    * DevTools flushes updated passive warning/error info after delay
    Previously this information was not flushed until the next commit, but this provides a worse user experience if the next commit is really delayed. Instead, the backend now flushes only the warning/error counts after a delay. As a safety, if there are already any pending operations in the queue, we bail.
    
    Co-authored-by: eps1lon <silbermann.sebastian@gmail.com>
    Brian Vaughn committed with GitHub 3 years ago
  • Improve DevTools Profiler commit-selector UX (#20943)
    * Improve DevTools Profiler commit-selector UX
    
    1. Use natural log of durations (rather than linear) when calculating bar height. This reduces the impact of one (or few) outlier times on more common smaller durations. (Continue to use linear for bar color though.)
    2. Decrease the minimum bar height to make the differences in height more noticeable.
    3. Add a background hover highlight to increase contrast.
    4. Add hover tooltip with commit duration and timestamp.
    Brian Vaughn committed with GitHub 3 years ago
  • 2021-03-07
  • [Bugfix] Reset `subtreeFlags` in `resetWorkInProgress` (#20948)
    * Add failing regression test
    
    Based on #20932
    
    Co-Authored-By: Dan Abramov <dan.abramov@gmail.com>
    
    * Reset `subtreeFlags` in `resetWorkInProgress`
    
    Alternate fix to #20942
    
    There was already a TODO to make this change, but at the time I left it,
    I couldn't think of a way that it would actually cause a bug, and I was
    hesistant to change something without fully understanding the
    ramifications. This was during a time when we were hunting down a
    different bug, so we were especially risk averse.
    
    What I should have done in retrospect is put the change behind a flag
    and tried rolling it out once the other bug had been flushed out.
    
    OTOH, now we have a regression test, which wouldn't have otherwise, and
    the bug it caused rarely fired in production.
    
    Co-authored-by: Dan Abramov <dan.abramov@gmail.com>
    Andrew Clark committed with GitHub 3 years ago
  • [Experiment] Lazily propagate context changes (#20890)
    * Move context comparison to consumer
    
    In the lazy context implementation, not all context changes are
    propagated from the provider, so we can't rely on the propagation alone
    to mark the consumer as dirty. The consumer needs to compare to the
    previous value, like we do for state and context.
    
    I added a `memoizedValue` field to the context dependency type. Then in
    the consumer, we iterate over the current dependencies to see if
    something changed. We only do this iteration after props and state has
    already bailed out, so it's a relatively uncommon path, except at the
    root of a changed subtree. Alternatively, we could move these
    comparisons into `readContext`, but that's a much hotter path, so I
    think this is an appropriate trade off.
    
    * [Experiment] Lazily propagate context changes
    
    When a context provider changes, we scan the tree for matching consumers
    and mark them as dirty so that we know they have pending work. This
    prevents us from bailing out if, say, an intermediate wrapper is
    memoized.
    
    Currently, we propagate these changes eagerly, at the provider.
    
    However, in many cases, we would have ended up visiting the consumer
    nodes anyway, as part of the normal render traversal, because there's no
    memoized node in between that bails out.
    
    We can save CPU cycles by propagating changes only when we hit a
    memoized component — so, instead of propagating eagerly at the provider,
    we propagate lazily if or when something bails out.
    
    Most of our bailout logic is centralized in
    `bailoutOnAlreadyFinishedWork`, so this ended up being not that
    difficult to implement correctly.
    
    There are some exceptions: Suspense and Offscreen. Those are special
    because they sometimes defer the rendering of their children to a
    completely separate render cycle. In those cases, we must take extra
    care to propagate *all* the context changes, not just the first one.
    
    I'm pleasantly surprised at how little I needed to change in this
    initial implementation. I was worried I'd have to use the reconciler
    fork, but I ended up being able to wrap all my changes in a regular
    feature flag. So, we could run an experiment in parallel to our other
    ones.
    
    I do consider this a risky rollout overall because of the potential for
    subtle semantic deviations. However, the model is simple enough that I
    don't expect us to have trouble fixing regressions if or when they arise
    during internal dogfooding.
    
    ---
    
    This is largely based on [RFC#118](https://github.com/reactjs/rfcs/pull/118),
    by @gnoff. I did deviate in some of the implementation details, though.
    
    The main one is how I chose to track context changes. Instead of storing
    a dirty flag on the stack, I added a `memoizedValue` field to the
    context dependency object. Then, to check if something has changed, the
    consumer compares the new context value to the old (memoized) one.
    
    This is necessary because of Suspense and Offscreen — those components
    defer work from one render into a later one. When the subtree continues
    rendering, the stack from the previous render is no longer available.
    But the memoized values on the dependencies list are. This requires a
    bit more work when a consumer bails out, but nothing considerable, and
    there are ways we could optimize it even further. Conceptually, this
    model is really appealing, since it matches how our other features
    "reactively" detect changes — `useMemo`, `useEffect`,
    `getDerivedStateFromProps`, the built-in cache, and so on.
    
    I also intentionally dropped support for
    `unstable_calculateChangedBits`. We're planning to remove this API
    anyway before the next major release, in favor of context selectors.
    It's an unstable feature that we never advertised; I don't think it's
    seen much adoption.
    
    Co-Authored-By: Josh Story <jcs.gnoff@gmail.com>
    
    * Propagate all contexts in single pass
    
    Instead of propagating the tree once per changed context, we can check
    all the contexts in a single propagation. This inverts the two loops so
    that the faster loop (O(numberOfContexts)) is inside the more expensive
    loop (O(numberOfFibers * avgContextDepsPerFiber)).
    
    This adds a bit of overhead to the case where only a single context
    changes because you have to unwrap the context from the array. I'm also
    unsure if this will hurt cache locality.
    
    Co-Authored-By: Josh Story <jcs.gnoff@gmail.com>
    
    * Stop propagating at nearest dependency match
    
    Because we now propagate all context providers in a single traversal, we
    can defer context propagation to a subtree without losing information
    about which context providers we're deferring — it's all of them.
    
    Theoretically, this is a big optimization because it means we'll never
    propagate to any tree that has work scheduled on it, nor will we ever
    propagate the same tree twice.
    
    There's an awkward case related to bailing out of the siblings of a
    context consumer. Because those siblings don't bail out until after
    they've already entered the begin phase, we have to do extra work to
    make sure they don't unecessarily propagate context again. We could
    avoid this by adding an earlier bailout for sibling nodes, something
    we've discussed in the past. We should consider this during the next
    refactor of the fiber tree structure.
    
    Co-Authored-By: Josh Story <jcs.gnoff@gmail.com>
    
    * Mark trees that need propagation in readContext
    
    Instead of storing matched context consumers in a Set, we can mark
    when a consumer receives an update inside `readContext`.
    
    I hesistated to put anything in this function because it's such a hot
    path, but so are bail outs. Fortunately, we only need to set this flag
    once, the first time a context is read. So I think it's a reasonable
    trade off.
    
    In exchange, propagation is faster because we no longer need to
    accumulate a Set of matched consumers, and fiber bailouts are faster
    because we don't need to consult that Set. And the code is simpler.
    
    Co-authored-by: Josh Story <jcs.gnoff@gmail.com>
    Andrew Clark committed with GitHub 3 years ago
  • Move context comparison to consumer
    In the lazy context implementation, not all context changes are
    propagated from the provider, so we can't rely on the propagation alone
    to mark the consumer as dirty. The consumer needs to compare to the
    previous value, like we do for state and context.
    
    I added a `memoizedValue` field to the context dependency type. Then in
    the consumer, we iterate over the current dependencies to see if
    something changed. We only do this iteration after props and state has
    already bailed out, so it's a relatively uncommon path, except at the
    root of a changed subtree. Alternatively, we could move these
    comparisons into `readContext`, but that's a much hotter path, so I
    think this is an appropriate trade off.
    Andrew Clark committed 3 years ago
  • 2021-03-05
  • Split getComponentName into getComponentNameFromFiber and getComponentNameFromType (#20940)
    Split getComponentName into getComponentNameFromFiber and getComponentNameFromType
    Brian Vaughn committed with GitHub 3 years ago
  • 2021-03-02
  • Revert "Remove blocking mode and blocking root (#20888)" (#20916)
    This reverts commit 553440bd1578ef71982c4a10e2cc8c462f33d9be.
    Andrew Clark committed with GitHub 3 years ago
  • Andrew Clark committed with GitHub 3 years ago
  • 2021-03-01
  • 2021-02-28
  • Remove blocking mode and blocking root (#20888)
    * Remove blocking mode and blocking root
    
    * Add back SuspenseList test
    
    * Clean up ReactDOMLegacyRoot
    
    * Remove dupe ConcurrentRoot
    
    * Update comment
    Ricky committed with GitHub 3 years ago
  • 2021-02-26
  • typo fix for the word 'Psuedo' (#20894)
    Co-authored-by: Bowen Li <bowen31337@gmail.com>
    Bowen committed with GitHub 3 years ago
  • 2021-02-25
  • Schedule sync updates in microtask (#20872)
    * Schedule sync updates in microtask
    
    * Updates from review
    
    * Fix comment
    Ricky committed with GitHub 3 years ago
  • Add SuspenseList to react-is (#20874)
    This commit also adds explicit index.stable and index.experimental forks to the react-is package so that we can avoid exporting references to SuspenseList in a stable release.
    Brian Vaughn committed with GitHub 3 years ago
  • 2021-02-24
  • Add StrictMode level prop and createRoot unstable_strictModeLevel option (#20849)
    * The exported '<React.StrictMode>' tag remains the same and opts legacy subtrees into strict mode level one ('mode == StrictModeL1'). This mode enables DEV-only double rendering, double component lifecycles, string ref warnings, legacy context warnings, etc. The primary purpose of this mode is to help detected render phase side effects. No new behavior. Roots created with experimental 'createRoot' and 'createBlockingRoot' APIs will also (for now) continue to default to strict mode level 1.
    
    In a subsequent commit I will add support for a 'level' attribute on the '<React.StrictMode>' tag (as well as a new option supported by ). This will be the way to opt into strict mode level 2 ('mode == StrictModeL2'). This mode will enable DEV-only double invoking of effects on initial mount. This will simulate future Offscreen API semantics for trees being mounted, then hidden, and then shown again. The primary purpose of this mode is to enable applications to prepare for compatibility with the new Offscreen API (more information to follow shortly).
    
    For now, this commit changes no public facing behavior. The only mechanism for opting into strict mode level 2 is the pre-existing 'enableDoubleInvokingEffects' feature flag (only enabled within Facebook for now).
    
    * Renamed strict mode constants
    
    StrictModeL1 -> StrictLegacyMode and StrictModeL2 -> StrictEffectsMode
    
    * Renamed tests
    
    * Split strict effects mode into two flags
    
    One flag ('enableStrictEffects') enables strict mode level 2. It is similar to 'debugRenderPhaseSideEffectsForStrictMode' which enables srtict mode level 1.
    
    The second flag ('createRootStrictEffectsByDefault') controls the default strict mode level for 'createRoot' trees. For now, all 'createRoot' trees remain level 1 by default. We will experiment with level 2 within Facebook.
    
    This is a prerequisite for adding a configurable option to 'createRoot' that enables choosing a different StrictMode level than the default.
    
    * Add StrictMode 'unstable_level' prop and createRoot 'unstable_strictModeLevel' option
    
    New StrictMode 'unstable_level' prop allows specifying which level of strict mode to use. If no level attribute is specified, StrictLegacyMode will be used to maintain backwards compatibility. Otherwise the following is true:
    * Level 0 does nothing
    * Level 1 selects StrictLegacyMode
    * Level 2 selects StrictEffectsMode (which includes StrictLegacyMode)
    
    Levels can be increased with nesting (0 -> 1 -> 2) but not decreased.
    
    This commit also adds a new 'unstable_strictModeLevel' option to the createRoot and createBatchedRoot APIs. This option can be used to override default behavior to increase or decrease the StrictMode level of the root.
    
    A subsequent commit will add additional DEV warnings:
    * If a nested StrictMode tag attempts to explicitly decrease the level
    * If a level attribute changes in an update
    Brian Vaughn committed with GitHub 3 years ago
  • 2021-02-23
  • Update scheduling profiler Webpack config (#20867)
    Use the pre-built scheduler (which includes a check for 'window' being defined in order to load the right scheduler implementation) rather than just directly importing a version of the scheduler that relies on window. Since the scheduling profiler's code runs partially in a web worker, it can't rely on window.
    Brian Vaughn committed with GitHub 3 years ago
  • Add Lane labels to scheduling profiler marks (#20808)
    This commit changes scheduling profiler marks from a format like '--schedule-render-1' to '--schedule-render-1-Sync' (where 1 is the numeric value of the Sync lane). This will enable the profiler itself to show more meaningful labels for updates and render work.
    
    The commit also refactors and adds additional tests for the scheduling profiler package.
    
    It also updates the preprocessor to 'support' instant events. These are no-ops for us, but adding recognition of the event type will prevent profiles imported from e.g. Chrome Canary from throwing with an 'unrecognized event' error. (This will resolve issue #20767.)
    Brian Vaughn committed with GitHub 3 years ago
  • Add additional messaging for RulesOfHooks lint error (#20692)
    * Add additional messaging for RulesOfHooks lint error
    
    * Fix tests and spacing issue
    
    * Prettify ESLintRulesOfHooks-test
    Anthony Garritano committed with GitHub 3 years ago
  • 2021-02-22
  • Fabric-compatible implementation of `JSReponder` feature (#20768)
    With this change, if a node is a Fabric node, we route the setJSResponder call to FabricUIManager. Native counterpart is already landed. Tested internally as D26241364.
    Valentin Shergin committed with GitHub 3 years ago
  • DevTools: Restore inspect-element bridge optimizations (#20789)
    * Restore inspect-element bridge optimizations
    
    When the new Suspense cache was integrated (so that startTransition could be used) I removed a couple of optimizations between the backend and frontend that reduced bridge traffic when e.g. dehydrated paths were inspected for elements that had not rendered since previously inspected. This commit re-adds those optimizations as well as an additional test with a bug fix that I noticed while reading the backend code.
    
    There are two remaining TODO items as of this commit:
    - Make inspected element edits and deletes also use transition API
    - Don't over-eagerly refresh the cache in our ping-for-updates handler
    
    I will addres both in subsequent commits.
    
    * Poll for update only refreshes cache when there's an update
    
    * Added inline comment
    Brian Vaughn committed with GitHub 3 years ago
  • 2021-02-18
  • Remove scheduler sampling profiler shared array buffer (#20840)
    No one has been using this data so there's no reason to collect it. Event log has been maintained and tests have been updated.
    Brian Vaughn committed with GitHub 3 years ago
  • Disable (unstable) scheduler sampling profiler for OSS builds (#20832)
    * Disabled Scheduler sampling profiler for OSS builds
    * Added missing conditional feature flag around profiling calls
    Brian Vaughn committed with GitHub 3 years ago
  • 2021-02-17
  • fix: use SharedArrayBuffer only when cross-origin isolation is enabled (#20831)
    * fix: check cross-origin isolation for SharedArrayBuffer
    
    * chore: remove unused a $FlowFixMe comment
    
    * prettier
    Toru Kobayashi committed with GitHub 3 years ago
  • Use setImmediate when available over MessageChannel (#20834)
    * Move direct port access into a function
    
    * Fork based on presence of setImmediate
    
    * Copy SchedulerDOM-test into another file
    
    * Change the new test to use shimmed setImmediate
    
    * Clarify comment
    
    * Fix test to work with existing feature detection
    
    * Add flags
    
    * Disable OSS flag and skip tests
    
    * Use VARIANT to reenable tests
    
    * lol
    Dan Abramov committed with GitHub 3 years ago
  • 2021-02-16
  • Bailout in sync task if work is not sync (#20813)
    Because we don't cancel synchronous tasks, sometimes more than one
    synchronous task ends up being scheduled. This is an artifact of the
    fact that we have two different lanes that schedule sync tasks: discrete
    and sync. So what can happen is that a discrete update gets scheduled,
    then a sync update right after that. Because sync is encoded as higher
    priority than discrete, we schedule a second sync task. And since we
    don't cancel the first one, there are now two separate sync tasks.
    
    As a next step, what we should do is merge InputDiscreteLane with
    SyncLane, then (I believe) this extra bailout wouldn't be necessary,
    because there's nothing higher priority than sync that would cause us to
    cancel it. Though we may want to add logging to be sure.
    Andrew Clark committed with GitHub 3 years ago
  • [CI] Use constant commit sha (#20828)
    When running the publish workflow, either via the command line or
    via the daily cron job, we should use a constant SHA instead of
    whatever happens to be at the head of the main branch at the time the
    workflow is run.
    
    The difference is subtle: currently, the SHA is read at runtime,
    each time the workflow is run. With this change, the SHA is read right
    before the workflow is created and passed in as a constant parameter.
    
    In practical terms, this means if a workflow is re-run via the CircleCI
    web UI, it will always re-run using the same commit SHA as the original
    workflow, instead of fetching the latest SHA from GitHub, which may
    have changed.
    
    Also avoids a race condition where the head SHA changes in between the
    Next publish job and the Experimental publish job.
    Andrew Clark committed with GitHub 3 years ago
  • [CI] Publish to release channels sequentially (#20827)
    npm will sometimes fail if you try to concurrently publish two different
    versions of the same package, even if they use different dist tags.
    
    So instead of publishing to the Next and Experimental channels
    simultaneously, we'll do them one after the other.
    
    If we did want to speed up these publish workflows, we could paralellize
    by package instead of by release channel.
    Andrew Clark committed with GitHub 3 years ago
  • 2021-02-12
  • Add `supportsMicrotasks` to the host config (#20809)
    * Add `supportsMicrotasks` to the host config
    
    Only certain renderers support scheduling a microtask, so we need a
    renderer specific flag that we can toggle. That way it's off for some
    renderers and on for others.
    
    I copied the approach we use for the other optional parts of the host
    config, like persistent mode and test selectors.
    
    Why isn't the feature flag sufficient?
    
    The feature flag modules, confusingly, are not renderer-specific, at
    least when running the our tests against the source files. They are
    meant to correspond to a release channel, not a renderer, but we got
    confused at some point and haven't cleaned it up.
    
    For example, when we run `yarn test`, Jest loads the flags from the
    default `ReactFeatureFlags.js` module, even when we import the React
    Native renderer — but in the actual builds, we load a different feature
    flag module, `ReactFeatureFlags.native-oss.js.` There's no way in our
    current Jest load a different host config for each renderer, because
    they all just import the same module. We should solve this by creating
    separate Jest project for each renderer, so that the flags loaded when
    running against source are the same ones that we use in the
    compiled bundles.
    
    The feature flag (`enableDiscreteMicrotasks`) still exists — it's used
    to set the React DOM host config's `supportsMicrotasks` flag to `true`.
    (Same for React Noop) The important part is that turning on the feature
    flag does *not* affect the other renderers, like React Native.
    
    The host config will likely outlive the feature flag, too, since the
    feature flag only exists so we can gradually roll it out and measure the
    impact in production; once we do, we'll remove it. Whereas the host
    config flag may continue to be used to disable the discrete microtask
    behavior for RN, because RN will likely use a native (non-JavaScript)
    API to schedule its tasks.
    
    * Add `supportsMicrotask` to react-reconciler README
    Andrew Clark committed with GitHub 3 years ago
  • 2021-02-11
  • Warn if static flag is accidentally cleared (#20807)
    * Warn if static flag is accidentally cleared
    
    "Static" fiber flags are flags that are meant to exist for the lifetime
    of a component. It's really important not to accidentally reset these,
    because we use them to decide whether or not to perform some operation
    on a tree (which we can do because they get bubbled via `subtreeFlags)`.
    
    We've had several bugs that were caused by this mistake, so we actually
    don't rely on static flags anywhere, yet. But we'd like to.
    
    So let's roll out this warning and see if it fires anywhere. Once we
    can confirm that there are no warnings, we can assume that it's safe
    to start using static flags.
    
    I did not wrap it behind a feature flag, because it's dev-only, and we
    can use our internal warning filter to hide this from the console.
    
    * Intentionally clear static flag to test warning
    
    * ...and fix it again
    Andrew Clark committed with GitHub 3 years ago
Please wait...
Page is in error, reload to recover