代码地址如下:
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游戏实战

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

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

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

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

    JSZip 是一款可以创建.读取.修改 .zip 文件的 javaScript 工具.在 web 应用中,免不了需要从 web 服务器中获取资源,如果可以将所有的资源都合并到一个 .zip 文件中,这 ...

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

    JSZip 是一款可以创建.读取.修改 .zip 文件的 javaScript 工具.在 web 应用中,免不了需要从 web 服务器中获取资源,如果可以将所有的资源都合并到一个 .zip 文件中,这 ...

  3. 开发H5游戏引擎的选择:Egret或Laya?

    开发H5游戏引擎的选择:Egret或Laya? 一.总结 一句话总结:选laya吧 二.开发H5游戏引擎的选择:Egret或Laya? 一.H5游戏开发的引擎介绍 开发H5游戏的引擎有很多,比如egr ...

  4. .net 批量导出文件,以ZIP压缩方式导出

     1. 首先Nuget          ICSharpCode.SharpZipLib <script type="text/javascript"> $(funct ...

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

    近日,国内某安全公司研究人员透露了一个关键漏洞的详细信息,该漏洞影响了许多生态系统中的数千个项目,黑客可以利用这些漏洞在目标系统上实现代码执行. 黑客是如何通过Zip压缩文件入侵攻击?被称为“ZipS ...

  6. Android总结之Gzip/Zip压缩

    前言: 做过Android网络开发的都知道,在网络传输中我们一般都会开启GZIP压缩,但是出于刨根问底的天性仅仅知道如何开启就不能满足俺的好奇心的,所以想着写个demo测试一下比较常用的两个数据压缩方 ...

  7. C# 对多个文件进行zip压缩

    本文使用的ICSharpCode.SharpZipLib.dll类库来实现文件压缩,你可以通过Nuget来安装此类库,或者到搜索引擎去搜索一下遍地都是.类库下载下来之后,添加到项目引用就可以了.下面这 ...

  8. 【VC++技术杂谈008】使用zlib解压zip压缩文件

    最近因为项目的需要,要对zip压缩文件进行批量解压.在网上查阅了相关的资料后,最终使用zlib开源库实现了该功能.本文将对zlib开源库进行简单介绍,并给出一个使用zlib开源库对zip压缩文件进行解 ...

  9. zip压缩命令的使用

    file命令可以查看文件的类型 tar类型 .tar gzip类型   .gz  bzip2类型  .bz2 zip类型    .zip 如果一个压缩文件由tar命令解压的前提,2个条件 1.这个文件 ...

随机推荐

  1. android View post(Runnable runnable ) 新线程

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha View post(Runnable runnable ) 方法  不会 创建 新线程, ...

  2. CentOS 6.9下iptables通过raw表实现日志输出和调试

    说明:iptables调试的最好方式应该是输出日志了.并且iptables有个raw的表,优先级别最好,且调试时针对icmp协议(ping)进行,那么日志输出就是整条链路串起来输出的,非常的清晰. 前 ...

  3. TSQLTableJSON解析JSON

    TSQLTableJSON解析JSON uses mormot rocedure TTestTableContent.SynopseTableVariant;var json: RawUTF8; pe ...

  4. 通过命名管道协议方式访问群集SQL的一个小问题

    原来的单机实例SQL如果开放命名管道协议访问可以在.Net程序的连接字符串中增加“;Net=dbnmpntw"以通过命名管道协议方式访问,但是当迁移到群集SQL后,.net通过它可能无法正常 ...

  5. linux如何修改登录用户密码

    root登录后,passwd root可以修改root帐号的密码 其他具有sudo权限的用户登录后,sudo passwd root可以修改根帐号的密码 sudo passwd admin可以修改ad ...

  6. wireshark常用错误提示分析-转

    1.[Packet size limited during capture] 当你看到这个提示,说明被标记的那个包没有抓全.以图1的4号包为例,它全长有171字节,但只有前96个字节被抓到了,因此Wi ...

  7. Android LayoutInflater布局填充器

    Android LayoutInflater布局填充器 把一份xml布局文件转为View对象,这就是layoutinflater的作用. 对于一个没有被载入或者想要动态载入的界面,都需要使用Layou ...

  8. vue项目构建实战基础知识:SPA理解/RESTful接口介绍/static目录配置/axios封装/打包时map文件去除

    一.SPA 不是指水疗.是 single page web application 的缩写.中文翻译为 单页应用程序 或 单页Web应用,更多解释请自行搜索. 所有的前端人员都应该明白我们的页面的 u ...

  9. stderr重定向

    在测试alljoyn时开启了内部日志,输出太多想重定向到文件中,使用如下命令: ./chat -s aaa >.txt 居然还是打印到屏幕上而不是输出到文件中. 查看alljoyn写日志的代码, ...

  10. CentOS6.8 4.4.43内核 安装PF_RING

    环境: 系统:CentOS 6.8 内核版本:4.4.43 PF_RING版本:6.9.0 编译PF_RING需要内核源码,由于我的机器上只有4.4.43版本的modules和4.4.43的源码,并没 ...