diff --git a/scripts/fiber/tests-passing.txt b/scripts/fiber/tests-passing.txt
index f599832df086c..13b506ef68c02 100644
--- a/scripts/fiber/tests-passing.txt
+++ b/scripts/fiber/tests-passing.txt
@@ -674,9 +674,9 @@ src/renderers/dom/fiber/__tests__/ReactDOMFiber-test.js
src/renderers/dom/fiber/__tests__/ReactDOMFiberAsync-test.js
* renders synchronously by default
* renders synchronously when feature flag is disabled
-* unstable_asyncUpdates at the root makes the entire tree async
+* AsyncComponent at the root makes the entire tree async
* updates inside an async tree are async by default
-* unstable_asyncUpdates creates an async subtree
+* AsyncComponent creates an async subtree
* updates inside an async subtree are async by default
src/renderers/dom/shared/__tests__/CSSProperty-test.js
diff --git a/src/isomorphic/ReactEntry.js b/src/isomorphic/ReactEntry.js
index 2a89505003f37..e6ecd54048e03 100644
--- a/src/isomorphic/ReactEntry.js
+++ b/src/isomorphic/ReactEntry.js
@@ -40,6 +40,7 @@ var React = {
Component: ReactBaseClasses.Component,
PureComponent: ReactBaseClasses.PureComponent,
+ unstable_AsyncComponent: ReactBaseClasses.AsyncComponent,
createElement: createElement,
cloneElement: cloneElement,
diff --git a/src/isomorphic/modern/class/ReactBaseClasses.js b/src/isomorphic/modern/class/ReactBaseClasses.js
index a514b74de1d59..f2b3a6c6d6a6a 100644
--- a/src/isomorphic/modern/class/ReactBaseClasses.js
+++ b/src/isomorphic/modern/class/ReactBaseClasses.js
@@ -138,13 +138,33 @@ function ReactPureComponent(props, context, updater) {
function ComponentDummy() {}
ComponentDummy.prototype = ReactComponent.prototype;
-ReactPureComponent.prototype = new ComponentDummy();
-ReactPureComponent.prototype.constructor = ReactPureComponent;
+var pureComponentPrototype = (ReactPureComponent.prototype = new ComponentDummy());
+pureComponentPrototype.constructor = ReactPureComponent;
// Avoid an extra prototype jump for these methods.
-Object.assign(ReactPureComponent.prototype, ReactComponent.prototype);
-ReactPureComponent.prototype.isPureReactComponent = true;
+Object.assign(pureComponentPrototype, ReactComponent.prototype);
+pureComponentPrototype.isPureReactComponent = true;
+
+function ReactAsyncComponent(props, context, updater) {
+ // Duplicated from ReactComponent.
+ this.props = props;
+ this.context = context;
+ this.refs = emptyObject;
+ // We initialize the default updater but the real one gets injected by the
+ // renderer.
+ this.updater = updater || ReactNoopUpdateQueue;
+}
+
+var asyncComponentPrototype = (ReactAsyncComponent.prototype = new ComponentDummy());
+asyncComponentPrototype.constructor = ReactAsyncComponent;
+// Avoid an extra prototype jump for these methods.
+Object.assign(asyncComponentPrototype, ReactComponent.prototype);
+asyncComponentPrototype.unstable_isAsyncReactComponent = true;
+asyncComponentPrototype.render = function() {
+ return this.props.children;
+};
module.exports = {
Component: ReactComponent,
PureComponent: ReactPureComponent,
+ AsyncComponent: ReactAsyncComponent,
};
diff --git a/src/renderers/dom/fiber/__tests__/ReactDOMFiberAsync-test.js b/src/renderers/dom/fiber/__tests__/ReactDOMFiberAsync-test.js
index a667aea7f2257..b81789caaadce 100644
--- a/src/renderers/dom/fiber/__tests__/ReactDOMFiberAsync-test.js
+++ b/src/renderers/dom/fiber/__tests__/ReactDOMFiberAsync-test.js
@@ -4,6 +4,8 @@ var ReactFeatureFlags = require('ReactFeatureFlags');
var ReactDOM;
+var AsyncComponent = React.unstable_AsyncComponent;
+
describe('ReactDOMFiberAsync', () => {
var container;
@@ -25,16 +27,16 @@ describe('ReactDOMFiberAsync', () => {
if (ReactDOMFeatureFlags.useFiber) {
it('renders synchronously when feature flag is disabled', () => {
- class Async extends React.Component {
- static unstable_asyncUpdates = true;
- render() {
- return this.props.children;
- }
- }
- ReactDOM.render(