// 为了兼容webpack hooks的新旧两种写法 // 旧版本: compilation.plugin('additional-assets',callback=>{}); // 新版本: compilation.hooks.additionalAssets.tapAsync('随意写的一个名字', callback=>{}); const { HOOKS } = require('./constant'); const { error } = require('./log'); // 将驼峰改写成连字符分隔的字符串 const camelToDash = camel => camel.replace(/([A-Z])/g, '-$1').toLowerCase(); const tapHook = (source, hookName, handler) => { if (source.hooks) { // 例如:compilation.hooks.additionalAssets.tapAsync('随意写的一个名字', callback=>{}); // additionalAssets const hook = source.hooks[hookName]; // 以防旧版本的webpack,不支持新版的hook if (!hook) { return; } // additionalAssets.tapAsync hook[HOOKS[hookName]]('build-statistics-webpack-plugin', handler); return; } const dashedHookName = camelToDash(hookName); try { // 使用旧版本的接口,暂时没有办法检查是否支持该hook,如果hook不存在会抛异常 source.plugin(dashedHookName, handler); } catch (err) { error('不支持名为 %s 的插件:%s', dashedHookName, err.stack); } }; module.exports = tapHook;