[记录] ts打包成js之后的差异导致异常

引擎版本: 3.8.4

一个很简单的项目…打包之后就报了奇怪的异常…全是堆栈爆炸…

简单调查之后发现原因在这里…
image
ts里的super.value…在js里变成this.value了…
结果就是this.value里面给this.value赋值…那就死循环了…


e459b25edd02d2e4c3f93e0889c27e0
预览的时候js还是es6的…有super关键字…不会出现这个问题…
估计打包成es5之后才会这样…

4582a80cff0360c40da6cf834a23be2
(方法里面还是支持super的…)

class A {
    _value = 'A';
    get value() {
        console.log("[A] get value", this._value);
        return this._value;
    }
    set value(value) {
        console.log("[A] set value", value);
        this._value = value;
    }
}
class B extends A {
    __value = 'B';
    get value() { return super.value; }
    set value(value) {
        console.log("[B] set value", value);
        this.__value += value;
        super.value = value;
    }
}
window['test'] = function () {
    const b = new B();
    console.log(b._value); // A
    console.log(b.__value); // B
    b.value; // [A] get value A
    b.value = 'C'; // [B] set value C [A] set value C
    b.value; // [A] get value C
    console.log(b.__value); // BC
}

(直接用es6测试也没有问题)

这个和js的es5的原型链有关系…因为es5中方法是存在原型上的…而属性是存在实例对象上的…所以会在构造的时候被子类覆写掉…也无法找到父类的属性…
而es6本身就支持了get/set/super关键字…应该是用了其他的方案来实现属性的…所以就可以了…
所以目前只能改一下方案了…把get/set的逻辑搬到方法上就可以了…

这个我也遇到过,只能绕过去。
关键是,预览的时候没错,发布的时候出错了,预览和发布不一致这个很讨厌。我看预览似乎用的babel,到了发布就变成rollup了,也有可能是这个原因。

@dumganhar @Yuan2333 @song2008_2001
我目前也遇到了
image
这样子,预览都没问题,打包发布就不行了,set get 全部被抹掉了,调用this,导致栈溢出
本来很简单的需求,就是在编辑器环境下改变的时候发射一个事件就行,现在发布后上面的代码会导致栈溢出,我这边就要去源码里面把方法体拷贝进来,引擎升级,我这边就要跟着改一遍.

应该不用改源码的…你看我的方案…抽一个函数出来…get/set里调用它…就可以访问super了…

谢谢回复, 我这边现在的解决方案直接在编辑器环境下,对_grayscale属性改变进行了拦截做自定义事件派发了. 不过两种都不是最优方案. 还是不要抹除这个set get 比较好.

这问题似乎我也遇到过,最后一怒之下就没有在用get和set了,直接包了个方法。。。

我怎么感觉是cocos用的打包器有问题呢, 你单独写个ts脚本,用webpack处理转成es5 运行看看有这个问题么