目标

用html-webpack-plugin来生成静态的页面,但是想知道每个静态页面有那些css和js文件,生成一个静态的配置文件。先把底下的文章都浏览了一遍。html-webpack-plugin本身也提供与webpack一致的插件钩子,所以这个插件把html-webpack-plugin就包含进来了。

代码

  1. const HtmlWebpackPlugin = require('html-webpack-plugin');
  2. class WebpackAssetsList {
  3. assets = {};
  4. filename = 'config.json';
  5. constructor (filename) {
  6. if (filename) {
  7. this.filename = filename;
  8. }
  9. }
  10. apply (compiler) {
  11. compiler.hooks.compilation.tap('WebpackAssetsList', (compilation) => {
  12. HtmlWebpackPlugin.getHooks(compilation).alterAssetTags.tapAsync(
  13. 'WebpackAssetsList',
  14. (data, cb) => {
  15. const outputName = data.outputName;
  16. const assetTags = data.assetTags;
  17. const item = {
  18. scripts: [],
  19. styles: []
  20. }
  21. assetTags.scripts.forEach(sub => {
  22. item.scripts.push(sub.attributes.src);
  23. })
  24. assetTags.styles.forEach(sub => {
  25. item.styles.push(sub.attributes.href);
  26. })
  27. this.assets[outputName] = item;
  28. // 往 compilation.assets 中添加清单文件
  29. const content = JSON.stringify(this.assets, null, 4);
  30. compilation.assets[this.filename] = {
  31. // 写入新文件的内容
  32. source: function () {
  33. return content;
  34. },
  35. // 新文件大小(给 webapck 输出展示用)
  36. size: function() {
  37. return content.length;
  38. }
  39. }
  40. cb(null, data);
  41. }
  42. )
  43. })
  44. }
  45. }
  46. module.exports = WebpackAssetsList

总结

网上找的图片,直观的理解一下:
TB1GVGFNXXXXXaTapXXXXXXXXXX-4436-4244.jpg
看起来插件也是一个方法,只是固定提供一个 apply 方法,通过wepack提供的生命周期的钩子函数来处理对应的内容。

参考文档: