taro 【内存泄露】生成 component id 的逻辑存在严重的内存泄露

mbzjlibv  于 2022-10-24  发布在  其他
关注(0)|答案(9)|浏览(241)

生成的 component id 存在 compIdsMapper Map 内,反复进入页面,这个对象越来越大,稍微复杂的页面,内存泄露比较严重。

cnwbcb6i

cnwbcb6i1#

compIdsMapper 对象越来越大,并且存储用的 key 字符串(很长)也不会销毁。

var compIdsMapper;

try {
    compIdsMapper = new Map();
} catch (error) {
    compIdsMapper = new SimpleMap();
}

function genCompid(key, isNeedCreate) {
    if (!taro.Current || !taro.Current.current || !taro.Current.current.$scope) return [];
    var prevId = compIdsMapper.get(key);

    if (isNeedCreate) {
        var _id = genId();

        compIdsMapper.set(key, _id);
        return [prevId, _id];
    } else {
        var _id2 = prevId || genId();

        !prevId && compIdsMapper.set(key, _id2);
        return [null, _id2];
    }
}
kuhbmx9i

kuhbmx9i2#

编译后的代码, compIdsMapperkey 也是随机拼接了很多随即在字符串,最后 key 越来越长,单个 key 长度15 ~ 150+ 个字符

var _genCompid3 = (0, _taroTt.genCompid)(__prefix + "bfczzzzzzz" + __index0, true),
dgjrabp2

dgjrabp25#

版本信息要提供一下,另外周末作者团队要休息的

wz1wpwve

wz1wpwve6#

"@tarojs/cli": "2.0.6",
    "@tarojs/mini-runner": "2.0.6",
    "@tarojs/webpack-runner": "2.0.6",
92vpleto

92vpleto7#

这个问题和版本没有关系,至少2.x,我看几乎所有的版本都会有genCompId 的逻辑, 都会用 compIdsMapper 和 key 生成,因此都有问题。

另外 taro 代码中拷贝了 lodash 的一些方法,比如baseGet 逻辑,lodash 中有个限制最大 500,超过 500 自动清空,但是 taro 源码中就没有限制了。

sbtkgmzw

sbtkgmzw8#

baseGet 使用使用 stringToPath,这个方法有个缓存。

igetnqfo

igetnqfo9#

感觉这个要不了了之了,忙着搞 3.x 的了

相关问题