diff --git a/packages/react-scripts/package.json b/packages/react-scripts/package.json index 63e7faf390c..4f6ee11625b 100644 --- a/packages/react-scripts/package.json +++ b/packages/react-scripts/package.json @@ -37,6 +37,7 @@ "babel-loader": "8.1.0", "babel-plugin-named-asset-import": "^0.3.6", "babel-preset-react-app": "^9.1.2", + "bfj": "^7.0.2", "camelcase": "^5.3.1", "case-sensitive-paths-webpack-plugin": "2.3.0", "css-loader": "3.4.2", diff --git a/packages/react-scripts/scripts/build.js b/packages/react-scripts/scripts/build.js index fa30fb09a3f..b51df86101b 100644 --- a/packages/react-scripts/scripts/build.js +++ b/packages/react-scripts/scripts/build.js @@ -34,6 +34,7 @@ verifyTypeScriptSetup(); const path = require('path'); const chalk = require('react-dev-utils/chalk'); const fs = require('fs-extra'); +const bfj = require('bfj'); const webpack = require('webpack'); const configFactory = require('../config/webpack.config'); const paths = require('../config/paths'); @@ -59,6 +60,9 @@ if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { process.exit(1); } +const argv = process.argv.slice(2); +const writeStatsJson = argv.indexOf('--stats') !== -1; + // Generate configuration const config = configFactory('production'); @@ -210,11 +214,20 @@ function build(previousFileSizes) { return reject(new Error(messages.warnings.join('\n\n'))); } - return resolve({ + const resolveArgs = { stats, previousFileSizes, warnings: messages.warnings, - }); + }; + + if (writeStatsJson) { + return bfj + .write(paths.appBuild + '/bundle-stats.json', stats.toJson()) + .then(() => resolve(resolveArgs)) + .catch(error => reject(new Error(error))); + } + + return resolve(resolveArgs); }); }); }