应用zip压缩的javascript以及Egret H5游戏实战

代码地址如下:<br>http://www.demodashi.com/demo/11039.html

主要起因是策划对最快进入登录界面有硬性要求(3秒),那么最开始加载的文件越小越好。对H5的游戏程序进行压缩,可以大大缩小应用程序的加载时间。

本文主要有两个主题:

  • 普通的javascript代码解压使用
  • 实际Egret游戏项目的javascript代码解压使用

对实战感兴趣的朋友可以直接看后面的Egret部分,前面只是基础原理的入门版

一、js代码压缩效果

先看看压缩和没压缩之间的对比

可以看到egret引擎的文件没压缩之前有400~500k这样,压缩之后只有100kb了。

再看看实际项目的文件:

原来main.min.js文件有2.3MB,压缩之后的main.min.js.cf(zip)文件只有441.9KB了。

使用jszip进行解压

  1. jszip的下载地址:http://stuk.github.io/jszip/
  2. jszip的基础教程:如何使用JSZip(How to use JSZip)

字符串变script脚本的方法

1、eval

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

eval("console.log(1000)");

不过实际要执行项目代码,得改变运行环境,这样可以避免一些因为环境变量引起的问题。

//运行环境指定window这个顶级对象
eval.call(window,text);

2、script元素

动态创建,使用document.createElement("script")方法。实际项目推荐使用这个方法。

var script = document.createElement(‘script‘);
script.setAttribute(‘type‘, ‘text/javascript‘);
script.text = text;
document.body.appendChild(script);

JavaScrip脚本压缩

这里是简单的测试脚本,压缩后为ZipScript.zip

//声明变量
var msg = "test zip script";
//定义main函数
function main()
{
    console.log("start main");
    console.log(msg);
}
main();

jszip3.0加载简单的javascript的zip文件

这里采用最新的jszip,所以用法可能会和老的有一点点不一样

  1. XMLHttpRequest加载zip文件
    主要设置XMLHttpRequest的responseType属性
var xhrZip = new XMLHttpRequest();
xhrZip.responseType = "arraybuffer";

使用JSZipUtils工具

使用这个工具类更加简单

JSZipUtils.getBinaryContent(‘ZipScript.zip‘, function(err, data) {
    if(err) {
        throw err; // or handle err
    }
    console.log("JSZipUtils加载处理");
});

JavaScript使用Jszip的完整测试代码

自己可以去把//xhrZip.send(null);注释去掉来跑两种不同的情况

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jszip.js"></script>
    <script src="jszip-utils.js"></script>
</head>
    <script>

        var xhrZip = new XMLHttpRequest();
        xhrZip.open(‘GET‘, ‘ZipScript.zip?v=‘ + Math.random(), true);
        xhrZip.responseType = "arraybuffer";
        xhrZip.addEventListener("load", function (evt)
        {
            console.log("XMLHttpRequest加载处理");
            jszipParse(xhrZip.response);
        });
        //开启XMLHttpRequest加载二进制数据的方法
        //xhrZip.send(null);

        //使用jsziputils工具包加载zip
        JSZipUtils.getBinaryContent(‘ZipScript.zip‘, function(err, data) {
            if(err) {
                throw err; // or handle err
            }
            console.log("JSZipUtils加载处理");
            jszipParse(data);
        });
        //jszip解析zip文件,并转换为javascript脚本运行
        function jszipParse(data)
        {
            JSZip.loadAsync(data).then(function (zip) {
                return zip.file("ZipScript.js").async("string");
            }).then(function (text)
            {
                console.log("使用document.createElement");
                addScript(text);
                //使用eval
                console.log("使用eval方法");
                eval(text);
            });
        }
        //使用document创建javascript脚本
        function addScript(text)
        {
            var script = document.createElement(‘script‘);
            script.setAttribute(‘type‘, ‘text/javascript‘);
            script.text = text;
            document.body.appendChild(script);
            document.body.removeChild(script);
        }
    </script>
</body>
</html>

二、实战Egret项目压缩JavaScript脚本

有人可能会觉得简单脚本没问题,那么这里就从实际的Egret项目做演示成果了。

创建基础的Egret 项目

创建一个具备Egret UI的效果可以看到效果(比如game)
egretProperties.json配置:

"modules": [
    {
      "name": "egret"
    },
    {
      "name": "res"
    },
    {
      "name": "tween"
    },
    {
      "name": "promise",
      "path": "./promise"
    }

egret代码变成zip(后缀该为cfg)步骤

  1. 发布egret项目代码生成,main.min.js文件
  2. 压缩egret引擎代码和main.min.js
egret.min.js、egret.web.min.js、res.min.js、tween.min.js、main.min.js

压缩egret.zip文件。main.min.js压缩为main.min.js.zip

注意,实际项目中,egret引擎和项目的main的js文件应该分开压成zip,因为引擎代码几乎步变,项目代码经常变动,以后可以只热更项目代码,不动引擎代码zip。

  1. 使用的是老版的jszip,因为比较小(70多KB,api会稍微有点不同)
  2. 例子是分别使用IntelliJ IDEA和Egret Wing这两个IDE跑的(Egret5.01)
  3. 压缩文件zip的后缀修改为cfg,主要是zip可能会被下载软件给拦截了。

部署加载zip文件的indexZip.html

  • 修改项目的index.html为的indexZip.html文件(也可以直接用index.html修改),这里做了简化,直接加载egret.zip和main.min.js.zip。
  • 实际项目中尽量少加载文件,则采用XMLHttpRequest,加载zip文件这里和前面的解压js的代码一样。这里重点介绍解压egret的代码,后面会给出完整的代码以及代码工程。
  • 加载和解压egret以及main压缩文件的代码
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <title>Egret</title>
    <meta name="viewport" content="width=device-width,initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no" />
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <meta name="full-screen" content="true" />
    <meta name="screen-orientation" content="portrait" />
    <meta name="x5-fullscreen" content="true" />
    <meta name="360-fullscreen" content="true" />
    <style>
        html, body {
            -ms-touch-action: none;
            background: #888888;
            padding: 0;
            border: 0;
            margin: 0;
            height: 100%;
        }
    </style>
    <script egret="libs" src="libs/jszip/jszip.min.js"></script>
</head>

<body>
<div style="margin: auto;width: 100%;height: 100%;" class="egret-player"
     data-entry-class="Main"
     data-orientation="auto"
     data-scale-mode="showAll"
     data-frame-rate="30"
     data-content-width="640"
     data-content-height="1136"
     data-show-paint-rect="false"
     data-multi-fingered="2"
     data-show-fps="false" data-show-log="false"
     data-show-fps-style="x:0,y:0,size:12,textColor:0xffffff,bgAlpha:0.9">
</div>
<script>
    //加载egret的引擎库
    try
    {
        loadZip("egret.cfg",function(zip)
        {
            //压缩进的egret引擎的各个代码文件
            var files = ["egret.min.js", "egret.web.min.js", "res.min.js", "tween.min.js", "promise.min.js"];
            for (var i = 0; i < files.length; i++)
            {
                createScript(zip,files[i]);
            }
            //加载游戏代码
            loadZip("main.min.js.cfg" + "?v=" + Math.random(),function(zip)
            {
                createScript(zip,"main.min.js");
                //全部加载完成,启动egret游戏
                egret.runEgret({ renderMode: "webgl", audioType: 0,retina:true});
            });
        });
    }
    catch (e)
    {
        //压缩失败,实际项目这里需要改为加载没压缩的js文件。
        console.error("jszip解压文件报错,进行普通文件加载");
    }
    //加载单个zip文件,成功后进行回调
    function loadZip(url,callBack)
    {
        var xhrZip = new XMLHttpRequest();
        xhrZip.open("GET", url, true);
        xhrZip.responseType = "arraybuffer";
        xhrZip.addEventListener("load", function (oEvent)
        {
            var arrayBuffer = xhrZip.response; // 注意:不是oReq.responseText
            if (!arrayBuffer)
            {
                console.log(url + "解析异常:" + xhrZip);
                throw new Error("zip异常");
            }
            callBack(new JSZip(arrayBuffer));
        });
        xhrZip.send(null);
    }
    function createScript(zip,file)
    {
        //解压出来变成script脚本
        var text = zip.file(file).asText();
        var script = document.createElement("script");
        script.setAttribute("type", "text/javascript");
        script.text = text;
        document.body.appendChild(script);
        document.body.removeChild(script);
    }
</script>
</body>

</html>

最终的运行效果,和没有压缩egret代码的效果是一样的。

源码包文件夹截图

1、第一层文件夹截图:

2、JSZipExample文件夹截图:

3、ZipEgretGame文件夹截图:
应用zip压缩的javascript以及Egret H5游戏实战

代码地址如下:<br>http://www.demodashi.com/demo/11039.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

原文地址:http://blog.51cto.com/13209204/2287415

时间: 2024-11-09 17:21:58

应用zip压缩的javascript以及Egret H5游戏实战的相关文章

Zip 压缩、解压技术在 HTML5 浏览器中的应用

JSZip 是一款可以创建.读取.修改 .zip 文件的 javaScript 工具.在 web 应用中,免不了需要从 web 服务器中获取资源,如果可以将所有的资源都合并到一个 .zip 文件中,这时候只需要做一次请求,这样既减少了服务器的压力,同时也可以加快 web 应用的呈现速度. 今天就来探讨下 JSZip 如何与 HT 拓扑应用结合.先来看看这期 Demo 的效果图: 第一步.需要将应用对相关资源打包成 .zip 文件, 这是我要压缩的文件列表,把响应的资源文件存放到对应的文件夹下,然

Zip 压缩和解压技术在 HTML5 中的应用

JSZip 是一款可以创建.读取.修改 .zip 文件的 javaScript 工具.在 web 应用中,免不了需要从 web 服务器中获取资源,如果可以将所有的资源都合并到一个 .zip 文件中,这时候只需要做一次请求,这样既减少了服务器的压力,同时也可以加快 web 应用的呈现速度. 今天就来探讨下 JSZip 如何与 HT 应用结合.先来看看这期 Demo 的效果图: 第一步.需要将应用对相关资源打包成 .zip 文件, 这是我要压缩的文件列表,把响应的资源文件存放到对应的文件夹下,然后在

最新Zip压缩文件漏洞,黑客可以触发目录遍历攻击

近日,国内某安全公司研究人员透露了一个关键漏洞的详细信息,该漏洞影响了许多生态系统中的数千个项目,黑客可以利用这些漏洞在目标系统上实现代码执行. 黑客是如何通过Zip压缩文件入侵攻击?被称为"ZipSlip"的问题是一个任意的文件覆盖漏洞,在从档案文件中提取文件时触发目录遍历攻击,并影响包括tar,jar,war,cpio,apk,rar和7z在内的大量压缩文件. 用Google,Oracle,IBM,Apache,亚马逊,Spring/Pivotal,Linkedin,Twitter

java基础----&gt;Zip压缩的使用(转)

java中提供了对压缩格式的数据流的读写.它们封装到现成的IO 类中,以提供压缩功能.下面我们开始java中压缩文件的使用. 目录导航: 关于压缩的简要说明 GZIP压缩文件的使用 ZIP压缩文件的使用 GZIP与ZIP压缩的比较 友情链接 关于压缩的简要说明 一. Java中有着压缩的类: CheckedInputStream GetCheckSum()为任何InputStream 产生校验和(不仅是解压) CheckedOutputStream GetCheckSum()为任何OutputS

Java使用Zip压缩文件或整个目录

1.压缩文件或整个目录 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.zip.ZipEntry

ZIP压缩格式与RAR压缩格式

早已习惯了安装系统之后必须安装winrar,压缩文件也已经习惯了rar格式,这种习惯的力量真的挺可怕的.在工作中你的同事可能没有安装winrar,或者他们不喜欢安装盗版软件,这时候你给他们发送过去的是rar文件就会给他们造成麻烦.然而新安装的系统不管是XP还是win7都是原生支持ZIP的,所以为了不给他人造成困扰我决定以后一律用ZIP压缩文件. 其实在公司的一些规范里面也应该推广ZIP格式以便大家能更方便的工作.

java基础之zip(压缩、解压)

本程序依赖第三方包Ant.jar.因为java自带的java.utils.zip.ZipOutputStream对一些敏感中文路径会抛出异常. package javax.zip; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.Ou

正确的 zip 压缩与解压代码

网上流传的zip压缩与解压 的代码有很大的问题 虽然使用了ant进行压缩与解压,但是任务的流程还是用的java.util.zip 的方式写的,我在使用的过程中遇到了压缩的目录结构有误,甚至出现不同解压软件显示的目录结构不同的窘境. 下面给出使用org.apache.tools.ant.taskdefs.Zip;和org.apache.tools.ant.taskdefs.Expand 的压缩和解压过程. import java.io.File; import org.apache.tools.a

Xceed Zip压缩和解压控件Xceed Zip Compression Library

Xceed Zip Compression Library 是一个高性能的 Zip 和 Unzip 数据压缩ActiveX控件.通过它,可以创建和操作与Zip文件,也能在内存中直接压缩/解压数据.它设计提供高度灵活性,并且使用快速的多线程 zip 压缩引擎. 具体功能: ActiveX 技术 ATL 3.0编写,简单且独立的 COM 对象和 ActiveX 控件. 无须外部的压缩动态链接库, MFC DLL 或运行库等. 同时有单线程 (STA) 和多线程 (MTA) 模型设计. 不必将组件置于