build-time-analysis-webpack-plugin
Version:
A webpack plugin that output the build time file by file as a JSON format with filters
97 lines (85 loc) • 2.51 kB
JavaScript
const fs = require('fs');
const pluginName = 'ModuleBuildTimeCalWebpackPlugin';
const NOOL = () => { };
class ModuleBuildTimeCalWebpackPlugin {
constructor(options = {}) {
/**
* OPTIONS FORMAT
* const options = {
* filename: 'modules.json',
* includeNodeModules: false,
* callback: () => {},
* }
*/
this.options = options;
this.modules = {};
// console.log('Plugin options', this.options);
}
handleFinishModules() {
const {
callback = NOOL,
filename = 'modules.json',
} = this.options;
try {
const data = JSON.stringify(this.modules);
const writeToFilePath = `${process.cwd()}/${filename}}`;
/**
* OUTPUT FORMAT
* modules.json = {
* 'src/index.js': {
* name: 'src/index.js',
* start: 1,
* end: 4,
* time: 3,
* loaders: [ ... ]
* },
* ...
* }
*/
fs.writeFile(writeToFilePath, data, 'utf8', callback);
} catch (e) {
console.error(`[${pluginName} ERROR]: `, e);
}
}
handleBuildModule(module) {
const { userRequest, loaders } = module;
const { includeNodeModules } = this.options;
const rawRequest = userRequest.replace(process.cwd(), '');
if (includeNodeModules || !rawRequest.includes('node_modules')) {
this.modules[rawRequest] = {
start: (new Date()).getTime(),
loaders,
name: rawRequest,
};
}
}
handleSucceedModule(module) {
const { userRequest, loaders } = module;
const { includeNodeModules } = this.options;
const rawRequest = userRequest.replace(process.cwd(), '');
if (includeNodeModules || !rawRequest.includes('node_modules')) {
this.modules[rawRequest].end = (new Date()).getTime();
const spend = this.modules[rawRequest].end - this.modules[rawRequest].start;
this.modules[rawRequest].time = spend;
}
}
apply(compiler) {
compiler.hooks.compilation.tap(
pluginName,
compilation => {
compilation.hooks.buildModule.tap(
pluginName,
this.handleBuildModule.bind(this)
);
compilation.hooks.succeedModule.tap(
pluginName,
this.handleSucceedModule.bind(this));
compilation.hooks.finishModules.tap(
pluginName,
this.handleFinishModules.bind(this)
);
}
);
}
}
module.exports = ModuleBuildTimeCalWebpackPlugin;