Handle 浏览器返回按钮

单元测试:
  1. 自己的每个页面都有 state // 没有的话 replace 添加
  2. 打开 modal 不会改变 url,不会被复制在新上下文中打开 // pushState
  3. 打开 modal 添加 close 回调 // 刷新时有 close 标记但是没有回调应该 back
  4. 关闭 modal 之前执行 closeBefore,返回为 false 时需要 forward
  5. 页面跳转时有 close 应该先 back 执行 close 回调再进行跳转
  6. 不能影响返回键退出 App
  7. modal 中切换页面 // 可以只支持 1 级
  8. 多级 modal 中刷新 // 可以只支持 2 级

history.foward() 触发的 popstate 是可信的

注: chrome history.foward 是异步修改 history 的,异步触发 popstate, 所以在连续操作 history 时中间要设置间隔时间 // 但是是同步修改的 location
```js
history.pushState('/', {}, '')
let flag = false
window.addEventListener('popstate', () => {
console.log({ flag })
})
flag = true
history.back();
queueMicrotask(() => flag = false)
```