Downgrade deprecation warnings from errors to warnings (#9650)

* Initial regeneration of results.json

**what is the change?:**
We ran `yarn build` and updated the perf. stats record.

**why make this change?:**
Some commits have landed without updating this. By getting an initial update, I can run the build script again after my changes and see any size regressions.

* Downgrade deprecation warnings from errors to warnings

**what is the change?:**
Swapping out `warning` module for a fork that uses `console.warn`.
It looks like we were using the `warning` module for deprecation notices, *but* there is also a 'deprecated' module designed specifically for deprecation notices.

However, we could not find any place that it was currently used.

Since React's build process is not 100% clear to me, I assume it could still be used somewhere by something and just updated it along with other deprecation notices.

We might consider a follow-up diff that does some clean up here;
 - remove 'deprecated' module if it's unused, OR
 - use 'deprecated' module for all our current deprecation warnings

**why make this change?:**
- We have had complaints about noisy warnings, in particular after introducing new deprecations
- They potentially cause CI failures
- Deprecations are not really time-sensitive, can ship without breaking your app, etc.

For more context - https://github.com/facebook/react/issues/9395

**test plan:**
`npm run test`
and unit tests for the new modules
and manual testing (WIP)

**issue:**
https://github.com/facebook/react/issues/9395

* Add 'lowPriorityWarning' to ReactExternals

**what is the change?:**
We won't bundle 'lowPriorityWarning' with the rest of React when building for Facebook.
NOTE: A parallel commit will introduce an internal implementation of 'lowPriorityWarning' in Facebook's codebase, to compensate. Will post a comment with the diff number once that is up.

**why make this change?:**
So that the sync between github and Facebook can go more smoothly!

**test plan:**
We will see when I run the sync! But this is a reasonable first step imo.

**issue:**
https://github.com/facebook/react/issues/9398

* Make state mutations an error, not low-pri warning

**what is the change?:**
Even though this is a "deprecation" warning, we still want to use 'console.error' for it.

**why make this change?:**
- It's not likely to come up now, hopefully, because this warning has been present for some time
- This will cause real issues in production if ignored

**test plan:**
`yarn test` - we did fix one test which failed bc of this change

**issue:**
https://github.com/facebook/react/issues/9398

* Fix test of assigning to this.state that was only passing in fiber

**what is the change?:**
updated a unit test for assigning directly to state; it once again raises an error and not a warning.

**why make this change?:**
So that tests pass

**test plan:**
 REACT_DOM_JEST_USE_FIBER=1 yarn run test

**issue:**

* Update results.json
This commit is contained in:
Flarnie Marchan
2017-05-23 09:35:42 -07:00
committed by GitHub
parent 1f80931d32
commit 964c263d8f
15 changed files with 161 additions and 108 deletions

View File

@@ -162,6 +162,7 @@ function getExternalModules(externals, bundleType, isRenderer) {
case FB_PROD:
fbjsModules.forEach(module => externalModules.push(module));
externalModules.push('ReactCurrentOwner');
externalModules.push('lowPriorityWarning');
if (isRenderer) {
externalModules.push('React');
if (externalModules.indexOf('react-dom') > -1) {

View File

@@ -1,92 +1,92 @@
{
"bundleSizes": {
"react.development.js (UMD_DEV)": {
"size": 123496,
"gzip": 31034
"size": 125119,
"gzip": 31339
},
"react.production.min.js (UMD_PROD)": {
"size": 15753,
"gzip": 5824
},
"react-dom.development.js (UMD_DEV)": {
"size": 592317,
"gzip": 136560
"size": 593408,
"gzip": 136701
},
"react-dom.production.min.js (UMD_PROD)": {
"size": 121979,
"gzip": 38564
"size": 122214,
"gzip": 38682
},
"react-dom-server.development.js (UMD_DEV)": {
"size": 498439,
"gzip": 120624
"size": 525896,
"gzip": 126687
},
"react-dom-server.production.min.js (UMD_PROD)": {
"size": 107169,
"gzip": 33472
"size": 111581,
"gzip": 34959
},
"react-art.development.js (UMD_DEV)": {
"size": 349177,
"gzip": 77902
"size": 349191,
"gzip": 77905
},
"react-art.production.min.js (UMD_PROD)": {
"size": 96267,
"gzip": 29310
"size": 96277,
"gzip": 29313
},
"react.development.js (NODE_DEV)": {
"size": 70293,
"gzip": 17777
"size": 71914,
"gzip": 18276
},
"react.production.min.js (NODE_PROD)": {
"size": 9195,
"gzip": 3614
},
"React-dev.js (FB_DEV)": {
"size": 71576,
"gzip": 18181
"size": 73423,
"gzip": 18751
},
"React-prod.js (FB_PROD)": {
"size": 36456,
"gzip": 9216
"size": 36836,
"gzip": 9248
},
"ReactDOMStack-dev.js (FB_DEV)": {
"size": 494069,
"gzip": 117876
"size": 496986,
"gzip": 118763
},
"ReactDOMStack-prod.js (FB_PROD)": {
"size": 352489,
"gzip": 84575
"size": 353129,
"gzip": 84773
},
"react-dom.development.js (NODE_DEV)": {
"size": 549893,
"gzip": 126464
"size": 550984,
"gzip": 126642
},
"react-dom.production.min.js (NODE_PROD)": {
"size": 118192,
"gzip": 37224
"size": 118427,
"gzip": 37300
},
"ReactDOMFiber-dev.js (FB_DEV)": {
"size": 550815,
"gzip": 126958
"size": 551962,
"gzip": 127141
},
"ReactDOMFiber-prod.js (FB_PROD)": {
"size": 410570,
"gzip": 94005
"size": 411657,
"gzip": 94084
},
"react-dom-server.development.js (NODE_DEV)": {
"size": 447050,
"gzip": 108025
"size": 474459,
"gzip": 114087
},
"react-dom-server.production.min.js (NODE_PROD)": {
"size": 101542,
"gzip": 31424
"size": 105956,
"gzip": 32782
},
"ReactDOMServerStack-dev.js (FB_DEV)": {
"size": 445736,
"gzip": 107878
"size": 455985,
"gzip": 109831
},
"ReactDOMServerStack-prod.js (FB_PROD)": {
"size": 333450,
"gzip": 80260
"size": 334090,
"gzip": 80459
},
"ReactARTStack-dev.js (FB_DEV)": {
"size": 143166,
@@ -97,20 +97,20 @@
"gzip": 23039
},
"react-art.development.js (NODE_DEV)": {
"size": 270501,
"gzip": 57767
"size": 270515,
"gzip": 57772
},
"react-art.production.min.js (NODE_PROD)": {
"size": 57652,
"gzip": 17386
"size": 57662,
"gzip": 17391
},
"ReactARTFiber-dev.js (FB_DEV)": {
"size": 269759,
"gzip": 57590
"size": 269773,
"gzip": 57593
},
"ReactARTFiber-prod.js (FB_PROD)": {
"size": 208039,
"gzip": 43486
"size": 208053,
"gzip": 43488
},
"ReactNativeStack.js (RN)": {
"size": 233993,
@@ -121,20 +121,20 @@
"gzip": 84001
},
"ReactTestRendererFiber-dev.js (FB_DEV)": {
"size": 267261,
"gzip": 56462
"size": 267275,
"gzip": 56465
},
"ReactTestRendererStack-dev.js (FB_DEV)": {
"size": 151770,
"gzip": 34846
},
"react-noop-renderer.development.js (NODE_DEV)": {
"size": 259178,
"gzip": 54431
"size": 259192,
"gzip": 54435
},
"react-test-renderer.development.js (NODE_DEV)": {
"size": 268012,
"gzip": 56651
"size": 268026,
"gzip": 56654
},
"react-dom-test-utils.development.js (NODE_DEV)": {
"size": 52792,
@@ -155,6 +155,14 @@
"ReactShallowRenderer-dev.js (FB_DEV)": {
"size": 8063,
"gzip": 2229
},
"ReactDOMServerStream-dev.js (FB_DEV)": {
"size": 472917,
"gzip": 113925
},
"ReactDOMServerStream-prod.js (FB_PROD)": {
"size": 345920,
"gzip": 83497
}
}
}

View File

@@ -17,13 +17,15 @@ var {div} = require('ReactDOMFactories');
describe('ReactDOMFactories', () => {
it('allow factories to be called without warnings', () => {
spyOn(console, 'error');
spyOn(console, 'warn');
var element = div();
expect(element.type).toBe('div');
expect(console.error).not.toHaveBeenCalled();
expect(console.warn).not.toHaveBeenCalled();
});
it('warns once when accessing React.DOM methods', () => {
spyOn(console, 'error');
spyOn(console, 'warn');
var a = React.DOM.a();
var p = React.DOM.p();
@@ -31,8 +33,8 @@ describe('ReactDOMFactories', () => {
expect(a.type).toBe('a');
expect(p.type).toBe('p');
expect(console.error).toHaveBeenCalledTimes(1);
expect(console.error.calls.first().args[0]).toContain(
expect(console.warn).toHaveBeenCalledTimes(1);
expect(console.warn.calls.first().args[0]).toContain(
'Warning: Accessing factories like React.DOM.a has been deprecated',
);
});

View File

@@ -27,7 +27,7 @@ var createFactory = ReactElement.createFactory;
var cloneElement = ReactElement.cloneElement;
if (__DEV__) {
var warning = require('fbjs/lib/warning');
var lowPriorityWarning = require('lowPriorityWarning');
var canDefineProperty = require('canDefineProperty');
var ReactElementValidator = require('ReactElementValidator');
createElement = ReactElementValidator.createElement;
@@ -91,7 +91,7 @@ if (__DEV__) {
let warnedForPropTypes = false;
React.createMixin = function(mixin) {
warning(
lowPriorityWarning(
warnedForCreateMixin,
'React.createMixin is deprecated and should not be used. You ' +
'can use this mixin directly instead.',
@@ -104,7 +104,7 @@ if (__DEV__) {
if (canDefineProperty) {
Object.defineProperty(React, 'checkPropTypes', {
get() {
warning(
lowPriorityWarning(
warnedForCheckPropTypes,
'checkPropTypes has been moved to a separate package. ' +
'Accessing React.checkPropTypes is no longer supported ' +
@@ -119,7 +119,7 @@ if (__DEV__) {
Object.defineProperty(React, 'createClass', {
get: function() {
warning(
lowPriorityWarning(
warnedForCreateClass,
'React.createClass is no longer supported. Use a plain JavaScript ' +
"class instead. If you're not yet ready to migrate, " +
@@ -133,7 +133,7 @@ if (__DEV__) {
Object.defineProperty(React, 'PropTypes', {
get() {
warning(
lowPriorityWarning(
warnedForPropTypes,
'PropTypes has been moved to a separate package. ' +
'Accessing React.PropTypes is no longer supported ' +
@@ -155,7 +155,7 @@ if (__DEV__) {
Object.keys(ReactDOMFactories).forEach(function(factory) {
React.DOM[factory] = function(...args) {
if (!warnedForFactories) {
warning(
lowPriorityWarning(
false,
'Accessing factories like React.DOM.%s has been deprecated ' +
'and will be removed in the future. Use the ' +

View File

@@ -19,22 +19,22 @@ describe('React', () => {
});
it('should log a deprecation warning once when using React.createMixin', () => {
spyOn(console, 'error');
spyOn(console, 'warn');
React.createMixin();
React.createMixin();
expectDev(console.error.calls.count()).toBe(1);
expectDev(console.error.calls.argsFor(0)[0]).toContain(
expectDev(console.warn.calls.count()).toBe(1);
expectDev(console.warn.calls.argsFor(0)[0]).toContain(
'React.createMixin is deprecated and should not be used',
);
});
it('should warn once when attempting to access React.createClass', () => {
spyOn(console, 'error');
spyOn(console, 'warn');
let createClass = React.createClass;
createClass = React.createClass;
expect(createClass).not.toBe(undefined);
expectDev(console.error.calls.count()).toBe(1);
expectDev(console.error.calls.argsFor(0)[0]).toContain(
expectDev(console.warn.calls.count()).toBe(1);
expectDev(console.warn.calls.argsFor(0)[0]).toContain(
'React.createClass is no longer supported. Use a plain JavaScript ' +
"class instead. If you're not yet ready to migrate, " +
'create-react-class is available on npm as a drop-in replacement. ' +
@@ -43,12 +43,12 @@ describe('React', () => {
});
it('should warn once when attempting to access React.PropTypes', () => {
spyOn(console, 'error');
spyOn(console, 'warn');
let PropTypes = React.PropTypes;
PropTypes = React.PropTypes;
expect(PropTypes).not.toBe(undefined);
expectDev(console.error.calls.count()).toBe(1);
expectDev(console.error.calls.argsFor(0)[0]).toContain(
expectDev(console.warn.calls.count()).toBe(1);
expectDev(console.warn.calls.argsFor(0)[0]).toContain(
'PropTypes has been moved to a separate package. ' +
'Accessing React.PropTypes is no longer supported ' +
'and will be removed completely in React 16. ' +
@@ -58,12 +58,12 @@ describe('React', () => {
});
it('should warn once when attempting to access React.checkPropTypes', () => {
spyOn(console, 'error');
spyOn(console, 'warn');
let checkPropTypes = React.checkPropTypes;
checkPropTypes = React.checkPropTypes;
expect(checkPropTypes).not.toBe(undefined);
expectDev(console.error.calls.count()).toBe(1);
expectDev(console.error.calls.argsFor(0)[0]).toContain(
expectDev(console.warn.calls.count()).toBe(1);
expectDev(console.warn.calls.argsFor(0)[0]).toContain(
'checkPropTypes has been moved to a separate package. ' +
'Accessing React.checkPropTypes is no longer supported ' +
'and will be removed completely in React 16. ' +

View File

@@ -27,8 +27,9 @@ var getIteratorFn = require('getIteratorFn');
if (__DEV__) {
var checkPropTypes = require('prop-types/checkPropTypes');
var warning = require('fbjs/lib/warning');
var lowPriorityWarning = require('lowPriorityWarning');
var ReactDebugCurrentFrame = require('ReactDebugCurrentFrame');
var warning = require('fbjs/lib/warning');
var {getCurrentStackAddendum} = require('ReactComponentTreeHook');
}
@@ -285,7 +286,7 @@ var ReactElementValidator = {
Object.defineProperty(validatedFactory, 'type', {
enumerable: false,
get: function() {
warning(
lowPriorityWarning(
false,
'Factory.type is deprecated. Access the class directly ' +
'before passing it to createFactory.',

View File

@@ -441,20 +441,20 @@ describe('ReactElementValidator', () => {
});
it('should warn when accessing .type on an element factory', () => {
spyOn(console, 'error');
spyOn(console, 'warn');
function TestComponent() {
return <div />;
}
var TestFactory = React.createFactory(TestComponent);
expect(TestFactory.type).toBe(TestComponent);
expectDev(console.error.calls.count()).toBe(1);
expectDev(console.error.calls.argsFor(0)[0]).toBe(
expectDev(console.warn.calls.count()).toBe(1);
expectDev(console.warn.calls.argsFor(0)[0]).toBe(
'Warning: Factory.type is deprecated. Access the class directly before ' +
'passing it to createFactory.',
);
// Warn once, not again
expect(TestFactory.type).toBe(TestComponent);
expectDev(console.error.calls.count()).toBe(1);
expectDev(console.warn.calls.count()).toBe(1);
});
it('does not warn when using DOM node as children', () => {

View File

@@ -16,7 +16,7 @@ var ReactNoopUpdateQueue = require('ReactNoopUpdateQueue');
var canDefineProperty = require('canDefineProperty');
var emptyObject = require('fbjs/lib/emptyObject');
var invariant = require('fbjs/lib/invariant');
var warning = require('fbjs/lib/warning');
var lowPriorityWarning = require('lowPriorityWarning');
/**
* Base class helpers for the updating state of a component.
@@ -108,7 +108,7 @@ if (__DEV__) {
if (canDefineProperty) {
Object.defineProperty(ReactComponent.prototype, methodName, {
get: function() {
warning(
lowPriorityWarning(
false,
'%s(...) is deprecated in plain JavaScript React classes. %s',
info[0],

View File

@@ -378,16 +378,16 @@ describe 'ReactCoffeeScriptClass', ->
undefined
it 'should throw AND warn when trying to access classic APIs', ->
spyOn console, 'error'
spyOn console, 'warn'
instance =
test Inner(name: 'foo'), 'DIV', 'foo'
expect(-> instance.replaceState {}).toThrow()
expect(-> instance.isMounted()).toThrow()
expect(console.error.calls.count()).toBe 2
expect(console.error.calls.argsFor(0)[0]).toContain(
expect(console.warn.calls.count()).toBe 2
expect(console.warn.calls.argsFor(0)[0]).toContain(
'replaceState(...) is deprecated in plain JavaScript React classes'
)
expect(console.error.calls.argsFor(1)[0]).toContain(
expect(console.warn.calls.argsFor(1)[0]).toContain(
'isMounted(...) is deprecated in plain JavaScript React classes'
)
undefined

View File

@@ -402,15 +402,15 @@ describe('ReactES6Class', () => {
});
it('should throw AND warn when trying to access classic APIs', () => {
spyOn(console, 'error');
spyOn(console, 'warn');
var instance = test(<Inner name="foo" />, 'DIV', 'foo');
expect(() => instance.replaceState({})).toThrow();
expect(() => instance.isMounted()).toThrow();
expect(console.error.calls.count()).toBe(2);
expect(console.error.calls.argsFor(0)[0]).toContain(
expect(console.warn.calls.count()).toBe(2);
expect(console.warn.calls.argsFor(0)[0]).toContain(
'replaceState(...) is deprecated in plain JavaScript React classes',
);
expect(console.error.calls.argsFor(1)[0]).toContain(
expect(console.warn.calls.argsFor(1)[0]).toContain(
'isMounted(...) is deprecated in plain JavaScript React classes',
);
});

View File

@@ -502,18 +502,18 @@ describe('ReactTypeScriptClass', function() {
});
it('should throw AND warn when trying to access classic APIs', function() {
spyOn(console, 'error');
spyOn(console, 'warn');
var instance = test(
React.createElement(Inner, {name: 'foo'}),
'DIV','foo'
);
expect(() => instance.replaceState({})).toThrow();
expect(() => instance.isMounted()).toThrow();
expect((<any>console.error).calls.count()).toBe(2);
expect((<any>console.error).calls.argsFor(0)[0]).toContain(
expect((<any>console.warn).calls.count()).toBe(2);
expect((<any>console.warn).calls.argsFor(0)[0]).toContain(
'replaceState(...) is deprecated in plain JavaScript React classes'
);
expect((<any>console.error).calls.argsFor(1)[0]).toContain(
expect((<any>console.warn).calls.argsFor(1)[0]).toContain(
'isMounted(...) is deprecated in plain JavaScript React classes'
);
});

View File

@@ -406,30 +406,30 @@ describeStack('ReactPerf', () => {
it('warns once when using getMeasurementsSummaryMap', () => {
var measurements = measure(() => {});
spyOn(console, 'error');
spyOn(console, 'warn');
ReactPerf.getMeasurementsSummaryMap(measurements);
expectDev(console.error.calls.count()).toBe(1);
expectDev(console.error.calls.argsFor(0)[0]).toContain(
expectDev(console.warn.calls.count()).toBe(1);
expectDev(console.warn.calls.argsFor(0)[0]).toContain(
'`ReactPerf.getMeasurementsSummaryMap(...)` is deprecated. Use ' +
'`ReactPerf.getWasted(...)` instead.',
);
ReactPerf.getMeasurementsSummaryMap(measurements);
expectDev(console.error.calls.count()).toBe(1);
expectDev(console.warn.calls.count()).toBe(1);
});
it('warns once when using printDOM', () => {
var measurements = measure(() => {});
spyOn(console, 'error');
spyOn(console, 'warn');
ReactPerf.printDOM(measurements);
expectDev(console.error.calls.count()).toBe(1);
expectDev(console.error.calls.argsFor(0)[0]).toContain(
expectDev(console.warn.calls.count()).toBe(1);
expectDev(console.warn.calls.argsFor(0)[0]).toContain(
'`ReactPerf.printDOM(...)` is deprecated. Use ' +
'`ReactPerf.printOperations(...)` instead.',
);
ReactPerf.printDOM(measurements);
expectDev(console.error.calls.count()).toBe(1);
expectDev(console.warn.calls.count()).toBe(1);
});
it('returns isRunning state', () => {

View File

@@ -13,7 +13,7 @@
'use strict';
var ReactDebugTool = require('ReactDebugTool');
var warning = require('fbjs/lib/warning');
var lowPriorityWarning = require('lowPriorityWarning');
var alreadyWarned = false;
import type {FlushHistory} from 'ReactDebugTool';
@@ -390,7 +390,7 @@ function printOperations(flushHistory?: FlushHistory) {
var warnedAboutPrintDOM = false;
function printDOM(measurements: FlushHistory) {
warning(
lowPriorityWarning(
warnedAboutPrintDOM,
'`ReactPerf.printDOM(...)` is deprecated. Use ' +
'`ReactPerf.printOperations(...)` instead.',
@@ -401,7 +401,7 @@ function printDOM(measurements: FlushHistory) {
var warnedAboutGetMeasurementsSummaryMap = false;
function getMeasurementsSummaryMap(measurements: FlushHistory) {
warning(
lowPriorityWarning(
warnedAboutGetMeasurementsSummaryMap,
'`ReactPerf.getMeasurementsSummaryMap(...)` is deprecated. Use ' +
'`ReactPerf.getWasted(...)` instead.',

View File

@@ -12,7 +12,7 @@
'use strict';
var warning = require('fbjs/lib/warning');
var lowPriorityWarning = require('lowPriorityWarning');
/**
* This will log a single deprecation notice per function and forward the call
@@ -35,7 +35,7 @@ function deprecated<T: Function>(
var warned = false;
if (__DEV__) {
var newFn = function() {
warning(
lowPriorityWarning(
warned,
/* eslint-disable no-useless-concat */
// Require examples in this string must be split to prevent React's

View File

@@ -0,0 +1,41 @@
/**
* Copyright 2014-2015, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
* @providesModule lowPriorityWarning
*/
'use strict';
/**
* Forked from fbjs/warning:
* https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js
*
* Only change is we use console.warn instead of console.error,
* and do nothing when 'console' is not supported.
* This really simplifies the code.
* ---
*
* Similar to invariant but only logs a warning if the condition is not met.
* This can be used to log issues in development environments in critical
* paths. Removing the logging code for production environments will keep the
* same logic and follow the same code paths.
*/
var lowPriorityWarning = function() {};
if (__DEV__) {
lowPriorityWarning = function(condition, format, ...args) {
var argIndex = 0;
var message = 'Warning: ' + format.replace(/%s/g, () => args[argIndex++]);
if (!condition && typeof console !== 'undefined') {
console.warn(message);
}
};
}
module.exports = lowPriorityWarning;