生成的 component id 存在 compIdsMapper Map 内,反复进入页面,这个对象越来越大,稍微复杂的页面,内存泄露比较严重。
cnwbcb6i1#
compIdsMapper 对象越来越大,并且存储用的 key 字符串(很长)也不会销毁。
compIdsMapper
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]; } }
kuhbmx9i2#
编译后的代码, compIdsMapper 的 key 也是随机拼接了很多随即在字符串,最后 key 越来越长,单个 key 长度15 ~ 150+ 个字符
key
var _genCompid3 = (0, _taroTt.genCompid)(__prefix + "bfczzzzzzz" + __index0, true),
hlswsv353#
arknldoa4#
???
dgjrabp25#
版本信息要提供一下,另外周末作者团队要休息的
wz1wpwve6#
"@tarojs/cli": "2.0.6", "@tarojs/mini-runner": "2.0.6", "@tarojs/webpack-runner": "2.0.6",
92vpleto7#
这个问题和版本没有关系,至少2.x,我看几乎所有的版本都会有genCompId 的逻辑, 都会用 compIdsMapper 和 key 生成,因此都有问题。
另外 taro 代码中拷贝了 lodash 的一些方法,比如baseGet 逻辑,lodash 中有个限制最大 500,超过 500 自动清空,但是 taro 源码中就没有限制了。
sbtkgmzw8#
baseGet 使用使用 stringToPath,这个方法有个缓存。
igetnqfo9#
感觉这个要不了了之了,忙着搞 3.x 的了
9条答案
按热度按时间cnwbcb6i1#
compIdsMapper
对象越来越大,并且存储用的 key 字符串(很长)也不会销毁。kuhbmx9i2#
编译后的代码,
compIdsMapper
的key
也是随机拼接了很多随即在字符串,最后key
越来越长,单个key
长度15 ~ 150+ 个字符hlswsv353#
arknldoa4#
???
dgjrabp25#
版本信息要提供一下,另外周末作者团队要休息的
wz1wpwve6#
92vpleto7#
这个问题和版本没有关系,至少2.x,我看几乎所有的版本都会有genCompId 的逻辑, 都会用 compIdsMapper 和 key 生成,因此都有问题。
另外 taro 代码中拷贝了 lodash 的一些方法,比如baseGet 逻辑,lodash 中有个限制最大 500,超过 500 自动清空,但是 taro 源码中就没有限制了。
sbtkgmzw8#
baseGet 使用使用 stringToPath,这个方法有个缓存。
igetnqfo9#
感觉这个要不了了之了,忙着搞 3.x 的了