Skip to content

Commit 65d22db

Browse files
committed
Initial commit
This is the first step - pulling the ReactDOMFrameScheduling module out into a separate package.
1 parent 5dfbfe9 commit 65d22db

File tree

9 files changed

+126
-7
lines changed

9 files changed

+126
-7
lines changed

packages/react-art/src/ReactART.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import React from 'react';
99
import ReactFiberReconciler from 'react-reconciler';
10-
import * as ReactDOMFrameScheduling from 'shared/ReactDOMFrameScheduling';
10+
import * as ReactScheduler from 'react-scheduler';
1111
import Mode from 'art/modes/current';
1212
import FastNoSideEffects from 'art/modes/fast-noSideEffects';
1313
import Transform from 'art/core/transform';
@@ -468,15 +468,15 @@ const ARTRenderer = ReactFiberReconciler({
468468
return emptyObject;
469469
},
470470

471-
scheduleDeferredCallback: ReactDOMFrameScheduling.rIC,
471+
scheduleDeferredCallback: ReactScheduler.rIC,
472472

473473
shouldSetTextContent(type, props) {
474474
return (
475475
typeof props.children === 'string' || typeof props.children === 'number'
476476
);
477477
},
478478

479-
now: ReactDOMFrameScheduling.now,
479+
now: ReactScheduler.now,
480480

481481
mutation: {
482482
appendChild(parentInstance, child) {

packages/react-dom/src/client/ReactDOM.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import * as EventPluginRegistry from 'events/EventPluginRegistry';
2929
import * as EventPropagators from 'events/EventPropagators';
3030
import * as ReactInstanceMap from 'shared/ReactInstanceMap';
3131
import ReactVersion from 'shared/ReactVersion';
32-
import * as ReactDOMFrameScheduling from 'shared/ReactDOMFrameScheduling';
32+
import * as ReactScheduler from 'react-scheduler';
3333
import {ReactCurrentOwner} from 'shared/ReactGlobalSharedState';
3434
import getComponentName from 'shared/getComponentName';
3535
import invariant from 'fbjs/lib/invariant';
@@ -688,7 +688,7 @@ const DOMRenderer = ReactFiberReconciler({
688688
return textNode;
689689
},
690690

691-
now: ReactDOMFrameScheduling.now,
691+
now: ReactScheduler.now,
692692

693693
mutation: {
694694
commitMount(
@@ -984,8 +984,8 @@ const DOMRenderer = ReactFiberReconciler({
984984
},
985985
},
986986

987-
scheduleDeferredCallback: ReactDOMFrameScheduling.rIC,
988-
cancelDeferredCallback: ReactDOMFrameScheduling.cIC,
987+
scheduleDeferredCallback: ReactScheduler.rIC,
988+
cancelDeferredCallback: ReactScheduler.cIC,
989989
});
990990

991991
ReactGenericBatching.injection.injectRenderer(DOMRenderer);

packages/react-scheduler/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# React Scheduler
2+
3+
This is a work in progress - we are building a utility to better coordinate
4+
React and other JavaScript work.

packages/react-scheduler/index.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* Copyright (c) 2013-present, Facebook, Inc.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
'use strict';
11+
12+
export * from './src/ReactScheduler';

packages/react-scheduler/npm/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
if (process.env.NODE_ENV === 'production') {
4+
module.exports = require('./cjs/react-scheduler.production.min.js');
5+
} else {
6+
module.exports = require('./cjs/react-scheduler.development.js');
7+
}

packages/react-scheduler/package.json

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"name": "react-scheduler",
3+
"version": "0.1.0-alpha-1",
4+
"private": true,
5+
"description": "unstable scheduling helper for coordinating React and other JS libraries",
6+
"main": "index.js",
7+
"repository": "facebook/react",
8+
"license": "MIT",
9+
"keywords": [
10+
"react"
11+
],
12+
"bugs": {
13+
"url": "https://github.com/facebook/react/issues"
14+
},
15+
"homepage": "https://reactjs.org/",
16+
"files": [
17+
"LICENSE",
18+
"README.md",
19+
"index.js",
20+
"cjs/",
21+
"umd/"
22+
]
23+
}

packages/shared/ReactDOMFrameScheduling.js renamed to packages/react-scheduler/src/ReactScheduler.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,21 @@
77
* @flow
88
*/
99

10+
'use strict';
11+
12+
/**
13+
* A scheduling library to allow scheduling work with more granular priority and
14+
* control than requestAnimationFrame and requestIdleCallback.
15+
* Current TODO items:
16+
* X- Pull out the rIC polyfill built into React
17+
* - Initial test coverage
18+
* - Support for multiple callbacks
19+
* - Support for two priorities; serial and deferred
20+
* - Better test coverage
21+
* - Better docblock
22+
* - Polish documentation, API
23+
*/
24+
1025
// This is a built-in polyfill for requestIdleCallback. It works by scheduling
1126
// a requestAnimationFrame, storing the time for the start of the frame, then
1227
// scheduling a postMessage which gets scheduled after paint. Within the
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* Copyright (c) 2013-present, Facebook, Inc.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @emails react-core
8+
*/
9+
10+
'use strict';
11+
12+
// TODO: delete or change this test.
13+
describe('ReactDOMFrameScheduling', () => {
14+
it('warns when requestAnimationFrame is not polyfilled in the browser', () => {
15+
const previousRAF = global.requestAnimationFrame;
16+
try {
17+
global.requestAnimationFrame = undefined;
18+
jest.resetModules();
19+
expect(() => require('react-dom')).toWarnDev(
20+
'React depends on requestAnimationFrame.',
21+
);
22+
} finally {
23+
global.requestAnimationFrame = previousRAF;
24+
}
25+
});
26+
27+
// We're just testing importing, not using it.
28+
// It is important because even isomorphic components may import it.
29+
it('can import findDOMNode in Node environment', () => {
30+
const previousRAF = global.requestAnimationFrame;
31+
const previousRIC = global.requestIdleCallback;
32+
const prevWindow = global.window;
33+
try {
34+
global.requestAnimationFrame = undefined;
35+
global.requestIdleCallback = undefined;
36+
// Simulate the Node environment:
37+
delete global.window;
38+
jest.resetModules();
39+
expect(() => {
40+
require('react-dom');
41+
}).not.toThrow();
42+
} finally {
43+
global.requestAnimationFrame = previousRAF;
44+
global.requestIdleCallback = previousRIC;
45+
global.window = prevWindow;
46+
}
47+
});
48+
});

scripts/rollup/bundles.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,16 @@ const bundles = [
264264
global: 'createSubscription',
265265
externals: ['react'],
266266
},
267+
268+
/******* React Scheduler (experimental) *******/
269+
{
270+
label: 'react-scheduler',
271+
bundleTypes: [NODE_DEV, NODE_PROD, UMD_DEV, UMD_PROD],
272+
moduleType: ISOMORPHIC,
273+
entry: 'react-scheduler',
274+
global: 'ReactScheduler',
275+
externals: [],
276+
},
267277
];
268278

269279
// Based on deep-freeze by substack (public domain)

0 commit comments

Comments
 (0)