const HtmlWebpackPlugin = require('html-webpack-plugin'); class GroupAssetsPlugin { apply(compiler) { compiler.hooks.compilation.tap('GroupAssetsPlugin', (compilation) => { HtmlWebpackPlugin.getHooks(compilation).alterAssetTagGroups.tapAsync( 'GroupAssetsPlugin', (data, callback) => { this.groupAssets(data); console.log('grouped', data); callback(null, data); } ); }); } groupAssets(data) { const { injectTo } = data.plugin.options; if (typeof injectTo === 'function') { const groups = { head: [], body: [] }; [ ['head', data.headTags], ['body', data.bodyTags], ].forEach(([defaultGroup, items]) => { items.forEach(item => { const groupName = injectTo(item, defaultGroup); const group = groups[groupName] || groups[defaultGroup]; group.push(item); }); }); data.headTags = groups.head; data.bodyTags = groups.body; } } } module.exports = GroupAssetsPlugin;