Skip to content

Commit e231c77

Browse files
Support reading large stats.json files (#423)
* Remake PR * Move from devDependencies
1 parent 3893041 commit e231c77

5 files changed

Lines changed: 52 additions & 40 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ _Note: Gaps between patch versions are faulty, broken or test releases._
1212

1313
## UNRELEASED
1414

15+
* **Improvement**
16+
* Support reading large (>500MB) stats.json files ([#423](https://github.com/webpack-contrib/webpack-bundle-analyzer/pull/423) by [@henry-alakazhang](https://github.com/henry-alakazhang))
17+
1518
## 4.7.0
1619

1720
* **New Feature**

package-lock.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"lib"
3333
],
3434
"dependencies": {
35+
"@discoveryjs/json-ext": "0.5.7",
3536
"acorn": "^8.0.4",
3637
"acorn-walk": "^8.0.0",
3738
"chalk": "^4.1.0",

src/analyzer.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const path = require('path');
33

44
const _ = require('lodash');
55
const gzipSize = require('gzip-size');
6+
const {parseChunked} = require('@discoveryjs/json-ext');
67

78
const Logger = require('./Logger');
89
const Folder = require('./tree/Folder').default;
@@ -164,8 +165,8 @@ function getViewerData(bundleStats, bundleDir, opts) {
164165
}
165166

166167
function readStatsFromFile(filename) {
167-
return JSON.parse(
168-
fs.readFileSync(filename, 'utf8')
168+
return parseChunked(
169+
fs.createReadStream(filename, {encoding: 'utf8'})
169170
);
170171
}
171172

src/bin/analyzer.js

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -110,44 +110,46 @@ bundleStatsFile = resolve(bundleStatsFile);
110110

111111
if (!bundleDir) bundleDir = dirname(bundleStatsFile);
112112

113-
let bundleStats;
114-
try {
115-
bundleStats = analyzer.readStatsFromFile(bundleStatsFile);
116-
} catch (err) {
117-
logger.error(`Couldn't read webpack bundle stats from "${bundleStatsFile}":\n${err}`);
118-
logger.debug(err.stack);
119-
process.exit(1);
120-
}
121-
122-
if (mode === 'server') {
123-
viewer.startServer(bundleStats, {
124-
openBrowser,
125-
port,
126-
host,
127-
defaultSizes,
128-
reportTitle,
129-
bundleDir,
130-
excludeAssets,
131-
logger: new Logger(logLevel),
132-
analyzerUrl: utils.defaultAnalyzerUrl
133-
});
134-
} else if (mode === 'static') {
135-
viewer.generateReport(bundleStats, {
136-
openBrowser,
137-
reportFilename: resolve(reportFilename || 'report.html'),
138-
reportTitle,
139-
defaultSizes,
140-
bundleDir,
141-
excludeAssets,
142-
logger: new Logger(logLevel)
143-
});
144-
} else if (mode === 'json') {
145-
viewer.generateJSONReport(bundleStats, {
146-
reportFilename: resolve(reportFilename || 'report.json'),
147-
bundleDir,
148-
excludeAssets,
149-
logger: new Logger(logLevel)
150-
});
113+
parseAndAnalyse(bundleStatsFile);
114+
115+
async function parseAndAnalyse(bundleStatsFile) {
116+
try {
117+
const bundleStats = await analyzer.readStatsFromFile(bundleStatsFile);
118+
if (mode === 'server') {
119+
viewer.startServer(bundleStats, {
120+
openBrowser,
121+
port,
122+
host,
123+
defaultSizes,
124+
reportTitle,
125+
bundleDir,
126+
excludeAssets,
127+
logger: new Logger(logLevel),
128+
analyzerUrl: utils.defaultAnalyzerUrl
129+
});
130+
} else if (mode === 'static') {
131+
viewer.generateReport(bundleStats, {
132+
openBrowser,
133+
reportFilename: resolve(reportFilename || 'report.html'),
134+
reportTitle,
135+
defaultSizes,
136+
bundleDir,
137+
excludeAssets,
138+
logger: new Logger(logLevel)
139+
});
140+
} else if (mode === 'json') {
141+
viewer.generateJSONReport(bundleStats, {
142+
reportFilename: resolve(reportFilename || 'report.json'),
143+
bundleDir,
144+
excludeAssets,
145+
logger: new Logger(logLevel)
146+
});
147+
}
148+
} catch (err) {
149+
logger.error(`Couldn't read webpack bundle stats from "${bundleStatsFile}":\n${err}`);
150+
logger.debug(err.stack);
151+
process.exit(1);
152+
}
151153
}
152154

153155
function showHelp(error) {

0 commit comments

Comments
 (0)