写一个将输出压缩为 zip 包的插件。

    1. // ZipPlugin.js
    2. const JSZip = require('jszip');
    3. const path = require('path');
    4. const RawSource = require('webpack-sources').RawSource;
    5. const zip = new JSZip();
    6. module.exports = class ZipPlugin {
    7. constructor(options) {
    8. this.options = options;
    9. }
    10. apply(compiler) {
    11. compiler.hooks.emit.tapAsync('ZipPlugin', (compilation, cb) => {
    12. const folder = zip.folder(this.options.filename);
    13. for (let filename in compilation.assets) {
    14. // console.log('found', filename);
    15. const source = compilation.assets[filename].source();
    16. folder.file(filename, source);
    17. }
    18. zip.generateAsync({
    19. type: 'nodebuffer'
    20. }).then((content) => {
    21. const outputPath = path.join(
    22. '.',
    23. this.options.filename + '.zip'
    24. );
    25. console.log('output', outputPath);
    26. compilation.assets[outputPath] = new RawSource(content);
    27. cb();
    28. });
    29. });
    30. }
    31. }