首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >OPPO 快游戏在浏览器复现运行(四)之游戏入口加载

OPPO 快游戏在浏览器复现运行(四)之游戏入口加载

作者头像
LiesAuer
发布2026-03-10 17:11:22
发布2026-03-10 17:11:22
570
举报
文章被收录于专栏:LiesAuer's BlogLiesAuer's Blog

一直以来,web.sdk.js都是通过以下方式加载快游戏的。

代码语言:javascript
复制
    <script src="./web.sdk.js"></script>
    <script src="./main.js" type="module"></script>

在大部分的游戏中也是没有问题的,由于web.sdk.js中存在大量的异步加载逻辑,因此将main.js定义为模块,并在代码最前面补充加载等待是对游戏原代码侵入较小的一种方案,而且恰恰是模块,因此顶级 await 也就非常顺理成章了。

代码语言:javascript
复制
await window.qg.ready();

直到遇到下面某款游戏的入口(代码片段)

代码语言:javascript
复制
await window.qg.ready();

window['qg'].setIsUnityGame(true);
const xgame = qg;
require("ral.js");

初步一看,看似没啥毛病对吧,非常简单的一个代码片段,但问题就出在了那行平平无奇的const xgame = qg;,由于main.js是模块,自带作用域隔离,因此此时的作用域是模块内部作用域,并非全局作用域,然后加载ral.js时就出问题了,ral.js是访问不到xgame的,会直接报错导致游戏加载中断。

为了解决这个问题,那么就不能将游戏入口定义为模块,不定义为模块,就没法在顶级 await,而且还得同时兼顾执行上下文的问题,在众多动态执行JS代码的方案中,那么很明显就只有动态创建script标签加载是最合适的了。

那么没办法,就只能在web.sdk.js中初始化自身后动态加载main.js了,由于快游戏的入口是固定的,因此直接硬编码加载也是没得问题的,这里处理后,main.js也就不需要await window.qg.ready();了,游戏入口代码零侵入。

代码语言:javascript
复制
    window.qg._ready = true;

    await requireAsync("main.js");
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档