一直以来,`web.sdk.js`都是通过以下方式加载快游戏的。 ```html ``` 在大部分的游戏中也是没有问题的,由于`web.sdk.js`中存在大量的异步加载逻辑,因此将`main.js`定义为模块,并在代码最前面补充加载等待是对游戏原代码侵入较小的一种方案,而且恰恰是模块,因此顶级 await 也就非常顺理成章了。 ```js await window.qg.ready(); ``` 直到遇到下面某款游戏的入口(代码片段) - 阅读剩余部分 -
- 阅读剩余部分 -
本质上,快游戏框架是基于V8引擎魔改出来的,因此天然支持`require`函数,但在 Web 中实现这个功能就不简单了,第一版的方案是想着将`main.js`作为模块在最顶级加载,然后通过将所有的`require`调用都改为`await`。 ```js await require("./libs/min/laya.core.min.js"); await require("./libs/min/laya.ani.min.js"); await require("./libs/min/laya.ui.min.js"); ``` ```js async function require(url) { const script = document.createElement("script"); script.type = "text/javascript"; script.async = false; script.defer = false; script.src = url; await new Promise((resolve, reject) => { script.onload = () => { script.remove(); resolve(); }; script.onerror = () => { script.remove(); reject(); }; document.body.constructor.prototype.appendChild.apply(document.body, [script]); }); } ``` 一开始,这个方案也是走得通的,对于一些简单的游戏改的方便,加载也是没啥问题的,但是随着接触的快游戏越来越多,这个方案就越发难走下去,主要有两个问题: - 阅读剩余部分 -
快游戏/快应用其实和普通的应用是类似的,除了不用安装以及环境不一样外,他们都是有“包”的概念,也就是启动快游戏后都是从包内读取并加载资源(js、其他资源)。 内容加载一般分几种情况: 1. 入口js、框架js等,一般是直接通过 require 方法加载 2. 固定资源(部分js、配置文件、初始资源等)一般是通过文件系统的 readFile 从包中加载 3. 热资源(动态资源、动态js等)一般是通过 xhr 远程加载 4. 某些框架也是会通过 readFile 进行远程加载 其中除了 readFile 加载本地资源外,require、readFile 远程加载都存在巨多坑,后面会专门讲。 - 阅读剩余部分 -
在补充了近千行sdk代码后,也是顺利无报错的完美运行XX宿舍。 当然这小一千行的代码可能甚至只覆盖 1/10 都不到,满级完成度代码量在一两万行应该是差不多的,目前已完成: - 桌面图标 API - 广告 API(4/7) - 文件系统 API - 跑通单个游戏所需的琐碎 API(未整理)   - 阅读剩余部分 -
近期无聊发现在快游戏中心有挺多好玩的小游戏,质量也比网上那些H5游戏高很多(忽略广告因素,因为我手机是装了广告屏蔽的,所有游戏都很干净,后期在web中也很容易去除)。 通过将手机内的快游戏dump出来解包后发现其实就基本算是一个web项目,确定好入口将一些关键的分包加载、文件加载实现后,主体逻辑都能加载出来了,但是报了很多SDK以及bridge层的报错,这个只能根据快应用平台的SDK文档把整个sdk补充完整,因为快应用是国内大厂合伙搞的,所以我就随便找了华为的文档补了几个关键方法,就将游戏跑了起来。 理论上将整个SDK补充完整后,在入口前将sdk进行preload,应该是能完美运行所有快应用的。 抓包、解包、补环境等细节在后面再补充文章,等能做到在手机中dump出来一键/脚本转换成H5可运行的状态再公布细节。 这样子就能把很多优质游戏搬到网页中游玩了。 
收一个 Reqable 永久版订阅