webpack-bundle-analyzer 4.0.0-rc1 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/lib/BundleAnalyzerPlugin.js +9 -12
- package/lib/analyzer.js +27 -27
- package/lib/bin/analyzer.js +1 -3
- package/lib/parseUtils.js +13 -10
- package/lib/statsUtils.js +90 -0
- package/lib/template.js +73 -0
- package/lib/tree/BaseFolder.js +1 -3
- package/lib/tree/ConcatenatedModule.js +2 -4
- package/lib/tree/Folder.js +1 -3
- package/lib/utils.js +5 -4
- package/lib/viewer.js +46 -81
- package/package.json +7 -10
- package/src/BundleAnalyzerPlugin.js +4 -11
- package/src/analyzer.js +27 -23
- package/src/bin/analyzer.js +1 -2
- package/src/parseUtils.js +14 -12
- package/src/statsUtils.js +82 -0
- package/{views/viewer.ejs → src/template.js} +50 -7
- package/src/tree/BaseFolder.js +1 -1
- package/src/tree/ConcatenatedModule.js +2 -2
- package/src/tree/Folder.js +1 -1
- package/src/utils.js +4 -4
- package/src/viewer.js +38 -80
- package/views/script.ejs +0 -8
package/src/utils.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const {inspect} = require('util');
|
|
1
|
+
const {inspect, types} = require('util');
|
|
2
2
|
const _ = require('lodash');
|
|
3
3
|
const opener = require('opener');
|
|
4
4
|
|
|
@@ -15,11 +15,11 @@ function createAssetsFilter(excludePatterns) {
|
|
|
15
15
|
pattern = new RegExp(pattern, 'u');
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
if (
|
|
18
|
+
if (types.isRegExp(pattern)) {
|
|
19
19
|
return (asset) => pattern.test(asset);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
if (
|
|
22
|
+
if (typeof pattern !== 'function') {
|
|
23
23
|
throw new TypeError(
|
|
24
24
|
`Pattern should be either string, RegExp or a function, but "${inspect(pattern, {depth: 0})}" got.`
|
|
25
25
|
);
|
|
@@ -30,7 +30,7 @@ function createAssetsFilter(excludePatterns) {
|
|
|
30
30
|
.value();
|
|
31
31
|
|
|
32
32
|
if (excludeFunctions.length) {
|
|
33
|
-
return (asset) =>
|
|
33
|
+
return (asset) => excludeFunctions.every(fn => fn(asset) !== true);
|
|
34
34
|
} else {
|
|
35
35
|
return () => true;
|
|
36
36
|
}
|
package/src/viewer.js
CHANGED
|
@@ -3,18 +3,16 @@ const fs = require('fs');
|
|
|
3
3
|
const http = require('http');
|
|
4
4
|
|
|
5
5
|
const WebSocket = require('ws');
|
|
6
|
+
const sirv = require('sirv');
|
|
6
7
|
const _ = require('lodash');
|
|
7
|
-
const express = require('express');
|
|
8
|
-
const ejs = require('ejs');
|
|
9
|
-
const mkdir = require('mkdirp');
|
|
10
8
|
const {bold} = require('chalk');
|
|
11
9
|
|
|
12
10
|
const Logger = require('./Logger');
|
|
13
11
|
const analyzer = require('./analyzer');
|
|
14
12
|
const {open} = require('./utils');
|
|
13
|
+
const {renderViewer} = require('./template');
|
|
15
14
|
|
|
16
15
|
const projectRoot = path.resolve(__dirname, '..');
|
|
17
|
-
const assetsRoot = path.join(projectRoot, 'public');
|
|
18
16
|
|
|
19
17
|
function resolveTitle(reportTitle) {
|
|
20
18
|
if (typeof reportTitle === 'function') {
|
|
@@ -50,28 +48,26 @@ async function startServer(bundleStats, opts) {
|
|
|
50
48
|
|
|
51
49
|
if (!chartData) return;
|
|
52
50
|
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
// Fixes #17
|
|
57
|
-
app.engine('ejs', require('ejs').renderFile);
|
|
58
|
-
app.set('view engine', 'ejs');
|
|
59
|
-
app.set('views', `${projectRoot}/views`);
|
|
60
|
-
app.use(express.static(`${projectRoot}/public`));
|
|
61
|
-
|
|
62
|
-
app.use('/', (req, res) => {
|
|
63
|
-
res.render('viewer', {
|
|
64
|
-
mode: 'server',
|
|
65
|
-
title: resolveTitle(reportTitle),
|
|
66
|
-
get chartData() { return chartData },
|
|
67
|
-
defaultSizes,
|
|
68
|
-
enableWebSocket: true,
|
|
69
|
-
// Helpers
|
|
70
|
-
escapeJson
|
|
71
|
-
});
|
|
51
|
+
const sirvMiddleware = sirv(`${projectRoot}/public`, {
|
|
52
|
+
// disables caching and traverse the file system on every request
|
|
53
|
+
dev: true
|
|
72
54
|
});
|
|
73
55
|
|
|
74
|
-
const server = http.createServer(
|
|
56
|
+
const server = http.createServer((req, res) => {
|
|
57
|
+
if (req.method === 'GET' && req.url === '/') {
|
|
58
|
+
const html = renderViewer({
|
|
59
|
+
mode: 'server',
|
|
60
|
+
title: resolveTitle(reportTitle),
|
|
61
|
+
chartData,
|
|
62
|
+
defaultSizes,
|
|
63
|
+
enableWebSocket: true
|
|
64
|
+
});
|
|
65
|
+
res.writeHead(200, {'Content-Type': 'text/html'});
|
|
66
|
+
res.end(html);
|
|
67
|
+
} else {
|
|
68
|
+
sirvMiddleware(req, res);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
75
71
|
|
|
76
72
|
await new Promise(resolve => {
|
|
77
73
|
server.listen(port, host, () => {
|
|
@@ -140,44 +136,23 @@ async function generateReport(bundleStats, opts) {
|
|
|
140
136
|
|
|
141
137
|
if (!chartData) return;
|
|
142
138
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
chartData,
|
|
150
|
-
defaultSizes,
|
|
151
|
-
enableWebSocket: false,
|
|
152
|
-
// Helpers
|
|
153
|
-
assetContent: getAssetContent,
|
|
154
|
-
escapeJson
|
|
155
|
-
},
|
|
156
|
-
(err, reportHtml) => {
|
|
157
|
-
try {
|
|
158
|
-
if (err) {
|
|
159
|
-
logger.error(err);
|
|
160
|
-
reject(err);
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const reportFilepath = path.resolve(bundleDir || process.cwd(), reportFilename);
|
|
165
|
-
|
|
166
|
-
mkdir.sync(path.dirname(reportFilepath));
|
|
167
|
-
fs.writeFileSync(reportFilepath, reportHtml);
|
|
168
|
-
|
|
169
|
-
logger.info(`${bold('Webpack Bundle Analyzer')} saved report to ${bold(reportFilepath)}`);
|
|
170
|
-
|
|
171
|
-
if (openBrowser) {
|
|
172
|
-
open(`file://${reportFilepath}`, logger);
|
|
173
|
-
}
|
|
174
|
-
resolve();
|
|
175
|
-
} catch (e) {
|
|
176
|
-
reject(e);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
);
|
|
139
|
+
const reportHtml = renderViewer({
|
|
140
|
+
mode: 'static',
|
|
141
|
+
title: resolveTitle(reportTitle),
|
|
142
|
+
chartData,
|
|
143
|
+
defaultSizes,
|
|
144
|
+
enableWebSocket: false
|
|
180
145
|
});
|
|
146
|
+
const reportFilepath = path.resolve(bundleDir || process.cwd(), reportFilename);
|
|
147
|
+
|
|
148
|
+
fs.mkdirSync(path.dirname(reportFilepath), {recursive: true});
|
|
149
|
+
fs.writeFileSync(reportFilepath, reportHtml);
|
|
150
|
+
|
|
151
|
+
logger.info(`${bold('Webpack Bundle Analyzer')} saved report to ${bold(reportFilepath)}`);
|
|
152
|
+
|
|
153
|
+
if (openBrowser) {
|
|
154
|
+
open(`file://${reportFilepath}`, logger);
|
|
155
|
+
}
|
|
181
156
|
}
|
|
182
157
|
|
|
183
158
|
async function generateJSONReport(bundleStats, opts) {
|
|
@@ -187,29 +162,12 @@ async function generateJSONReport(bundleStats, opts) {
|
|
|
187
162
|
|
|
188
163
|
if (!chartData) return;
|
|
189
164
|
|
|
190
|
-
mkdir
|
|
191
|
-
fs.
|
|
165
|
+
await fs.promises.mkdir(path.dirname(reportFilename), {recursive: true});
|
|
166
|
+
await fs.promises.writeFile(reportFilename, JSON.stringify(chartData));
|
|
192
167
|
|
|
193
168
|
logger.info(`${bold('Webpack Bundle Analyzer')} saved JSON report to ${bold(reportFilename)}`);
|
|
194
169
|
}
|
|
195
170
|
|
|
196
|
-
function getAssetContent(filename) {
|
|
197
|
-
const assetPath = path.join(assetsRoot, filename);
|
|
198
|
-
|
|
199
|
-
if (!assetPath.startsWith(assetsRoot)) {
|
|
200
|
-
throw new Error(`"${filename}" is outside of the assets root`);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
return fs.readFileSync(assetPath, 'utf8');
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Escapes `<` characters in JSON to safely use it in `<script>` tag.
|
|
208
|
-
*/
|
|
209
|
-
function escapeJson(json) {
|
|
210
|
-
return JSON.stringify(json).replace(/</gu, '\\u003c');
|
|
211
|
-
}
|
|
212
|
-
|
|
213
171
|
function getChartData(analyzerOpts, ...args) {
|
|
214
172
|
let chartData;
|
|
215
173
|
const {logger} = analyzerOpts;
|