diff --git a/packages/react-dom/npm/profiling.js b/packages/react-dom/npm/profiling.js new file mode 100644 index 0000000000000..91f89f07ffe13 --- /dev/null +++ b/packages/react-dom/npm/profiling.js @@ -0,0 +1,38 @@ +'use strict'; + +function checkDCE() { + /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ + 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.profiling.min.js'); +} else { + module.exports = require('./cjs/react-dom.development.js'); +} diff --git a/packages/react-dom/package.json b/packages/react-dom/package.json index 31f29f85ad9c1..4b5186d1486b6 100644 --- a/packages/react-dom/package.json +++ b/packages/react-dom/package.json @@ -25,6 +25,7 @@ "LICENSE", "README.md", "index.js", + "profiling.js", "server.js", "server.browser.js", "server.node.js",