React-Native Android端Symbol Iterator报错求助:已试coreJs方案无效
解决React Native Android端
_.keys()迭代器错误的方案 我之前也碰到过这个一模一样的问题,折腾了好一阵子才搞定,给你几个亲测有效的解决方案:
1. 统一lodash版本,解决兼容性问题
这个错误大概率是lodash版本和React Native的Android JS引擎(比如Hermes)不兼容导致的。旧版lodash对Symbol迭代器的处理在Android环境下有缺陷,建议你升级或降级到经过验证的稳定版本,比如4.17.21,这个版本在大部分RN项目里都能正常工作:
# npm npm install lodash@4.17.21 --save # yarn yarn add lodash@4.17.21
2. 正确配置Babel Polyfill
你之前尝试过core-js但没解决,可能是配置方式不对。需要在Babel里明确引入core-js 3的polyfill,覆盖Symbol相关的特性:
首先安装依赖:
npm install @babel/plugin-transform-runtime core-js@3 --save-dev
然后修改babel.config.js:
module.exports = { presets: ['module:metro-react-native-babel-preset'], plugins: [ ['@babel/plugin-transform-runtime', { corejs: 3 }] ] };
修改后清理metro缓存:
npx react-native start --reset-cache
3. 临时补丁:给Object.keys结果添加迭代器
如果上面的方法都没生效,可以在项目入口文件(比如index.js)最顶部添加这段代码,强制给Object.keys()返回的数组挂载迭代器:
// 给Object.keys的返回值添加Symbol迭代器,适配Android JS引擎 if (typeof Symbol !== 'undefined' && typeof Object.keys === 'function') { const keysResult = Object.keys({}); if (!keysResult[Symbol.iterator]) { Object.defineProperty(Object.keys.prototype, Symbol.iterator, { value: Array.prototype[Symbol.iterator], writable: true, configurable: true }); } }
这是个临时修复方案,建议还是优先从版本兼容性入手解决。
4. 排查第三方库的lodash冲突
有些第三方React Native组件库可能内置了旧版本的lodash,和你项目中的版本产生冲突。可以用以下命令查看依赖树:
# npm npm ls lodash # yarn yarn list lodash
如果发现多个lodash版本,在package.json里强制统一版本:
- 对于npm:
"overrides": { "lodash": "^4.17.21" }
- 对于yarn:
"resolutions": { "lodash": "^4.17.21" }
然后重新安装依赖:
# npm npm install # yarn yarn install
问题根源补充
这个错误本质是:在Android的JS引擎中,_.keys()返回的数组没有正确挂载Symbol.iterator,导致无法被迭代(比如用for...of循环遍历),而iOS的JS引擎对这部分特性的支持更完善,所以不会触发错误。
内容的提问来源于stack exchange,提问作者Tim Smart
相关产品推荐
相关产品推荐

