Egret小游戏如何实现代码分包(含代码绝对干货)

随着游戏往重度方向发展,游戏代码包越来越大,为了更好的加载体验,分包加载迫在眉睫。
早在2018年微信小游戏就推出分包API了,但是白鹭引擎官方却迟迟没发布高效的分包解决方案,就目前能找到的分包方案,却有很多问题。

我们先来分析一下目前公开的方案:
方案1:白鹭官方推出的资源分包,只能针对素材分包,没无法针对js代码分包,这里查看文档
方案2:在方案1的基础上,自己把原项目拆分成几个独立项目,一个分包对应一个项目,用类库的方式进行编译输出js。这种方式开发时不灵活,需要管理太多的项目,很不方便。
方案3:白鹭在5.3.6引擎推出了webpack 编译模式,提供的WebpackBundlePlugin插件支持js拆分输出,但是该方式有问题:拆分输出的文件必须一次性加载才能运行,无法按需加载(分包加载),详情参考这里(截止到2021年8月官方还未修正)
目前公开渠道能找到的这几种方法都解决不了实际需求,那就只能自己开发了。

需求目标:开发的时候只有1个项目,根据文件夹将代码编译出多个独立的js,输出到对应的包里面按需分包加载。
解决思路:定义一套输出规则,修改引擎的编译代码,使得项目代码输出成独立的多个js,最终实现分包加载。
1、配置js输出规则:在config.wxgame.ts里面修改ConpilePlugin调用,配合编译代码实现js拆分输出

 new CompilePlugin({
    libraryType: "release", defines: {
    DEBUG: false, RELEASE: true 
      , subpackages:[{
   name: "game_main", matcher:(filepath)=>{
   
              //console.log("matcher:", filepath);
              if(filepath.indexOf("miniGame/") >-1 ) return true; //根据文件夹路径来判断
              return false;
          }
      }] 
  } }),

2.1、在config.wxgame.ts里面导入SubPackagePlugin(代码见文末)

import {
    SubPackagePlugin } from './wxgame/subpackage';

2.2、在config.wxgame.ts里面ManifestPlugin代码处下一行加上分包文件路径配置

, new SubPackagePlugin({
    output: 'manifest.js', subPackages: [
          {
    root: "stage_game",  "includes": ["js/game_main.min.js","js/xxxxx.js"]}
      ]
  })

3、修改引擎编译代码:找到插件CompilePlugin的位置:C:\Users\用户名\AppData\Roaming\Egret\engine\5.2.33\tools\tasks\compile.js,修改tinyCompiler方法

function tinyCompiler(defines, pluginContext) {
   
    var os = require('os');
    var outfile = FileUtil.joinPath(os.tmpdir(), 'main.min.js');
    var options = egret.args;
    options.minify = true;
    options.publish = true;
    var configParsedResult = compiler.parseTsconfig(options.projectDir, options.publish);
    var compilerOptions = configParsedResult.options;
    var fileNames = configParsedResult.fileNames;
    var tsconfigError = configParsedResult.errors.map(function (d) {
    return d.messageText.toString(); });
    compilerOptions.outFile = outfile;
    compilerOptions.allowUnreachableCode = true;
    compilerOptions.emitReflection = true;
    compilerOptions.defines = defines;

	var pp = defines.subpackages; //根据编译规则进行js拆分输出
	if(pp){
   
		for(
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星星之Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值