From 3a0b53a313c82bc5b61246edd154bccb71a2e218 Mon Sep 17 00:00:00 2001 From: Ian Sutherland Date: Wed, 16 Sep 2020 11:46:35 -0600 Subject: [PATCH] Use new JSX transform with React 17 (#9645) --- packages/babel-preset-react-app/create.js | 7 ++++++- packages/react-scripts/config/webpack.config.js | 13 ++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/babel-preset-react-app/create.js b/packages/babel-preset-react-app/create.js index 7aacc8a23fb..a617a507f2e 100644 --- a/packages/babel-preset-react-app/create.js +++ b/packages/babel-preset-react-app/create.js @@ -54,6 +54,10 @@ module.exports = function (api, opts, env) { ); } + var hasJsxRuntime = Boolean( + api.caller(caller => !!caller && caller.hasJsxRuntime) + ); + if (!isEnvDevelopment && !isEnvProduction && !isEnvTest) { throw new Error( 'Using `babel-preset-react-app` requires that you specify `NODE_ENV` or ' + @@ -95,7 +99,8 @@ module.exports = function (api, opts, env) { development: isEnvDevelopment || isEnvTest, // Will use the native built-in instead of trying to polyfill // behavior for any plugins that require one. - useBuiltIns: true, + ...(!hasJsxRuntime ? { useBuiltIns: true } : {}), + runtime: opts.runtime || 'classic', }, ], isTypeScriptEnabled && [require('@babel/preset-typescript').default], diff --git a/packages/react-scripts/config/webpack.config.js b/packages/react-scripts/config/webpack.config.js index b0f11c8c7cb..bb6fee919a3 100644 --- a/packages/react-scripts/config/webpack.config.js +++ b/packages/react-scripts/config/webpack.config.js @@ -14,6 +14,7 @@ const fs = require('fs'); const path = require('path'); const webpack = require('webpack'); const resolve = require('resolve'); +const semver = require('semver'); const PnpWebpackPlugin = require('pnp-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); @@ -35,6 +36,7 @@ const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin'); const ForkTsCheckerWebpackPlugin = require('react-dev-utils/ForkTsCheckerWebpackPlugin'); const typescriptFormatter = require('react-dev-utils/typescriptFormatter'); const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); +const react = require(require.resolve('react', { paths: [paths.appPath] })); // @remove-on-eject-begin const getCacheIdentifier = require('react-dev-utils/getCacheIdentifier'); // @remove-on-eject-end @@ -402,7 +404,16 @@ module.exports = function (webpackEnv) { // @remove-on-eject-begin babelrc: false, configFile: false, - presets: [require.resolve('babel-preset-react-app')], + presets: [ + [ + require.resolve('babel-preset-react-app'), + { + runtime: semver.gte(react.version, '17.0.0-alpha.0') + ? 'automatic' + : 'classic', + }, + ], + ], // Make sure we have a unique cache identifier, erring on the // side of caution. // We remove this when the user ejects because the default