# 饿了么(25 题)

# 1. 小程序里面开页面最多多少

⚡ 30 秒速记

  • 微信小程序页面栈最多 10 层,满了再 navigateTo 会走 fail
  • navigateTo 入栈 / redirectTo 替换当前页 / reLaunch 清空重建 / navigateBack 出栈
  • tabBar 页用 switchTab 切换,也可用 reLaunch 重建;navigateTo 和 redirectTo 都打不开
  • 详情页套详情页(推荐商品、相关文章)是最容易撞上限的场景,该替换就替换
  • 分享卡片冷启动进来时栈里只有一页,返回按钮要自己兜底回首页

微信小程序的页面栈最多 10 层,超过以后 navigateTo 直接失败。 可以把页面栈想成浏览器的历史记录,只不过平台为它设了层数上限,页面及其状态也会占用资源;具体渲染方式取决于 WebView 或 Skyline 等渲染引擎。真碰到上限一般不是数字的问题,而是导航设计有问题,比如商品详情里点推荐商品一路往下点。我会封装一个跳转方法,用 getCurrentPages().length 判断深度,接近上限时改成 redirectTo 替换当前页;回首页这类动作用 reLaunch 或 switchTab,不往栈里堆。

原理拆开看

微信小程序同时打开的页面栈通常最多 10 层,超过后不能继续通过 navigateTo 入栈;返回用 navigateBack,切换 tab 用 switchTab。这个值属于平台限制,面试时还应补一句:开发要以当前官方文档和实际基础库为准,页面层级过深本身也说明导航设计需要收敛。 小程序页面栈可以理解为一段受平台管理的导航历史:navigateTo 新增普通页,navigateBack 回退,redirectTo 替换当前页,reLaunch 重建整条栈,switchTab 切换到 tabBar 页面。具体层数是平台能力,不应把“能开多少层”当作导航设计目标。

最小实现

function openDetail(id) {
  const pages = getCurrentPages()
  if (pages.length >= 9) {
    wx.redirectTo({ url: `/pages/detail/index?id=${id}` })
    return
  }
  wx.navigateTo({ url: `/pages/detail/index?id=${id}` })
}

// tabBar 页面必须使用 switchTab
function goHome() {
  wx.switchTab({ url: '/pages/home/index' })
}

普通情况下用 navigateTo 保留返回路径;当页面栈已经很深时,示例改用 redirectTo 替换当前页,避免继续入栈。tabBar 页面不能用普通入栈 API,必须 switchTab。生产还应根据流程语义决定是否替换,不能只按数字硬切。

webapp
公众号
开发者导航
切换夜间模式
折叠侧边栏
收起全部