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




目录
相关文章
|
前端开发 开发者
Webpack 插件底层的实现原理是什么?
Webpack 插件通过其插件系统扩展功能,满足不同构建需求。基于事件流模型,Webpack 在编译过程中触发多种事件(如 compile、make、emit、done),插件可监听并执行自定义逻辑。Webpack 使用 tapable 模块管理这些事件,提供 sync、async、promise 等钩子类型。开发者在配置文件中注册插件,通过 apply 方法初始化并注册所需钩子。插件生命周期与编译过程紧密相关,在不同阶段介入执行任务。例如,compilation 事件在每次编译开始时触发,emit 事件在生成输出文件前触发,done 事件在编译完成时触发。
|
缓存 前端开发 JavaScript
Webpack 打包的基本原理
【10月更文挑战第5天】
|
前端开发 UED
Webpack 中处理 CSS 和图片资源的多 Loader 配置
【10月更文挑战第12天】 处理 CSS 和图片资源是 Webpack 配置中的重要部分。通过合理选择和配置多个 Loader,可以实现对这些资源的精细处理和优化,提升项目的性能和用户体验。在实际应用中,需要不断探索和实践,根据项目的具体情况进行灵活调整和优化,以达到最佳的处理效果。通过对 Webpack 中多 Loader 处理 CSS 和图片资源的深入了解和掌握,你将能够更好地应对各种复杂的资源处理需求,为项目的成功构建和运行提供坚实的基础。
431 58
|
测试技术 开发者
如何确保 Webpack plugin 与其他插件的兼容性?
【10月更文挑战第23天】确保 Webpack plugin 与其他插件的兼容性需要从多个方面进行考虑和努力。通过遵循规范、进行充分测试、保持沟通协作等方式,
|
监控 前端开发 JavaScript
Webpack 中 HMR 插件的工作原理
【10月更文挑战第23天】可以进一步深入探讨 HMR 工作原理的具体细节、不同场景下的应用案例,以及与其他相关技术的结合应用等方面的内容。通过全面、系统地了解 HMR 插件的工作原理,能够更好地利用这一功能,为项目的成功开发提供有力保障。同时,要不断关注技术的发展动态,以便及时掌握最新的 HMR 技术和最佳实践。
|
缓存 前端开发 JavaScript
Webpack 动态加载的原理
【10月更文挑战第23天】Webpack 动态加载通过巧妙的机制和策略,实现了模块的按需加载和高效运行,提升了应用程序的性能和用户体验。同时,它也为前端开发提供了更大的灵活性和可扩展性,适应了不断变化的业务需求和技术发展。
|
缓存 监控
webpack 提高构建速度的方式
【10月更文挑战第23天】需要根据项目的具体情况和需求,综合运用这些方法,不断进行优化和改进,以达到最佳的构建速度和效果。同时,随着项目的发展和变化,还需要持续关注和调整构建速度的相关措施,以适应不断变化的需求。
|
存储 缓存 前端开发
利用 Webpack 5 的持久化缓存来提高构建效率
【10月更文挑战第23天】利用 Webpack 5 的持久化缓存是提高构建效率的有效手段。通过合理的配置和管理,我们可以充分发挥缓存的优势,为项目的构建和开发带来更大的便利和效率提升。你可以根据项目的实际情况,结合以上步骤和方法,进一步优化和完善利用持久化缓存的策略,以达到最佳的构建效果。同时,不断探索和实践新的方法和技术,以适应不断变化的前端开发环境和需求。
|
缓存 前端开发 JavaScript
webpack 原理
【10月更文挑战第23天】Webpack 原理是一个复杂但又非常重要的体系。它通过模块解析、依赖管理、加载器和插件的协作,实现了对各种模块的高效打包和处理,为现代前端项目的开发和部署提供了强大的支持。同时,通过代码分割、按需加载、热模块替换等功能,提升了应用程序的性能和用户体验。随着前端技术的不断发展,Webpack 也在不断演进和完善,以适应不断变化的需求和挑战。
|
移动开发 JavaScript 前端开发
webpack学习四:使用webpack配置plugin,来使用HtmlWebpackPlugin、uglifyjs-webpack-plugin、webpack-dev-server等插件简化开发
这篇文章主要介绍了如何通过配置Webpack的插件,如HtmlWebpackPlugin、uglifyjs-webpack-plugin和webpack-dev-server,来简化前端开发流程。
622 0
webpack学习四:使用webpack配置plugin,来使用HtmlWebpackPlugin、uglifyjs-webpack-plugin、webpack-dev-server等插件简化开发