不玩虚的,只玩真实。这篇文章解决调用history.replaceState导致上层应用无法回退问题。
1. 问题背景
涉及的环境: electron nuxt + vue3 + vue-router
我们有一个electron应用,其内部通过iframe内嵌了web网站A。 在网站A中,每次路由发生变化时,就会上报给electron应用,而electron应用在内部通过 window.history.state 拿到网站A的历史栈信息,就可以实现像浏览器一样的 前进/后退/刷新 等操作了。 现在遇到了一个问题:在electron中点击切换网站A的页面(即:从A-a页面,切换到A-b页面后),再进行页面刷新,之后就不能进行回退了
2. 分析
原因是页面刷新后,window.history.state变成了null,顺着这一条线索,发现A-b页面中有使用 history.replaceState 方法
// A-b页面中初始化时调用的逻辑
const url = 'xxxxxxxx' // 某些特殊处理后的路径,比如给路径中添加特殊SEO文案
window.history.replaceState(null, '', url) // 该方法可以修改路径而不刷新页面
3. 解决
在替换state时保留原值即可解决
// A-b页面中初始化时调用的逻辑
const url = 'xxxxxxxx'
const latestState = window.history.state;
window.history.replaceState(latestState, '', url);