当前位置: 首页 > news >正文

webpack原理篇(六十五):实战开发一个压缩构建资源为zip包的插件

说明

玩转 webpack 学习笔记

要求

  • 生成的 zip 包文件名称可以通过插件传入
  • 需要使用 compiler 对象上的特地 hooks 进行资源的生成

Node.js 里面将文件压缩为 zip 包

使用 jszip:https://github.com/Stuk/jszip

在这里插入图片描述

jszip 使用示例

var zip = new JSZip();
zip.file("Hello.txt", "Hello World\n");
var img = zip.folder("images");
img.file("smile.gif", imgData, { base64: true });
zip.generateAsync({ type: "blob" }).then(function (content) {
    // see FileSaver.js
    saveAs(content, "example.zip");
});

Compiler 上负责文件生成的 hooks

Hooks 是 emit,是一个异步的 hook (AsyncSeriesHook),emit 生成文件阶段,读取的是 compilation.assets 对象的值

  • 可以将 zip 资源包设置到 compilation.assets 对象上

实战

1、复制上次的 my-plugin 文件夹

复制一下上次的插件环境,修改一下名称为 zip-plugin 相关的名称

在这里插入图片描述

2、安装 jszip 依赖

npm i jszip -S

在这里插入图片描述

3、编写 zip-plugin.js

const JSzip = require('jszip');
const zip = new JSzip();
const path = require('path');
const RawSource = require('webpack-sources').RawSource;

class ZipPlugin {
    constructor(options) {
        this.options = options;
    }
    apply(compiler) {
        // emit 是异步的,这里需要使用 tapAsync
        compiler.hooks.emit.tapAsync('ZipPlugin', (compilation, callback) => {
            // 创建一个目录,读取传参 filename
            const folder = zip.folder(this.options.filename);

            for (let filename in compilation.assets) {
                // 打印的是 RawSource
                console.log(compilation.assets[filename]);
                const source = compilation.assets[filename].source();
                console.log('source---->', source);
                // 把内容添加到 folder
                folder.file(filename, source);
            }
            // 生成 zip
            zip.generateAsync({
                type: 'nodebuffer'
            }).then(content => {
                console.log('content---->', content);
                console.log('compilation.options--->', compilation.options);
                // 绝对路径
                const outputPath = path.join(
                    compilation.options.output.path,
                    this.options.filename + '.zip'
                )
                console.log("绝对路径--->", outputPath);
                // 相对路径
                const outputRelativePath = path.relative(
                    compilation.options.output.path,
                    outputPath
                );
                console.log("相对路径--->", outputRelativePath);
                // 将内容挂载到assets上面去 使用 RawSource 将 buffer 转为 source
                compilation.assets[outputRelativePath] = new RawSource(content);
                // 执行 callback
                callback();
            })
        })
    }
}
module.exports = ZipPlugin;

compilation.assets[filename]
在这里插入图片描述
source
在这里插入图片描述
content
在这里插入图片描述
compilation.options
在这里插入图片描述

4、打包测试

执行 webpack

在这里插入图片描述
我们可以解压一下这个文件,发现是 ok 的。

在这里插入图片描述

相关文章:

  • 数学建模学习(97):花授粉算法(FPA)寻优
  • 鲈鱼的面试题库+答案
  • CREO:CREO软件之零件【工具(调查/模型意图/实用工具)】、【视图(可见性/方向/模型显示/显示/窗口)】的简介及其使用方法(图文教程)之详细攻略
  • 【单细胞高级绘图】09.细胞通讯_两组比较_连线图
  • Tensorflow笔记——基于Mnist数据集图片分类的神经网络
  • 情侣积分微信小程序零基础开发教程(附代码及开发指南)
  • 为什么重写equals方法必须也要重写hashCode方法
  • 只要十分钟!带你了解Redis Cluster
  • CREO:CREO软件之零件【造型】样式栏之操作、平面、曲线、曲面、分析、优先选项的简介及其使用方法(图文教程)之详细攻略
  • app毕业设计开题报告基于Uniapp实现的美食餐厅订单点餐APP
  • 基于51单片机十字路口交通灯_5s黄灯闪烁
  • Java并发 | 13.[设计模式] 两阶段终止线程
  • 一次服务器被入侵的处理过程分享
  • Java并发 | 11.[方法] join( )和join( long m )等待线程执行完毕
  • es重启临时关闭自动分片
  • 【译】JS基础算法脚本:字符串结尾
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • AHK 中 = 和 == 等比较运算符的用法
  • CSS 提示工具(Tooltip)
  • E-HPC支持多队列管理和自动伸缩
  • Java读取Properties文件的六种方法
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • oschina
  • vue-cli在webpack的配置文件探究
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从输入URL到页面加载发生了什么
  • 高度不固定时垂直居中
  • 排序(1):冒泡排序
  • 区块链将重新定义世界
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 学习使用ExpressJS 4.0中的新Router
  • 原生JS动态加载JS、CSS文件及代码脚本
  • ​iOS安全加固方法及实现
  • (2)(2.10) LTM telemetry
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (多级缓存)缓存同步
  • (算法)N皇后问题
  • (转)大道至简,职场上做人做事做管理
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET 8.0 发布到 IIS
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 发展历程
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • /bin/bash^M: bad interpreter: No such file or directory
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [APUE]进程关系(下)
  • [BZOJ 1040] 骑士
  • [bzoj 3124][sdoi 2013 省选] 直径
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [codeforces] 25E Test || hash