const { Compilation } = require('webpack');
class MyPlugin {
// apply是webpack官方规定的具名钩子
// compiler.hooks 是webpack透出的很多hooks 可自行查看webpack官网对hooks的解释说明
apply(compiler) {
// = =,当时的情况是这样的,我打不开中文版,所以给个官网的英文解释吧!!!
// thisCompilation:Executed while initializing the compilation, right before emitting the compilation event. This hook is not copied to child compilers.
compiler.hooks.thisCompilation.tap('MyPlugin', (compilation) => {
// compilation => 打包的上下文
compilation.hooks.processAssets.tap({
name: 'MyPlugin',
stage: Compilation.PROCESS_ASSETS_STAGE_ADDITIONS, // see below for more stages,
},
(assets) => {
console.log('List of assets and their sizes:');
Object.entries(assets).forEach(([pathname, source]) => {
console.log(`— ${pathname}: ${source.size()} bytes`);
if (pathname.endsWith('.js')) {
const withoutComments = source
.source()
.replace(/\/\*\*+\*\//g, ''); // 将打包的js文件中注释去掉
// 处理打包的对应文件后将新的内容透出
compilation.assets[pathname] = {
source: () => withoutComments, // *文件资源
size: () => withoutComments.length, // *文件大小
};
}
});
})
})
}
}
// 第二种方案 这个打包webpack会报warning,提示使用上面的方案
class MyPlugin {
// apply是webpack官方规定的具名钩子
// compiler.hooks 是webpack透出的很多hooks 可自行查看webpack官网对hooks的解释说明
apply(compiler) {
// = =,当时的情况是这样的,我打不开中文版,所以给个官网的英文解释吧!!!
// emit:Executed right before emitting assets to output dir. This hook is not copied to child compilers.
compiler.hooks.emit.tap('MyPlugin', (compilation) => {
// compilation => 打包的上下文
for (let name in compilation.assets) {
// console.log(name); // 文件名
// console.log(compilation.assets[name].source()); // 文件资源
if (name.endsWith('.js')) {
const contents = compilation.assets[name].source();
const withoutComments = contents.replace(/\/\*\*+\*\//g, '');
compilation.assets[name] = {
source: () => withoutComments,
size: () => withoutComments.length,
};
}
}
}
}
}
// 在webpack plugins中配置
plugins: [
new MyPlugin(),
]
封装webpack插件demo,去除bundle.js的注释内容
最新推荐文章于 2024-04-24 15:26:31 发布