BundleAnalyzerPlugin.js
3.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
'use strict';
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; };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var fs = require('fs');
var path = require('path');
var mkdir = require('mkdirp');
var _require = require('chalk'),
bold = _require.bold;
var Logger = require('./Logger');
var viewer = require('./viewer');
var BundleAnalyzerPlugin = function () {
function BundleAnalyzerPlugin(opts) {
_classCallCheck(this, BundleAnalyzerPlugin);
this.opts = _extends({
analyzerMode: 'server',
analyzerHost: '127.0.0.1',
analyzerPort: 8888,
reportFilename: 'report.html',
openAnalyzer: true,
generateStatsFile: false,
statsFilename: 'stats.json',
statsOptions: null,
logLevel: 'info',
// deprecated
startAnalyzer: true
}, opts);
this.logger = new Logger(this.opts.logLevel);
}
BundleAnalyzerPlugin.prototype.apply = function apply(compiler) {
var _this = this;
this.compiler = compiler;
compiler.plugin('done', function (stats) {
stats = stats.toJson(_this.opts.statsOptions);
var actions = [];
if (_this.opts.generateStatsFile) {
actions.push(function () {
return _this.generateStatsFile(stats);
});
}
// Handling deprecated `startAnalyzer` flag
if (_this.opts.analyzerMode === 'server' && !_this.opts.startAnalyzer) {
_this.opts.analyzerMode = 'disabled';
}
if (_this.opts.analyzerMode === 'server') {
actions.push(function () {
return _this.startAnalyzerServer(stats);
});
} else if (_this.opts.analyzerMode === 'static') {
actions.push(function () {
return _this.generateStaticReport(stats);
});
}
if (actions.length) {
// Making analyzer logs to be after all webpack logs in the console
setImmediate(function () {
actions.forEach(function (action) {
return action();
});
});
}
});
};
BundleAnalyzerPlugin.prototype.generateStatsFile = function generateStatsFile(stats) {
var statsFilepath = this.opts.statsFilename;
if (!path.isAbsolute(statsFilepath)) {
statsFilepath = path.resolve(this.compiler.outputPath, statsFilepath);
}
mkdir.sync(path.dirname(statsFilepath));
fs.writeFileSync(statsFilepath, JSON.stringify(stats, null, 2));
this.logger.info(bold('Webpack Bundle Analyzer') + ' saved stats file to ' + bold(statsFilepath));
};
BundleAnalyzerPlugin.prototype.startAnalyzerServer = function startAnalyzerServer(stats) {
viewer.startServer(stats, {
openBrowser: this.opts.openAnalyzer,
host: this.opts.analyzerHost,
port: this.opts.analyzerPort,
bundleDir: this.compiler.outputPath,
logger: this.logger
});
};
BundleAnalyzerPlugin.prototype.generateStaticReport = function generateStaticReport(stats) {
viewer.generateReport(stats, {
openBrowser: this.opts.openAnalyzer,
reportFilename: this.opts.reportFilename,
bundleDir: this.compiler.outputPath,
logger: this.logger
});
};
return BundleAnalyzerPlugin;
}();
module.exports = BundleAnalyzerPlugin;