2.3.2 版本 native 发布脚本会重复加载已 import 的模块并导致堆栈溢出,附手动解决方案

  • Creator 版本:
    2.3.2

  • 目标平台:
    iOS / Android / 模拟器

  • 详细报错信息,包含调用堆栈:
    D/jswrapper (130): JS: Enable batch GL commands optimization!
    E/jswrapper (682): ScriptEngine::evalString script src/project.dev.js, failed!
    E/jswrapper (300): [ERROR] Failed to invoke require, location: …\cocos\scripting\js-bindings\manual\jsb_global.cpp:300
    E/jswrapper (272): ERROR: Uncaught RangeError: Maximum call stack size exceeded, location: src/project.dev.js:0:0
    STACK:
    [0]anonymous@src/project.dev.js:25823
    [1]window.__require.datatype@src/project.dev.js:25891
    [2]s@src/project.dev.js:18
    [3]anonymous@src/project.dev.js:20
    [4]window.__require.battle_config…/enums/datatype@src/project.dev.js:7989
    [5]s@src/project.dev.js:18
    [6]anonymous@src/project.dev.js:20
    [7]window.__require.EffectImplement…/…/common_util@src/project.dev.js:2950
    [8]s@src/project.dev.js:18
    [9]anonymous@src/project.dev.js:20
    [10]window.__require.EffectManager…/config/effect_cfg@src/project.dev.js:3406
    [11]s@src/project.dev.js:18
    [12]anonymous@src/project.dev.js:20
    [13]window.__require.ActionManager…/config/action_cfg@src/project.dev.js:37
    [14]s@src/project.dev.js:18
    [15]anonymous@src/project.dev.js:20
    [16]window.__require.BuffImplement…/config/battle_config@src/project.dev.js:1669
    [17]s@src/project.dev.js:18
    [18]anonymous@src/project.dev.js:20
    [19]window.__require.BuffManager…/config/buff_cfg@src/project.dev.js:2299
    E/jswrapper (682): ScriptEngine::evalString script main.js, failed!

  • 重现方式:
    只要发布任何平台的native包运行就报错

  • 之前哪个版本是正常的 :
    没有正常过

  • 手机型号 :

  • 手机浏览器 :

  • 编辑器操作系统 :

  • 编辑器之前是否有其它报错 :

  • 出现概率:
    必现

  • 额外线索:
    typescript项目,代码规模较大,300+源码文件,4M代码量,存在循环import(A import B, B import C, C import A)

  • 手动解决方法:
    生成的require方法有bug,原始的代码:
    window.__require = function e(t, n, r) { function s(o, u) { if (!n[o]) { if (!t[o]) { var b = o.split("/"); b = b[b.length - 1]; if (!t[b]) { var a = "function" == typeof __require && __require; if (!u && a) return a(b, !0); if (i) return i(b, !0); throw new Error("Cannot find module '" + o + "'"); } o = b; } var f = n[o] = { exports: {} }; t[o][0].call(f.exports, function(e) { var n = t[o][1][e]; return s(n || e); }, f, f.exports, e, t, n, r); } return n[o].exports; } var i = "function" == typeof __require && __require; for (var o = 0; o < r.length; o++) s(r[o]); return s; }
    后经调试手动修正这段代码替换为如下:
    window.__require = function e(t, n, r) { function s(o, u) { if (!n[o]) { var b = o.split("/"); o = b[b.length - 1]; } if (!n[o]) { if (!t[o]) { var a = "function" == typeof __require && __require; if (!u && a) return a(o, !0); if (i) return i(o, !0); throw new Error("Cannot find module '" + o + "'"); } var f = n[o] = { exports: {} }; t[o][0].call(f.exports, function(e) { var n = t[o][1][e]; return s(n || e); }, f, f.exports, e, t, n, r); } return n[o].exports; } var i = "function" == typeof __require && __require; for (var o = 0; o < r.length; o++) s(r[o]); return s; }
    问题解决。
    creator最早从2.2.0开始使用,一路升级到2.3.2,这个问题都一直存在。
    因此发上来希望未来版本解决该问题。

mark

牛。。。。