From e960cf13fa2d18434f607ebc5720ef49082f2fb2 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Wed, 13 Sep 2017 22:42:46 +0100 Subject: [PATCH 1/2] Report bad dead code elimination to React DevTools --- packages/react-dom/index.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/react-dom/index.js b/packages/react-dom/index.js index 3f92519f1732f..c4f4144d28acd 100644 --- a/packages/react-dom/index.js +++ b/packages/react-dom/index.js @@ -1,6 +1,36 @@ 'use strict'; +function checkDCE() { + if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' || + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function' + ) { + return; + } + if (process.env.NODE_ENV !== 'production') { + // This branch is unreachable because this function is only called + // in production, but the condition is true only in development. + // Therefore if the branch is still here, dead code elimination wasn't + // properly applied. + // Don't change the message. React DevTools relies on it. Also make sure + // this message doesn't occur elsewhere in this function, or it will cause + // a false positive. + throw new Error('^_^'); + } + try { + // Verify that the code above has been dead code eliminated (DCE'd). + __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE); + } catch (err) { + // DevTools shouldn't crash React, no matter what. + // We should still report in case we break this code. + console.error(err); + } +} + if (process.env.NODE_ENV === 'production') { + // DCE check should happen before ReactDOM bundle executes so that + // DevTools can report bad minification during injection. + checkDCE(); module.exports = require('./cjs/react-dom.production.min.js'); } else { module.exports = require('./cjs/react-dom.development.js'); From 592846fdaa00d9d2b18163635a73ab21712d61c6 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Wed, 13 Sep 2017 23:10:48 +0100 Subject: [PATCH 2/2] Fix lint --- packages/react-dom/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/react-dom/index.js b/packages/react-dom/index.js index c4f4144d28acd..0eb376e9d5c39 100644 --- a/packages/react-dom/index.js +++ b/packages/react-dom/index.js @@ -1,6 +1,7 @@ 'use strict'; function checkDCE() { + /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ if ( typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' || typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'