Commit Graph

13677 Commits

Author SHA1 Message Date
Sebastian Markbåge e855f91e85 [Flight] Expand the fixture to use require.extensions (#20209)
* Expand fixture

Use .server convention. /server/index.js should really change too so it can be compiled but for now we treat it as bootstrapping code outside the compiled code.

Move App.server. It's part of the application code rather than the infra.

Add hybrid component used in both server/client and an extra component shared by multiple entry points.

* Use require.extensions to replace .client imports

The simplest server doesn't need AOT compilation. Instead we can just
configure require.extensions. This is probably not the best idea to use
in prod but is enough to show the set up.
2020-11-10 12:48:51 -08:00
Andrew Clark c896cf9617 Set return pointer when reusing current tree (#20212)
* Do not fix return pointers during commit phase

In the commit phase, we should be able to assume that the `return`
pointers in the just-completed tree are consistent. The render phase
should be responsible for ensuring these are always correct.

I've removed the `return` pointer assignments from the render phase
traversal logic. This isn't all of them, only the ones added recently
during the effects refactor. The other ones have been around longer so
I'll leave those for a later clean up.

This breaks a few SuspenseList tests; I'll fix in the next commit.

* Set return pointer when reusing current tree

We always set the return pointer on freshly cloned, work-in-progress
fibers. However, we were neglecting to set them on trees that are reused
from current.

I fixed this in the same path of the complete phase where we reset the
fiber flags.

This is a code smell because it assumes the commit phase is never
concurrent with the render phase. Our eventual goal is to make fibers a
lock free data structure.

Will address further during refactor to alternate model.
2020-11-10 11:20:04 -08:00
Ricky 0898660154 Add version of scheduler that only swaps MessageChannel for postTask (#20206)
* Fork SchedulerDOM to SchedulerPostTaskOnly

* Swap in postTask for MessageChannel

* Add SchedulerPostTaskOnly-test.js

* Update getCurrentTime

* Gate tests to source

* Prettier
2020-11-10 12:11:46 -05:00
Brian Vaughn 393c452e39 Add "nested-update" phase to Profiler API (#20163)
Background:
State updates that are scheduled in a layout effect (useLayoutEffect or componentDidMount / componentDidUpdate) get processed synchronously by React before it yields to the browser to paint. This is done so that components can adjust their layout (e.g. position and size a tooltip) without any visible shifting being seen by users. This type of update is often called a "nested update" or a "cascading update".

Because they delay paint, nested updates are considered expensive and should be avoided when possible. For example, effects that do not impact layout (e.g. adding event handlers, logging impressions) can be safely deferred to the passive effect phase by using useEffect instead.

This PR updates the Profiler API to explicitly flag nested updates so they can be monitored for and avoided when possible.

Implementation:
I considered a few approaches for this.

Add a new callback (e.g. onNestedUpdateScheduled) to the Profiler that gets called when a nested updates gets scheduled.
Add an additional boolean parameter to the end of existing callbacks (e.g. wasNestedUpdate).
Update the phase param to add an additional variant: "mount", "update", or "nested-update" (new).
I think the third option makes for the best API so that's what I've implemented in this PR.

Because the Profiler API is stable, this change will need to remain behind a feature flag until v18. I've turned the feature flag on for Facebook builds though after confirming that Web Speed does not currently make use of the phase parameter.

Quirks:
One quirk about the implementation I've chosen is that errors thrown during the layout phase are also reported as nested updates. I believe this is appropriate since these errors get processed synchronously and block paint. Errors thrown during render or from within passive effects are not affected by this change.
2020-11-10 09:40:30 -05:00
Sean Keenan 93c3dc54b6 react-devtools-inline: Remove css-sourcemap's when bundling for dist (#20170) 2020-11-10 08:47:39 -05:00
Ricky 13a62feab8 Fix path for SchedulerFeatureFlags (#20200) 2020-11-09 11:22:59 -05:00
Brian Vaughn 7a73d6a0f9 (Temporarily) revert unmounting error boundaries changes (#20147)
This reverts commits bcca5a6ca7 and ffb749c95e, although neither revert cleanly since methods have been moved between the work-loop and commit-work files. This commit is a mostly manual effort of undoing the changes.
2020-11-09 10:14:24 -05:00
inokawa fc06cf8d35 Fix typo (#20188) 2020-11-09 09:17:40 -05:00
Jack Works c29710a570 fix: useImperativeMethods to useImperativeHandle (#20194) 2020-11-08 19:59:53 +00:00
Ricky 6b28eb6175 Add workspaces hash to yarn cache key (#20154)
* Add branch to yarn cache key

* Add checksum check for workspace info

* Fix yaml

* Try moving the command

* How about here

* Just inline it

* i hate it here

* try reverting back

* Add run

* idk

* try inlining the command everywhere

* Create workspace_info.txt when we create the cache

* Delete the timestamp
2020-11-03 15:02:06 -05:00
Deniz Susman 31d096605c typo fix in comment (#20153) 2020-11-03 09:57:56 -05:00
Dan Abramov 2af07d3f4d [Flight Fixture] Server + Client Components (#20150) 2020-11-03 03:00:23 +00:00
Sebastian Markbåge c3e20f18fe Add Relay specific React Native build of Flight (#20149)
This adds a new dimension similar to dom-relay. It's different from
"native" which would be Flight for RN without Relay.

This has some copy-pasta that's the same between the two Relay builds but
the key difference will be Metro and we're not quite sure what other
differences there will be yet.
2020-11-02 18:49:48 -08:00
Ricky 454c2211c0 Refactor SchedulerHostConfigs (#20025)
* Remove SchedulerHostConfigs

* Fix builds

* Fix forks

* Move SchedulerNoDom check to npm/index.js

* Fix tests

* Add @gate source

* Gate build-only test to build test runs
2020-11-02 12:46:58 -05:00
Sebastian Markbåge 56e9feead0 Remove Blocks (#20138)
* Remove Blocks

* Remove Flight Server Runtime

There's no need for this now that the JSResource is part of the bundler
protocol. Might need something for Webpack plugin specifically later.

* Devtools
2020-10-30 23:03:45 -07:00
Sebastian Markbåge 3fbd47b862 Serialize pending server components by reference (lazy component) (#20137)
This now means that if a server component suspends, its value becomes a
React.lazy object. I.e. the element that rendered the server component
gets replaced with a lazy node.

As of #19033 lazy objects can be rendered in the node position. This allows
us to suspend at the location of the server component while we're waiting
on its content.

Now server components has the same capabilities as Blocks to progressively
reveal its content.
2020-10-30 17:19:46 -07:00
Sebastian Markbåge 930ce7c15a Allow values to be encoded by "reference" to a value rather than the value itself (#20136)
These references are currently transformed into React.lazy values. We can use these in
React positions like element type or node position.

This could be expanded to a more general concept like Suspensey Promises, asset references or JSResourceReferences.

For now it's only used in React Element type position.

The purpose of these is to let you suspend deeper in the tree.
2020-10-30 13:02:03 -07:00
Sebastian Markbåge 39eb6d1765 Rename (#20134) 2020-10-29 18:58:32 -07:00
Sebastian Markbåge ffd8423356 [Flight] Add support for Module References in transport protocol (#20121)
* Refactor Flight to require a module reference to be brand checked

This exposes a host environment (bundler) specific hook to check if an
object is a module reference. This will be used so that they can be passed
directly into Flight without needing additional wrapper objects.

* Emit module references as a special type of value

We already have JSON and errors as special types of "rows". This encodes
module references as a special type of row value. This was always the
intention because it allows those values to be emitted first in the stream
so that as a large models stream down, we can start preloading as early
as possible.

We preload the module when they resolve but we lazily require them as they
are referenced.

* Emit module references where ever they occur

This emits module references where ever they occur. In blocks or even
directly in elements.

* Don't special case the root row

I originally did this so that a simple stream is also just plain JSON.

However, since we might want to emit things like modules before the root
module in the stream, this gets unnecessarily complicated. We could add
this back as a special case if it's the first byte written but meh.

* Update the protocol

* Add test for using a module reference as a client component

* Relax element type check

Since Flight now accepts a module reference as returned by any bundler
system, depending on the renderer running. We need to drastically relax
the check to include all of them. We can add more as we discover them.

* Move flow annotation

Seems like our compiler is not happy with stripping this.

* Some bookkeeping bug

* Can't use the private field to check
2020-10-29 17:57:31 -07:00
Brian Vaughn 343d7a4a7e Fast Refresh: Don't block DevTools commit hook (#20129)
In some scenarios (either timing dependent, or pre-FR compatible React versions) FR blocked calling the React DevTools commit hook. This PR adds a test and a fix for that.
2020-10-29 13:23:57 -04:00
Brian Vaughn b6a750be3c Make DevTools Websocket retry delay configurable (#20107) 2020-10-28 22:08:47 -04:00
Andrew Clark 779a472b09 Prevent inlining into recursive commit functions (#20105)
Adds a bunch of no-inline directives to commit phase functions to
prevent them from being inlined into one of our recursive algorithms.

The motivation is to minimize the number of variables in the recursive
functions, since each one contributes to the size of the stack frame.

Theoretically, this could help the performance of both the recursive
and non-recursive (iterative) implementations of the commit phase,
since even the iterative implementation sometimes uses the JS stack.
2020-10-27 12:51:34 -07:00
Andrew Clark 25b18d31c8 Traverse commit phase effects iteratively (#20094)
* Move traversal logic to ReactFiberCommitWork

The current traversal logic is spread between ReactFiberWorkLoop and
ReactFiberCommitWork, and it's a bit awkward, especially when
refactoring. Idk the ideal module structure, so for now I'd rather keep
it all in one file.

* Traverse commit phase effects iteratively

We suspect that using the JS stack to traverse through the tree in the
commit phase is slower than traversing iteratively.

I've kept the recursive implementation behind a flag, both so we have
the option to run an experiment comparing the two, and so we can revert
it easily later if needed.
2020-10-27 12:02:19 -07:00
Justus Hämäläinen 06a4615be2 Allow Node 15.x (#20108)
Co-authored-by: Justus Hämäläinen <me@justushamalainen.fi>
2020-10-27 15:16:16 +00:00
Sy Tran Dung 4e5d7faf54 Fix error loading source maps for devtools extension (#20079) 2020-10-22 11:26:24 -04:00
Abhyuday Bharat 3314115cb4 Overly eager update-notifier usage in react-devtools (#20078)
Co-authored-by: abhyuday <abhyuday@miqdigital.com>
2020-10-22 08:52:14 -04:00
Dan Abramov eaaf4cbce7 17.0.1 2020-10-22 13:24:46 +01:00
Minh Nguyen 928a819a28 Use react-shallow-renderer@16.14.1 in yarn.lock (#20072)
This ensures that tests are run against the latest published version. This
merely updates the version in `yarn.lock` and not in `react-test-renderer`'s
`package.json` to avoid having to cut another release of `react-test-renderer`.
2020-10-21 13:37:34 +01:00
Dan Abramov 6f62abb58a Remove usage of Array#fill (#20071) 2020-10-21 13:17:44 +01:00
Dan Abramov 40cfe1f486 Update CHANGELOG.md 2020-10-21 01:15:28 +01:00
Dan Abramov a50f638b06 Link to the blog post 2020-10-20 21:51:41 +01:00
Dan Abramov f021a983aa Bump versions for 17 (#20062) 2020-10-20 21:41:18 +01:00
Dan Abramov 46ed268471 Add React 17 changelog 2020-10-20 21:22:00 +01:00
Brian Vaughn d1bb4d851f Profiler: Include ref callbacks in onCommit duration (#20060) 2020-10-20 14:35:57 -04:00
Brian Vaughn c59c3dfe55 useRef: Warn about reading or writing mutable values during render (#18545)
Reading or writing a ref value during render is only safe if you are implementing the lazy initialization pattern.

Other types of reading are unsafe as the ref is a mutable source.

Other types of writing are unsafe as they are effectively side effects.

This change also refactors useTransition to no longer use a ref hook, but instead manage its own (stable) hook state.
2020-10-19 16:05:00 -04:00
Brian Vaughn 75726fadfd DevTools fix props editing for host components (#20055) 2020-10-19 15:21:41 -04:00
Brian Vaughn 51a3aa6afb DevTools 4.8.2 -> 4.9.0 bump 2020-10-19 11:20:54 -04:00
Brian Vaughn 7b6cac9522 Improved Profiler commit hooks test (#20053)
Previously the tests didn't ensure that time spent during cascading render was not included in duration reported by commit hooks.
2020-10-19 09:36:00 -04:00
Kai Riemann dfb6a40335 [Fast Refresh] Fix crashes caused by rogue Proxies (#20030) (#20039) 2020-10-17 17:47:52 +01:00
Andrew Clark 37cb732c59 Use bitwise OR to define flag masks (#20044)
Easier to read, harder to mess up. These expressions get simplified by
Closure, so there's no runtime impact.
2020-10-16 13:30:35 -07:00
Andrew Clark eb3181e772 Add Visibility flag for hiding/unhiding trees (#20043)
* Add Visibility flag for hiding/unhiding trees

There's `beforeblur` logic in the snapshot phase that needs to visit
every Suspense boundary whose visibility is toggled. Right now it does
that by visiting Placement and Deletion effects. That includes many
unrelated nodes.

By adding a new flag specifically for toggling Visibility, we will only
visit the relevant Suspense (and Offscreen) boundaries, instead of all
nodes that have a Placement.

Potential follow-ups (not urgent):

- The `beforeblur` logic also has a check to see whether the visibility
was toggled on or off. It only cares about things being hidden. As a
follow up, I can split the Visibility flag into separate Hide/Show
flags, and only visit Hide.
- Now that this is separate from Update, we can move the rest of the
Suspense's layout effects (like attaching retry listeners) to the
passive phase.

* Gate behind createEventHandle feature flag

Only need to visit deleted and hidden trees during the snapshot phase
if the experimental `createEventHandle` flag is enabled. Currently,
it's only used internally at Facebook, not open source.
2020-10-16 09:49:07 -07:00
Andrew Clark 0dd809bdfa Remove last schedulePassiveEffectCallback call (#20042)
Now there's only a single place where the passive effect callback
is scheduled.
2020-10-16 09:06:55 -07:00
Dan Abramov e9f5ad2584 Remove Set bookkeeping for root events (#19990)
* Remove dead code branch

This function is only called when initializing roots/containers (where we skip non-delegated events) and in the createEventHandle path for non-DOM nodes (where we never hit this path because targetElement is null).

* Move related functions close to each other

* Fork listenToNativeEvent for createEventHandle

It doesn't need all of the logic that's needed for normal event path.

And the normal codepath doesn't use the last two arguments.

* Expand test coverage for non-delegated events

This changes a test to fail if we removed the event handler Sets. Previously, we didn't cover that.

* Add DEV-level check that top-level events and non-delegated events do not overlap

This makes us confident that they're mutually exclusive and there is no duplication between them.

* Add a test verifying selectionchange deduplication

This is why we still need the Set bookkeeping. Adding a test for it.

* Remove Set bookkeeping for root events

Root events don't intersect with non-delegated bubbled events (so no need to deduplicate there). They also don't intersect with createEventHandle non-managed events (because those don't go on the DOM elements). So we can remove the bookeeping because we already have code ensuring the eager subscriptions only run once per element.

I've moved the selectionchange special case outside, and added document-level deduplication for it alone.

Technically this might change the behavior of createEventHandle with selectionchange on the document, but we're not using that, and I'm not sure that behavior makes sense anyway.

* Flow
2020-10-16 16:49:41 +01:00
Sebastian Silbermann b093528650 test: Add regression test for hooks after error boundaries (#20002)
* test: Add regression test for hooks after error boundaries

* fix lint
2020-10-16 16:07:27 +01:00
oltrep f668b6c351 Bump to latest eslint-config-fbjs (#20029)
* bump package to latest

* update files to respect lint

* disable object-type-delimiter rule to work with prettier

* disable rule to let flow check pass
2020-10-16 16:06:08 +01:00
Andrew Clark 8df7b7911a Remove Passive flag from "before mutation" phase (#20038)
We don't need to visit passive effect nodes during before mutation.

The only reason we were previously was to schedule the root-level
passive effect callback as early as possible, but now that
`subtreeFlags` exists, we can check that instead.

This should reduce the amount of traversal during the commit phase,
particularly when mounting or updating large trees that contain many
passive effects.
2020-10-16 08:21:58 -05:00
IDrissAitHafid 2eb3181eb4 fixed unfound node error when Suspense is filtered (#20019)
* fixed unfound node error when Suspense is filtered

* added a test for filtered Suspense node
2020-10-15 14:45:23 -04:00
adasq c57fe4a2c1 ReactIs.isValidElementType Unit Test extended with PureComponent case (#20033)
Co-authored-by: Adam Plocieniak <adam.plocieniak@allegro.pl>
2020-10-15 08:48:28 -04:00
Brian Vaughn 02da938fd5 Don't double-invoke effects in legacy roots (#20028)
Large legacy applications are likely to be difficult to update to handle this feature, and it wouldn't add any value– since newer APIs that require this resilience are not legacy compatible.
2020-10-15 08:40:12 -04:00
Dominic Gannaway d95c4938df [EventSystem] Revise onBeforeBlur propagation mechanics (#20020) 2020-10-14 23:38:57 +01:00