From 9f4254c913d6883a0aac467bc000630807d7513a Mon Sep 17 00:00:00 2001 From: Henry Zhang Date: Fri, 19 Mar 2021 15:10:11 +1100 Subject: [PATCH] Support large stats.json files --- package-lock.json | 5 ++++ package.json | 1 + src/analyzer.js | 5 ++-- src/bin/analyzer.js | 64 +++++++++++++++++++++++---------------------- 4 files changed, 41 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index f8464d13..e5ab4a2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1251,6 +1251,11 @@ "integrity": "sha512-cDql5T3eS4Y5jzrDj25QNpU0pHgLFJ96MaoMAkJX8ceL2yat4u7EbIuqLoTbQLiTy1KxDRFbxHIKLzTUT64Duw==", "dev": true }, + "@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==" + }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", diff --git a/package.json b/package.json index 60d099ba..9710e11e 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "src" ], "dependencies": { + "@discoveryjs/json-ext": "^0.5.2", "acorn": "^8.0.4", "acorn-walk": "^8.0.0", "chalk": "^4.1.0", diff --git a/src/analyzer.js b/src/analyzer.js index 5b76c258..e8cc170b 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -1,5 +1,6 @@ const fs = require('fs'); const path = require('path'); +const {parseChunked} = require('@discoveryjs/json-ext'); const _ = require('lodash'); const gzipSize = require('gzip-size'); @@ -162,9 +163,7 @@ function getViewerData(bundleStats, bundleDir, opts) { } function readStatsFromFile(filename) { - return JSON.parse( - fs.readFileSync(filename, 'utf8') - ); + return parseChunked(fs.createReadStream(filename, {encoding: 'utf8'})); } function getChildAssetBundles(bundleStats, assetName) { diff --git a/src/bin/analyzer.js b/src/bin/analyzer.js index 5303578c..d4d2651c 100755 --- a/src/bin/analyzer.js +++ b/src/bin/analyzer.js @@ -110,44 +110,46 @@ bundleStatsFile = resolve(bundleStatsFile); if (!bundleDir) bundleDir = dirname(bundleStatsFile); -let bundleStats; +let bundleStatsPromise; try { - bundleStats = analyzer.readStatsFromFile(bundleStatsFile); + bundleStatsPromise = analyzer.readStatsFromFile(bundleStatsFile); } catch (err) { logger.error(`Couldn't read webpack bundle stats from "${bundleStatsFile}":\n${err}`); logger.debug(err.stack); process.exit(1); } -if (mode === 'server') { - viewer.startServer(bundleStats, { - openBrowser, - port, - host, - defaultSizes, - reportTitle, - bundleDir, - excludeAssets, - logger: new Logger(logLevel) - }); -} else if (mode === 'static') { - viewer.generateReport(bundleStats, { - openBrowser, - reportFilename: resolve(reportFilename || 'report.html'), - reportTitle, - defaultSizes, - bundleDir, - excludeAssets, - logger: new Logger(logLevel) - }); -} else if (mode === 'json') { - viewer.generateJSONReport(bundleStats, { - reportFilename: resolve(reportFilename || 'report.json'), - bundleDir, - excludeAssets, - logger: new Logger(logLevel) - }); -} +bundleStatsPromise.then(bundleStats => { + if (mode === 'server') { + viewer.startServer(bundleStats, { + openBrowser, + port, + host, + defaultSizes, + reportTitle, + bundleDir, + excludeAssets, + logger: new Logger(logLevel) + }); + } else if (mode === 'static') { + viewer.generateReport(bundleStats, { + openBrowser, + reportFilename: resolve(reportFilename || 'report.html'), + reportTitle, + defaultSizes, + bundleDir, + excludeAssets, + logger: new Logger(logLevel) + }); + } else if (mode === 'json') { + viewer.generateJSONReport(bundleStats, { + reportFilename: resolve(reportFilename || 'report.json'), + bundleDir, + excludeAssets, + logger: new Logger(logLevel) + }); + } +}); function showHelp(error) { if (error) console.log(`\n ${magenta(error)}\n`);