diff --git a/lib/optimizer.js b/lib/optimizer.js index 8e79901..705f510 100644 --- a/lib/optimizer.js +++ b/lib/optimizer.js @@ -82,11 +82,13 @@ const optimize = (compiler, [file, originalSource], compilation, opts, classGene compilation.updateAsset(file, source); }; -const optimizer = (compiler, compilation, opts) => (assets) => { +const optimizer = (opts) => { if (!opts.classNameRegExp) throw new Error("'classNameRegExp' option is required. e.g. '[c]-[a-z][a-zA-Z0-9_]*'"); const classGenerator = new ClassGenerator(); - Object.entries(assets).forEach((asset) => optimize(compiler, asset, compilation, opts, classGenerator)); - validate(opts, classGenerator); + return (compiler, compilation, assets) => { + Object.entries(assets).forEach((asset) => optimize(compiler, asset, compilation, opts, classGenerator)); + validate(opts, classGenerator); + }; } module.exports = optimizer; diff --git a/lib/plugin.js b/lib/plugin.js index 9eddcef..4ff37e6 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -1,9 +1,15 @@ const optimizer = require('./optimizer'); +let HtmlWebpackPlugin = null; +try { + HtmlWebpackPlugin = require('html-webpack-plugin'); +} catch { + // ignore +} -const runner = (compiler, compilation, opts) => { - const optimize = optimizer(compiler, compilation, opts); - return (chunks, callback) => { - optimize(chunks); +const runner = (opts) => { + const optimize = optimizer(opts); + return (compiler, compilation, chunks, callback) => { + optimize(compiler, compilation, chunks); callback(); }; } @@ -17,7 +23,18 @@ class Plugin { compiler.hooks.compilation.tap( 'MangleCssClassPluginHooks', (compilation) => { - compilation.hooks.processAssets.tapAsync('MangleCssClassPluginOptimizeChunkAssetsHooks', runner(compiler, compilation, this.opts)); + if (!this.fn) { + this.fn = runner(this.opts); + } + if (HtmlWebpackPlugin) { + HtmlWebpackPlugin.getHooks(compilation).afterEmit.tapAsync( + 'MangleCssClassPluginOptimizeChunkAssetsHooks', + (data, callback) => { + this.fn(compiler, compilation, { [data.outputName]: compilation.assets[data.outputName] }, callback); + }, + ); + } + compilation.hooks.processAssets.tapAsync('MangleCssClassPluginOptimizeChunkAssetsHooks', (chunks, callback) => this.fn(compiler, compilation, chunks, callback)); } ); }