1 | 'use strict';
|
2 |
|
3 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
4 |
|
5 | var path = require('path');
|
6 | var fs = require('fs');
|
7 |
|
8 | var _ = require('lodash');
|
9 | var express = require('express');
|
10 | var ejs = require('ejs');
|
11 | var opener = require('opener');
|
12 | var mkdir = require('mkdirp');
|
13 |
|
14 | var _require = require('chalk'),
|
15 | bold = _require.bold;
|
16 |
|
17 | var analyzer = require('./analyzer');
|
18 |
|
19 | var projectRoot = path.resolve(__dirname, '..');
|
20 |
|
21 | module.exports = {
|
22 | startServer: startServer,
|
23 | generateReport: generateReport,
|
24 |
|
25 | start: startServer
|
26 | };
|
27 |
|
28 | function startServer(bundleStats, opts) {
|
29 | opts = _extends({
|
30 | port: 8888,
|
31 | openBrowser: true,
|
32 | bundleDir: null
|
33 | }, opts);
|
34 |
|
35 | var chartData = void 0;
|
36 | try {
|
37 | chartData = analyzer.getChartData(bundleStats, opts.bundleDir);
|
38 | } catch (err) {
|
39 | console.error('Could\'t analyze webpack bundle:\n' + err);
|
40 | return;
|
41 | }
|
42 |
|
43 | var app = express();
|
44 |
|
45 | app.set('view engine', 'ejs');
|
46 | app.set('views', projectRoot + '/views');
|
47 | app.use(express.static(projectRoot + '/client'));
|
48 | app.use('/node_modules/filesize', express.static(require.resolve('filesize')));
|
49 |
|
50 | app.use('/', function (req, res) {
|
51 | res.render('viewer', {
|
52 | mode: 'server',
|
53 | chartData: JSON.stringify(chartData)
|
54 | });
|
55 | });
|
56 |
|
57 | return app.listen(opts.port, function () {
|
58 | var url = 'http://localhost:' + opts.port;
|
59 |
|
60 | console.log(bold('Webpack Bundle Analyzer') + ' is started at ' + bold(url) + '\n' + ('Use ' + bold('Ctrl+C') + ' to close it'));
|
61 |
|
62 | if (opts.openBrowser) {
|
63 | opener(url);
|
64 | }
|
65 | });
|
66 | }
|
67 |
|
68 | function generateReport(bundleStats, opts) {
|
69 | opts = _extends({
|
70 | openBrowser: true,
|
71 | reportFilename: 'report.html',
|
72 | bundleDir: null
|
73 | }, opts);
|
74 |
|
75 | var chartData = void 0;
|
76 | try {
|
77 | chartData = analyzer.getChartData(bundleStats, opts.bundleDir);
|
78 | } catch (err) {
|
79 | console.error('Could\'t analyze webpack bundle:\n' + err);
|
80 | return;
|
81 | }
|
82 |
|
83 | ejs.renderFile(projectRoot + '/views/viewer.ejs', {
|
84 | mode: 'static',
|
85 | chartData: JSON.stringify(chartData),
|
86 | assetContent: getAssetContent
|
87 | }, function (err, reportHtml) {
|
88 | if (err) return console.error(err);
|
89 |
|
90 | var reportFilepath = opts.reportFilename;
|
91 |
|
92 | if (!path.isAbsolute(reportFilepath)) {
|
93 | reportFilepath = path.resolve(opts.bundleDir || process.cwd(), reportFilepath);
|
94 | }
|
95 |
|
96 | mkdir.sync(path.dirname(reportFilepath));
|
97 | fs.writeFileSync(reportFilepath, reportHtml);
|
98 |
|
99 | console.log(bold('Webpack Bundle Analyzer') + ' saved report to ' + bold(reportFilepath) + '\n');
|
100 |
|
101 | if (opts.openBrowser) {
|
102 | opener('file://' + reportFilepath);
|
103 | }
|
104 | });
|
105 | }
|
106 |
|
107 | function getAssetContent(filename) {
|
108 | var filepath = void 0;
|
109 |
|
110 | if (_.startsWith(filename, 'node_modules/')) {
|
111 | filepath = require.resolve(filename.slice('node_modules/'.length));
|
112 | } else {
|
113 | filepath = projectRoot + '/client/' + filename;
|
114 | }
|
115 |
|
116 | return fs.readFileSync(filepath, 'utf8');
|
117 | } |
\ | No newline at end of file |