【Egret插件】JSZip-ZipPlugin踩坑记

本文详细介绍了如何在Egret项目中使用ZipPlugin压缩资源,减少加载次数与传输量,并利用JSZip读取.zip文件中的图片与配置。通过实例演示了常见错误的解决方案及升级至JSZip 3.0的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在 Egret 项目中,发布的时候可以使用 压缩插件将资源(图片,配置文件等)压缩成一个 .zip 文件,然后使用JSZip读取 .zip 文件的内容。


测试环境


Cross-zip安装/ZipPlugin设置压缩规则

使用ZipPlugin把文件压缩成zip格式

为了减少加载次数和传输量,我们可以把文件压缩成zip格式,使用的时候可以使用第三方库JSZip来读取使用zip文件。

使用ZipPlugin插件之前,需要安装cross-zip 和 cross-zip-cli , 在终端中输入:

    //全局安装
    npm install cross-zip -g  
    npm install cross-zip-cli -g

安装完成之后,在config.wxgame.ts添加代码:

new ZipPlugin({
    mergeSelector: p => {
        // 如果文件是assets/路径下的, 压缩到assets.zip
        if (p.indexOf("assets/") >= 0) {
            return "assets.zip"
        }
    }
})

参考的这里:使用Egret插件压缩代码包体积,减少请求数量的实战教程


按照Egret-第三方库的使用方法导入JSZip后发布微信小程序遇到以下问题:

错误1 t.createElementNS is not a function

  • 修改:webapp-adapter.js,增加一个方法(我用这个没生效)

    createElementNS: function createElementNS(nameSpace, tagName) {
      return this.createElement(tagName)
    }
    
  • 看日志可以得知,createElementNS 不被支持,那么我们可以将所有 createElementNS 改为 createElement。

    document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
    // 改为 ==>
    document.createElement( 'canvas' );
    

错误2 ReferenceError: JSZip is not defined

这个是微信里面不认window[xxx]的原因

修改jszip.js开头部分为

!function (a) { if ("object" == typeof exports && "undefined" != typeof module){
   window.JSZip = a();
   module.exports = a();
}

错误3  VM9492:1 Error: The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.

VM9492:1 Error: The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.
    at n (jszip.min.js? [sm]:1)
    at main.min.js:5
    at assetsmanager.min.js? [sm]:1
    at <anonymous>

解决办法:
Upgrade Guide From 2.x to 3.0.0
https://stuk.github.io/jszip/documentation/upgrade_guide.html

使用3.0版本的语法:

Egret-JSZip库说明-http://developer.egret.com/cn/github/egret-docs/extension/jszip/jszip/index.html

  • 读取zip文件
    首先将 .zip 文件配置到default.res.json中,便于后面读取使用。

    // 使用res获取到zip文件
    RES.getResAsync('xx_zip').then((data) => {
        // 解压,读取
        JSZip.loadAsync(data)
        //  do something ...
    })
    
  • 加载json

    RES.getResAsync('json_zip').then((data) => {
        // 解压,读取
        JSZip.loadAsync(data).then((zipdata) => {
            return zipdata.file('xxx.json').async('text')
        }).then(text => {
            let jsonData = JSON.parse(text)
            console.log(jsonData)
        })
    })
    
  • 加载图片

    RES.getResAsync('img_zip').then((data) => {
        // 解压,读取
        JSZip.loadAsync(data).then((zipdata) => {
            // 把数据解析为base64
            return zipdata.file('img/xxx.jpg').async('base64')
        }).then(base64 => {
            base64 = "data:image/png;base64," + base64
            var img: eui.Image = new eui.Image();
            img.source = base64;
            this.addChild(img);
        })
    })
    
  • 生成zip文件

    var zip = new JSZip();
    zip.file("Hello.txt", "Hello World\n");
    // 创建images文件夹
    var img = zip.folder("images");
    // 二进制数据
    var imgData = "R0lGODdhBQAFAIACAAAAAP/eACwAAAAABQAFAAACCIwPkWerClIBADs=";
    img.file("smile.gif", imgData, { base64: true });
    zip.generateAsync({ type: "blob" }).then((blob) => {
        saveAs(blob, "example.zip")
    })
    

其他

  • Cross-zip压缩率实测下来不太好,3M左右的Json文件压缩结果460K,直接使用Winrar是330K,使用7z结果是230k,7z压缩可以参考我的另一篇文章:7Z-Bat调用7z压缩所有文件

  • 调用微信缓存资源超出限制,这个和JSZip就没关系了,接下来再探讨。
    fs.setFsCache(fullname, 1);

saveFile:fail the maximum size of the file storage limit is exceeded


参考

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值