Commit Graph

7068 Commits

Author SHA1 Message Date
Paul O’Shannessy
944be18357 Upgrade to fbjs v0.8.4 (#7532) 2016-08-19 10:40:03 -07:00
Alex Zherdev
11c0adcc95 Fix header link generation for non-English docs (#7497) 2016-08-18 14:55:50 -07:00
Alexandre Kirszenberg
9f5b009f05 Fix ReactTestInstance::toJSON() with empty top-level components (#7523) 2016-08-18 13:02:09 -07:00
龙海燕
db6f36bdce Update 09.2-package-management.md (#7520) 2016-08-18 08:52:07 -06:00
ventuno
a9e681a828 Warn if using React.unmountComponentAtNode on a different React instance's tree. (#7456)
* Warn when using React.unmountComponentAtNode on a different React instance's tree

https://github.com/facebook/react/issues/3787

* Adding tests.

* Implementing recommended changes.

https://github.com/facebook/react/issues/3787
2016-08-17 17:20:36 -07:00
Ben Alpert
921d8c151b Update onlyChild invariant message (#7514) 2016-08-17 13:03:31 -07:00
Dan Abramov
680685bec4 Fix slow performance of PropTypes.oneOfType() on misses (#7510)
It used to be slow whenever a type miss occurred because expensive `Error` objects were being created. For example, with `oneOfType([number, data])`, passing a date would create an `Error` object in `number` typechecker for every item.

The savings depend on how much commonly you used `oneOfType()`, and how often it had “misses”. If you used it heavily, you might see 1.5x to 2x performance improvements in `__DEV__` after this fix.
2016-08-17 10:04:56 +01:00
Jess Telford
aa48c82b0d React.Children.toArray() changes keys (#7495)
As noted by @spicyj in #5541
2016-08-15 23:43:33 -07:00
Troy DeMonbreun
3013afe2d5 Fix for #7170 (#7486)
* Write failing test

* Ensure .min and .max are set before .value

* Adjusting test for false negative

* Revert test adjustment (apparently it was only failing locally)
2016-08-15 13:38:53 -05:00
Christopher Chedeau
9a48b5ca7b Fix flow (#7499)
ReactElement requires a generic argument now and the return function of render is a ReactTestInstance and not a ReactElement.
2016-08-15 18:04:22 +01:00
Dan Abramov
48475787b4 Avoid indexOf() during unmounting a root in the hook (#7496)
* Avoid indexOf() during unmounting a root in the hook

* Check for (Map|Set).prototype.keys
2016-08-15 15:47:54 +01:00
Tanase Hagi
09f0a06b8a Add propsTypes and defaultProps example for stateless functions (#7458)
* Add propsTypes and defaultProps example for stateless functions

* Update 05-reusable-components.md

* Update 05-reusable-components.md
2016-08-14 12:04:47 -05:00
Andres Suarez
8d1e416d9a Remove last use of mapObject (#7494) 2016-08-13 20:13:56 -07:00
Andres Suarez
e5f9ae2705 Avoid object iteration when creating DOM factories (#7493) 2016-08-13 19:30:06 -07:00
Dan Abramov
db452bd20b Use ES6 Map in ReactComponentTreeHook if available (#7491)
* Use ES6 Map in ReactComponentTreeHook if available

* Make getRootIDs fast again

* Only use native Map
2016-08-13 21:43:18 +01:00
jaaberg
fdc91e016f Fix typo in changelog (#7468) 2016-08-13 13:45:04 -05:00
Dan Abramov
a56e105081 Don't define key or ref dummy props if none were provided (#7488)
* Don't define key or ref dummy props if none were provided

This fixes a performance regression.

* Style nit
2016-08-13 19:36:57 +01:00
Dan Abramov
a73886456e Fix ReactComponentTreeHook.getRegisteredIDs() to work with inlined content (#7490)
I broke this in #7463: parseInt() cuts off #text at the end.
Changing to just use negative numbers instead.
2016-08-13 19:36:21 +01:00
Dan Abramov
cba2b19b84 Remove ReactDOMInstrumentation (#7481)
Its events are not being used anywhere.
2016-08-12 20:09:27 +01:00
Dan Abramov
4b734f7a02 Improve DEV performance in Chrome (#7483)
* Ensure this._domID is always a number

* Ensure this._rootNodeID is always a number
2016-08-12 18:34:46 +01:00
Sebastian Markbåge
c8f7215b20 Use aliasify everywhere instead of browserify-global-shim (#7476)
I already had to aliasify to have better control over the requires
so we might as well do it everywhere for consistency.

This probably makes it easier to rebase the rollup work too
because aliases seems to be how you solve this in that world.
2016-08-11 20:17:37 -07:00
Sebastian Markbåge
1c5a639c37 Require the isomorphic React instead of internals from renderers (#7473)
This is needed for flat builds. It also lets us get rid of a bunch
of special cases in the build scripts.

It also allow us to just copy the source files into React Native
instead of having to build first to resolve the special cases.
2016-08-11 18:56:55 -07:00
Dan Abramov
0e976e136c Consolidate hook events (#7472)
* Remove onBeforeMountComponent hook event

It is unnecessary.
We now pass the element as part of onInstantiateComponent, and it can't change before mounting.

* Remove onComponentHasMounted hook event

It is unused after #7410.

* Replace on(Begin|End)ReconcilerTimer hook events

We already have onBeforeUpdateComponent.
Let's just have on(Before?)(Mount|Update|Unmount)Component and stick with them.

This removes double event dispatches in some hot spots.

* Remove onComponentHasUpdated hook

The tests still pass so presumably it was not necessary.

* Add missing __DEV__ to TestUtils code

* Replace on(InstantiateComponent|SetParent) with onBeforeMountComponent

This lets us further consolidate hooks.
The parent ID is now passed as an argument to onBeforeMountComponent() with the element.

* Remove onMountRootComponent hook event

It is unnecessary now that we pass the parent ID to onBeforeMountComponent.

* Use parentDebugID = 0 both for roots and production

This removes some awkward branching.
2016-08-11 19:35:50 +01:00
Sebastian Markbåge
f7e0db9a18 Build React DOM Fiber package (#7173)
This builds a `react-dom-fiber.js` bundle which exposes ReactDOMFiber.
This allows early experiments with the new Fiber reconciler.

I also expose it in the npm package through `react-dom/fiber`.
2016-08-10 18:45:14 -07:00
Sebastian Markbåge
0f004efce2 Build renderers into their individual npm packages (#7168)
This copies modules into three separate packages instead of
putting it all in React.

The overlap in shared and between renderers gets duplicated.

This allows the isomorphic package to stay minimal. It can also
be used as a direct dependency without much risk.

This also allow us to ship versions to each renderer independently
and we can ship renderers without updating the main react package
dependency.
2016-08-10 18:17:49 -07:00
Sebastian Markbåge
c06a68a10b Mock ReactDOM for Fiber Tests (#7206)
We currently write all our tests against the DOM implementation.
I need a way to run the Fiber tests against it. But I don't want
to take on any package dependencies on Fiber modules yet.

There's a problem with jest right now where you can't globally
mock modules that already exist. So I have to add a global call
to jest.mock.

Luckily we already have a way to test the useCreateElement paths
using a feature flag. I won't activate this flag in travis until
it passes, but the idea is to run all three variants in travis.

I'm not sure that invoking rAF and rIC synchronously is the best
way to test this since it doesn't capture the backwards
compatibility aspect. I.e. the fact that people might be relying
on the synchronous nature in real apps too. It's a start.

Ideally, jest would have these built-in.
2016-08-10 17:44:36 -07:00
Dan Abramov
1f31357a2e Remove unnecessary indirection and events from the hooks (#7464)
* Remove unnecessary indirection from the tree hook

* Replace onSetDisplayName, onSetOwner, onSetText with one event

Less events is better.
onSetDisplayName, onSetOwner, and onSetText only existed because we didn't initially track elements.

* Remove unused variables
2016-08-11 00:19:09 +01:00
Dan Abramov
afa27bc4d5 Fix unmounting performance regression in __DEV__ (#7463)
* Comment previous occurrences of this issue

* Fix DEV performance regression in V8

* Extract try/catch into a separate function when calling hooks
2016-08-10 20:14:59 +01:00
Dan Abramov
178cb7d339 Prevent performance regression in DEV due to warning arguments (#7461)
* Prevent internal performance regression

This only affects Facebook website, not open source version of React.

On the Facebook website, we don't have a transform for warnings and invariants.
Therefore, expensive arguments will be calculated even if the warning doesn't fire.
This fixes a few cases where that calculation might be more expensive than usually.

In my testing, this brings down average row click time in Power Editor from ~300ms to ~220ms in __DEV__ (vs ~40ms in prod).

* Put warning() that shows up in profile behind condition
2016-08-10 19:52:46 +01:00
Keyan Zhang
5514ea369d Fix memory leak in ReactChildrenMutationWarningHook for SSR (#7410)
* corrected ReactChildrenMutationWarningHook's name

* changed `onComponentHasMounted` to `onMountComponent`

and get element from `ReactComponentTreeHook` instead of keeping an internal store
2016-08-10 19:50:18 +01:00
Paul O’Shannessy
c848b65378 Remove unused createHierarchyRenderer (#7454) 2016-08-09 16:03:24 -07:00
Sebastian Markbåge
ca9167c202 Include React itself in the list of shims (#7453)
Without this we end up bundling all of the isomorphic React into
the DOM bundle. This was fixed in #7168 too but I'll just do an
early fix to ensure that #7168 is purely an npm change.
2016-08-09 15:33:34 -07:00
Sebastian Markbåge
34c4474472 Fix trailing build issues (#7450)
Use relative path for addons UMD shim module

Use explicit top level wrapper marker for top level elements
2016-08-09 12:52:15 -07:00
Sebastian Markbåge
8ef00dbb7d Bundle DOM renderers into their individual UMD bundles (#7164)
* Cut out isomorphic dependencies from the renderers

These files reaches into isomorphic files.

The ReactElement functions are exposed on the React object anyway
so I can just use those instead.

I also found some files that are not shared that should be in
renderers shared.

* Found a few more shared dependencies

renderSubtreeIntoContainer is only used by the DOM renderer.
It's not an addon.

ReactClass isn't needed as a dependency since injection doesn't
happen anymore.

* Use a shim file to load addons' dependencies on DOM

By replacing this intermediate file we can do the lazy loading
without needing any lazy requires. This set up works with ES
modules.

We could also replace the globalShim thing with aliased files
instead for consistency.

* Bundle DOM renderers into their individual UMD bundles

Instead of exposing the entire DOM renderer on the react.js
package, I only expose CurrentOwner and ComponentTreeDevtool which
are currently the only two modules that share __state__ with the
renderers.

Then I package each renderer in its own package. That could allow
us to drop more server dependencies from the client package. It
will also allow us to ship fiber as a separate renderer.

Unminified DEV            after     before
react.js                  123kb     696kb
react-with-addons.js      227kb     774kb
react-dom.js              668kb     1kb
react-dom-server.js       638kb     1kb

Minified PROD             after     before
react.min.js               24kb     154kb
react-with-addons.min.js   37kb     166kb
react-dom.min.js          149kb     1kb
react-dom-server.min.js   144kb     1kb

The total size for react.min.js + react-dom.min.js is +19kb larger
because of the overlap between them right now. I'd like to see
what an optimizing compiler can do to this. Some of that is fbjs
stuff. There shouldn't need to be that much overlap so that's
something we can hunt. We should keep isomorphic absolutely
minimal so there's no reason for other React clones not to use it.
There will be less overlap with Fiber.

However, another strategy that we could do is package the
isomorphic package into each renderer bundle and conditionally
initialize it if it hasn't already been initialized. That way
you only pay an overlap tax when there are two renderers on the
page but not without it. It's also easier to just pull in one
package. The downside is the versioning stuff that the separate
npm package would solve. That applies to CDNs as well.

ReactWithAddons is a bit weird because it is packaged into the
isomorphic package but has a bunch of DOM dependencies. So we have
to load them lazily since the DOM package gets initialized after.
2016-08-09 12:39:03 -07:00
B.Orlov
7d57c1f0c1 Fix batchedUpdates return value (#7444) 2016-08-09 10:26:29 -07:00
Robert Martin
43674d989d Capitalize AJAX (#7435) 2016-08-08 16:24:30 -07:00
Robert Chang
0833d89783 change a word in performance docs (#7442) 2016-08-08 16:10:28 -07:00
Joseph Savona
ba2230df29 Fix link formatting on Relay blog post (#7434) 2016-08-05 14:54:34 -07:00
Sebastian Markbåge
a8c8191264 Merge pull request #7248 from sebmarkbage/fibercleanup
[Fiber] Various minor tweaks and a few big ones
2016-08-05 14:40:27 -07:00
Sebastian Markbage
af7dd8e0a1 Move wip fibers to childInProgress
This took a while to figure out, but we need to be able to store
children that are currently being worked on separately from the
current children. We always need a canonical "current" children
so that we can update them. However, we also need a different set
that we're currently working on so that we have a way to get to
already progressed work.

This solve the starvation problem in the first render because now
we can reach children that were never rendered and have a place
to store their progressed work on. The unit test changes tests
this.

This lets us get rid of the hasWorkInProgress flag.

When we reconcile new children we need to reconcile them against
progressed work so that we can reuse it. The progressed work is
"work in progress" nodes. So in that case we need to mutate
instead of clone, to preserve the invariant that only two versions
exist at any given point. This effectively forks the
ReactChildFiber implementation.
2016-08-05 14:33:48 -07:00
Sebastian Markbage
94ed00740b Introduce shouldComponentUpdate in Fiber
It is important to be able to use this since it avoids starvation
problems if you can reuse partially completed work.
2016-08-05 14:31:47 -07:00
Sebastian Markbage
de6069e550 Reuse the correct child and side-effects when reusing partial work
We need to use the *other* child because we reset it to the
current one on the way up.

We also need to reset the first/last side-effects to that of the
children so that we're committing the right thing.
2016-08-05 14:31:46 -07:00
Sebastian Markbage
9fca812139 Fix NoWork bug
Thanks @acdlite. Add comment about future unit test coverage.

This was actually hiding the fact that we are only able to reuse
existing work if it was marked as completely finished which it
won't be if we reuse its pending priority.

However, we should be able to bail out even if there is work
remaining in a subtree.
2016-08-05 14:31:46 -07:00
Sebastian Markbage
48b7b2c67c Add note about potential future bugs 2016-08-05 14:31:46 -07:00
Sebastian Markbage
5ac87e0d0f When a reconciliation gets down prioritized, reuse children
When we downprioritize children we need to remember to reuse the
old children in the update side-effect.

This whole set up is very unfortunate since we can have children
in our active tree that never actually finished rendering. This
strategy might be fundamentally flawed, not sure.
2016-08-05 14:31:46 -07:00
Sebastian Markbage
d0838797a3 Set pendingProps in cloneFiber for symmetry
This might become confusing later but is unreachable today. That's
because existing pendingProps only matter when a clone is updated,
but this path can only matter when it is created.
2016-08-05 14:31:46 -07:00
Sebastian Markbage
5c094fb5d1 Don't reset next work pointer for lower priority work
If the current work is higher priority than the new work, then
don't bother resetting the unit of work pointer since it won't
affect the execution order.
2016-08-05 14:31:46 -07:00
Sebastian Markbage
7e9b958662 Reuse old props for the update if there are no new props 2016-08-05 14:31:46 -07:00
Sebastian Markbage
de4a7b972b Move all imports to closures in Fiber
I'm paranoid about inline-ability so I use this pattern of adding
a constant to the closure everywhere.

ES6 modules help avoid that but we can't use that consistently
because of the dependency injection so instead I opt for making
this explicit everywhere.

Grep: \b[a-zA-Z_$\d]+\.[a-zA-Z_$\d]+\(
2016-08-05 14:31:46 -07:00
Sebastian Markbage
e0e4954061 Remove console.logs from Fiber
The code is sufficiently complex now that this is more noise than
helpful. Will just temporary explicit logs in the future.
2016-08-05 14:31:46 -07:00