Repository: facebook/react
Pull request: [DevTools] Use a single Webpack config for the extensions

Stacked on https://github.com/facebook/react/pull/34512

Backend and rest have now the same config so we can unify them and just fork on the output name. This enables a single command for building in watchmode with `NODE_ENV=development IS_CHROME=true yarn webpack --config webpack.config.js --watch --output-path chrome/build/unpacked/build/`



Changed files:
filename: packages/react-devtools-extensions/build.js
patch: @@ -66,14 +66,6 @@ const build = async (tempPath, manifestPath, envExtension = {}) => {
       stdio: 'inherit',
     },
   );
-  execSync(
-    `${webpackPath} --config webpack.backend.js --output-path ${binPath}`,
-    {
-      cwd: __dirname,
-      env: mergedEnv,
-      stdio: 'inherit',
-    },
-  );
 
   // Make temp dir
   await ensureDir(zipPath);

filename: packages/react-devtools-extensions/webpack.backend.js
patch: @@ -1,135 +0,0 @@
-'use strict';
-
-const {resolve, isAbsolute, relative} = require('path');
-const Webpack = require('webpack');
-const TerserPlugin = require('terser-webpack-plugin');
-
-const {resolveFeatureFlags} = require('react-devtools-shared/buildUtils');
-const SourceMapIgnoreListPlugin = require('react-devtools-shared/SourceMapIgnoreListPlugin');
-
-const {GITHUB_URL, getVersionString} = require('./utils');
-
-const NODE_ENV = process.env.NODE_ENV;
-if (!NODE_ENV) {
-  console.error('NODE_ENV not set');
-  process.exit(1);
-}
-
-const builtModulesDir = resolve(
-  __dirname,
-  '..',
-  '..',
-  'build',
-  'oss-experimental',
-);
-
-const __DEV__ = NODE_ENV === 'development';
-
-const DEVTOOLS_VERSION = getVersionString(process.env.DEVTOOLS_VERSION);
-
-const IS_CHROME = process.env.IS_CHROME === 'true';
-const IS_FIREFOX = process.env.IS_FIREFOX === 'true';
-const IS_EDGE = process.env.IS_EDGE === 'true';
-
-const featureFlagTarget = process.env.FEATURE_FLAG_TARGET || 'extension-oss';
-
-module.exports = {
-  mode: __DEV__ ? 'development' : 'production',
-  devtool: false,
-  entry: {
-    backend: './src/backend.js',
-  },
-  output: {
-    path: __dirname + '/build',
-    filename: 'react_devtools_backend_compact.js',
-  },
-  node: {
-    global: false,
-  },
-  resolve: {
-    alias: {
-      react: resolve(builtModulesDir, 'react'),
-      'react-debug-tools': resolve(builtModulesDir, 'react-debug-tools'),
-      'react-devtools-feature-flags': resolveFeatureFlags(featureFlagTarget),
-      'react-dom': resolve(builtModulesDir, 'react-dom'),
-      'react-is': resolve(builtModulesDir, 'react-is'),
-      scheduler: resolve(builtModulesDir, 'scheduler'),
-    },
-  },
-  optimization: {
-    minimize: !__DEV__,
-    minimizer: [
-      new TerserPlugin({
-        terserOptions: {
-          compress: {
-            unused: true,
-            dead_code: true,
-          },
-          mangle: {
-            keep_fnames: true,
-          },
-          format: {
-            comments: false,
-          },
-        },
-        extractComments: false,
-      }),
-    ],
-  },
-  plugins: [
-    new Webpack.ProvidePlugin({
-      process: 'process/browser',
-    }),
-    new Webpack.DefinePlugin({
-      __DEV__,
-      __PROFILE__: false,
-      // By importing `shared/` we may import ReactFeatureFlags
-      __EXPERIMENTAL__: true,
-      'process.env.DEVTOOLS_PACKAGE': `"react-devtools-extensions"`,
-      'process.env.DEVTOOLS_VERSION': `"${DEVTOOLS_VERSION}"`,
-      'process.env.GITHUB_URL': `"${GITHUB_URL}"`,
-      'process.env.IS_CHROME': IS_CHROME,
-      'process.env.IS_FIREFOX': IS_FIREFOX,
-      'process.env.IS_EDGE': IS_EDGE,
-      __IS_CHROME__: IS_CHROME,
-      __IS_FIREFOX__: IS_FIREFOX,
-      __IS_EDGE__: IS_EDGE,
-      __IS_NATIVE__: false,
-      __IS_INTERNAL_MCP_BUILD__: false,
-    }),
-    new Webpack.SourceMapDevToolPlugin({
-      filename: '[file].map',
-      noSources: !__DEV__,
-      // https://github.com/webpack/webpack/issues/3603#issuecomment-1743147144
-      moduleFilenameTemplate(info) {
-        const {absoluteResourcePath, namespace, resourcePath} = info;
-
-        if (isAbsolute(absoluteResourcePath)) {
-          return relative(__dirname + '/build', absoluteResourcePath);
-        }
-
-        // Mimic Webpack's default behavior:
-        return `webpack://${namespace}/${resourcePath}`;
-      },
-    }),
-    new SourceMapIgnoreListPlugin({
-      shouldIgnoreSource: () => !__DEV__,
-    }),
-  ],
-  module: {
-    rules: [
-      {
-        test: /\.js$/,
-        loader: 'babel-loader',
-        options: {
-          configFile: resolve(
-            __dirname,
-            '..',
-            'react-devtools-shared',
-            'babel.config.js',
-          ),
-        },
-      },
-    ],
-  },
-};

filename: packages/react-devtools-extensions/webpack.config.js
patch: @@ -66,6 +66,7 @@ module.exports = {
   mode: __DEV__ ? 'development' : 'production',
   devtool: false,
   entry: {
+    backend: './src/backend.js',
     background: './src/background/index.js',
     backendManager: './src/contentScripts/backendManager.js',
     fileFetcher: './src/contentScripts/fileFetcher.js',
@@ -79,7 +80,14 @@ module.exports = {
   output: {
     path: __dirname + '/build',
     publicPath: '/build/',
-    filename: '[name].js',
+    filename: chunkData => {
+      switch (chunkData.chunk.name) {
+        case 'backend':
+          return 'react_devtools_backend_compact.js';
+        default:
+          return '[name].js';
+      }
+    },
     chunkFilename: '[name].chunk.js',
   },
   node: {
@@ -141,7 +149,7 @@ module.exports = {
     }),
     new Webpack.SourceMapDevToolPlugin({
       filename: '[file].map',
-      include: 'installHook.js',
+      include: ['installHook.js', 'react_devtools_backend_compact.js'],
       noSources: !__DEV__,
       // https://github.com/webpack/webpack/issues/3603#issuecomment-1743147144
       moduleFilenameTemplate(info) {
@@ -163,6 +171,7 @@ module.exports = {
         }
 
         const contentScriptNamesToIgnoreList = [
+          'react_devtools_backend_compact',
           // This is where we override console
           'installHook',
         ];