-
-
Notifications
You must be signed in to change notification settings - Fork 26.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allow bundles to be analyzed with Webpack-specific tools #3945
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -33,6 +33,7 @@ const path = require('path'); | |
const chalk = require('chalk'); | ||
const fs = require('fs-extra'); | ||
const webpack = require('webpack'); | ||
const bfj = require('bfj'); | ||
const config = require('../config/webpack.config.prod'); | ||
const paths = require('../config/paths'); | ||
const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles'); | ||
|
@@ -55,6 +56,10 @@ if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { | |
process.exit(1); | ||
} | ||
|
||
// Process CLI arguments | ||
const argv = process.argv.slice(2); | ||
const writeStatsJson = argv.indexOf('--stats') !== -1; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not sure if There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think |
||
|
||
// We require that you explictly set browsers and do not fall back to | ||
// browserslist defaults. | ||
const { checkBrowsers } = require('react-dev-utils/browsersHelper'); | ||
|
@@ -161,11 +166,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))); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As I can see you don't really need There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Hi @joshwcomeau, thanks for fast reply. |
||
} | ||
|
||
return resolve(resolveArgs); | ||
}); | ||
}); | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2048,6 +2048,14 @@ will affect your users' experience. | |
|
||
## Analyzing the Bundle Size | ||
|
||
When your app grows in size, it's easy for bundles to become bloated. The first step to solving large bundles is understanding what's in them! | ||
|
||
There are many different tools available to analyze bundles, but they typically rely on either **sourcemaps** or **webpack-specific JSON stats**. | ||
|
||
### Using Sourcemaps | ||
|
||
When building for production, sourcemaps are automatically created adjacent to the JS files in `build/static/js`. | ||
|
||
[Source map explorer](https://www.npmjs.com/package/source-map-explorer) analyzes | ||
JavaScript bundles using the source maps. This helps you understand where code | ||
bloat is coming from. | ||
|
@@ -2082,6 +2090,45 @@ npm run build | |
npm run analyze | ||
``` | ||
|
||
### Using Webpack Stats JSON | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should we add a note that this feature is available only in some specific version of
I don't know how the process of adding these version notes goes, though. Are they added just before releasing a new version? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, good idea! I'm also unfamiliar with the process, since yeah I don't know which version it'll be released in. Happy to update the PR if this is knowable in advance, though :) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is going to end up in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please remove this part or hide it behind comments. 2.x is the main branch now so that's what you find when you look at the repository. It will be deeply confusing to the users to see this in README now. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
|
||
> Note: this feature is available with react-scripts@2.0 and higher. | ||
|
||
Webpack can produce a JSON manifest that details the bundles, and several tools can use that file to do analysis. | ||
|
||
Unlike with sourcemaps, the JSON file isn't created automatically on build. You must pass a `--stats` flag: | ||
|
||
```sh | ||
npm run build -- --stats | ||
``` | ||
|
||
Once the build is complete, you should have a JSON file located at `build/bundle-stats.json`. | ||
|
||
The quickest way to get insight into your bundle is to drag and drop that JSON file into [Webpack Visualizer](https://chrisbateman.github.io/webpack-visualizer/). | ||
|
||
Another very popular tool is [`webpack-bundle-analyzer`](https://github.com/webpack-contrib/webpack-bundle-analyzer). | ||
|
||
To use `webpack-bundle-analyzer`, start by installing it from NPM: | ||
|
||
```sh | ||
npm install --save webpack-bundle-analyzer | ||
# or, with Yarn: | ||
yarn add webpack-bundle-analyzer | ||
``` | ||
|
||
|
||
In `package.json`, add the following line to `scripts`: | ||
|
||
```diff | ||
"scripts": { | ||
+ "analyze": "npm run build -- --stats && webpack-bundle-analyzer build/bundle-stats.json", | ||
"start": "react-scripts start", | ||
"build": "react-scripts build", | ||
"test": "react-scripts test --env=jsdom", | ||
``` | ||
|
||
When you run `npm run analyze`, a new build will be created, and a browser tab should open automatically, displaying the sizes of the modules within your bundle. | ||
|
||
## Deployment | ||
|
||
`npm run build` creates a `build` directory with a production build of your app. Set up your favorite HTTP server so that a visitor to your site is served `index.html`, and requests to static paths like `/static/js/main.<hash>.js` are served with the contents of the `/static/js/main.<hash>.js` file. | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Big Friendly JSON. Is this really needed?