Firebase部署Hosting遇IterableIterator迭代错误,求解决方案及原因
问题分析与解决方案
问题现象
- 执行
firebase deploy --only functions部署云函数时无编译错误,测试功能正常 - 执行
firebase deploy --only hosting部署托管服务时,触发TypeScript编译错误:提示IterableIterator<[any, any]>只能在启用--downlevelIteration编译 flag 或目标版本设为es2015及以上时遍历,错误集中在Map.entries()的for...of遍历代码处 - 修改
functions目录下的tsconfig.json,将target改为es2015并启用downlevelIteration: true后,问题依然存在
根本原因
Firebase Hosting部署时,会默认扫描项目根目录下的所有代码(包括functions目录)并入前端构建流程,但云函数和托管服务使用的是两套独立的TypeScript编译配置:
- 云函数的编译逻辑使用
functions目录下专属的tsconfig.json - 托管部署的前端构建则读取项目根目录的
tsconfig.json,你之前修改的是云函数目录下的配置,根目录配置未更新,导致前端编译时仍用旧规则处理Map.entries()的遍历 - 另外,
Map.entries()返回的迭代器在ES2015之前的环境不支持for...of直接遍历,必须开启downlevelIteration提供降级兼容,若根目录配置未满足这两个条件,就会触发错误
解决方案
方案1:修正根目录的tsconfig.json配置
找到项目根目录的tsconfig.json(不是functions/子目录下的),确保以下配置正确:
{ "compilerOptions": { "target": "es2015", "downlevelIteration": true, // 保留其他原有配置 } }
方案2:替换遍历方式(无需修改配置)
如果不想调整TypeScript编译规则,可以改用兼容更低版本的遍历写法:
比如用Map自带的forEach方法:
activeLevels.forEach((lvlCount, level) => { jsonResult = Object.assign({}, jsonResult, { [`Level_${level.toString()}`]: lvlCount, }); // 原后续业务代码 });
或者手动把迭代器转为数组再遍历:
for (const [level, lvlCount] of Array.from(activeLevels.entries())) { // 原代码逻辑 }
方案3:隔离云函数代码避免托管构建扫描
修改项目根目录的firebase.json,配置托管部署时忽略functions目录:
{ "hosting": { "public": "out", // 你的Next.js构建输出目录 "ignore": [ "firebase.json", "**/.*", "**/node_modules/**", "functions/**" // 新增该行,排除云函数目录 ] } }
验证步骤
修改完成后,先执行npm run build确认Next.js前端构建无错误,再执行firebase deploy --only hosting即可正常部署。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

