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

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

说明

玩转 webpack 学习笔记



要求

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



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

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

2d2818c3db7043529ca1f682ca45cd9e.png


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 相关的名称


98244804b8d1461dac4737f6dcb47004.png


2、安装 jszip 依赖

npm i jszip -S


4ba1f89a38434ab5bd81288ee533afa0.png


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]

f33a904f3c4a46c49c01eb7d57a0600e.png

source

36d22737ba6a49c7b4007a5db6c223f6.png

content

ac34681ad65048c4867a40e816e0a669.png

compilation.options


51a710baee334baca8d0380a98a098a7.png



4、打包测试

执行 webpack

8048a301ce584b09b608dd8fd1be22ea.png


我们可以解压一下这个文件,发现是 ok 的。


af187ef4eeae4a6aab9240be5a318f41.png




目录
相关文章
|
13天前
|
缓存 JavaScript 前端开发
探讨如何通过一系列优化策略来提升TypeScript与Webpack的构建性能。
【6月更文挑战第11天】本文探讨了优化TypeScript与Webpack构建性能的策略。理解Webpack的解析、构建和生成阶段是关键。优化包括:调整tsconfig.json(如关闭不必要的类型检查)和webpack.config.js选项,启用Webpack缓存,实现增量构建,代码拆分和懒加载。通过这些方法,可以提升构建速度,提高开发效率。
48 0
|
12天前
|
缓存 前端开发 JavaScript
Webpack作为模块打包器,为前端项目提供了高度灵活和可配置的构建流程
【6月更文挑战第12天】本文探讨了优化TypeScript与Webpack构建性能的策略。理解Webpack的解析、构建和生成阶段是关键。优化包括:调整tsconfig.json(如关闭不必要的类型检查)和webpack.config.js选项,启用Webpack缓存,实现增量构建,代码拆分和懒加载。这些方法能提升构建速度,提高开发效率。
30 3
|
1月前
|
API 开发工具 开发者
webpack热更新原理
Webpack的Hot Module Replacement(HMR)提升开发效率,无需刷新页面即可更新模块。开启HMR需在配置中设`devServer.hot: true`。Webpack构建时插入HMR Runtime,通过WebSocket监听并处理文件变化。当模块改变,Webpack发送更新到浏览器,HMR Runtime找到对应模块进行热替换,保持应用状态。开发者可利用`module.hot` API处理热替换逻辑。
|
1月前
|
前端开发
【专栏】`webpack` 的 `DefinePlugin` 插件用于在编译时动态定义全局变量,实现环境变量差异化、配置参数动态化和条件编译
【4月更文挑战第29天】`webpack` 的 `DefinePlugin` 插件用于在编译时动态定义全局变量,实现环境变量差异化、配置参数动态化和条件编译。通过配置键值对,如 `ENV: JSON.stringify(process.env.NODE_ENV)`,可以在代码中根据环境执行相应逻辑。实际应用包括动态加载资源、动态配置接口地址和条件编译优化代码。注意变量定义的合法性和避免覆盖,解决变量未定义或值错误的问题,以提升开发效率和项目质量。
|
1月前
|
前端开发 测试技术 开发者
深入理解 Webpack 热更新原理:提升开发效率的关键
深入理解 Webpack 热更新原理:提升开发效率的关键
|
1月前
|
缓存 JavaScript 前端开发
【TypeScript技术专栏】TypeScript与Webpack构建优化
【4月更文挑战第30天】本文探讨了优化TypeScript与Webpack构建性能的策略。理解Webpack的解析、构建和生成阶段是关键。优化包括:调整tsconfig.json(关闭不必要的类型检查,适配目标环境)和webpack.config.js(配置entry、output、resolve,使用压缩插件)。启用Webpack缓存和增量构建,利用代码拆分与懒加载,能有效提升构建速度和开发效率。
|
1月前
|
缓存 前端开发 算法
Webpack 进阶:深入理解其工作原理与优化策略
Webpack 进阶:深入理解其工作原理与优化策略
70 2
|
1月前
|
缓存 前端开发 JavaScript
|
1月前
|
前端开发 JavaScript 开发者
webpack打包机制,构建过程和配置
webpack打包机制,构建过程和配置
24 0
|
1月前
|
JSON JavaScript 前端开发
对webpack的理解——打包样式资源
对webpack的理解——打包样式资源
28 0