增强pushState与replaceState

这段代码什么意思? (摘自一篇single-spa文章)

js 复制代码
window.history.pushState = patchedUpdateState(window.history.pushState)
window.history.replaceState = patchedUpdateState(window.history.replaceState)

function patchedUpdateState(updateState) {
    return function (...args) {
        const urlBefore = window.location.href;
        const result = Reflect.apply(updateState, this, args)
        const urlAfter = window.location.href
        if (urlBefore !== urlAfter) {
            doSomething()
        }
        return result
    }
}

整体来看,就是将window.history里的pushState或者replaceState方法作为参数updateState传入定义的patchedUpdateState方法,当调用patchedUpdateState方法时,返回了一个匿名函数,保存在了对应的位置。

拆开来看:

1.pushState与replaceState,

以pushState为例,先看下它的函数签名pushState(state, unused, url)

参数state,该参数将会被存储在history的state属性上,要求是个16M大小以内的object即可。 参数unused,默认传空字符串即可。

参数url,该url要求与当前url同源,调用pushState后浏览器并不会加载此url,但是url地址栏会改变。

它俩最大的区别是,pushState 会在浏览器历史记录中创建一个新的一条,而 replaceState 只会替换当前状态,这样做的副作用是,使用 replaceState 方法将更改地址栏中的 URL,而不会创建新的历史记录条目。

说人话:就是如果你调用了N次pushState,当你点击浏览器返回按钮至最初的页面时,你同样需要点击N次,而replaceState只需要点击1次。

2.上面清楚了,ok,我想你应该又遇到了Reflect.apply,这是反射提供的静态方法,可以直接调用,和Function.prototype.apply()的使用略有不同,但是作用相同,意思是调用updateState方法,修改this指向(留个小疑问,这里的this指向是谁,知道的小伙伴可以敲在评论区),传入args参数。

至此,我想聪明的你已经清楚,通过反射的apply调用pushState或者replaceState方法,比较前后url,如果不同则去处理一些事情。最终将pushState或者replaceState方法的返回值return出去。

总结

虽然代码量并不多,但是完全弄清楚这段代码什么意思,你要了解内部一些API的作用是什么,参数是什么,返回是什么,使用场景是什么,甚至对比es6之前的方法有什么不同,延伸再延伸,这里只是抛砖引玉,你get了吗。

相关推荐
GuWenyue28 分钟前
不用第三方SDK!Vue3原生Fetch实现DeepSeek流式输出,90%前端都会踩的分片解析坑一次性解决
前端·人工智能·llm
独隅30 分钟前
前端离线暂停更新策略:Service Worker 与 PWA 实战指南
前端
不如摸鱼去1 小时前
Wot UI 2.3.0 发布:二维码组件来了,Open Wot 与 wot-starter 同步更新
前端·ui·微信小程序·前端框架·uni-app
Cloud_bread1 小时前
从ReAct到自主闭环:Agentic Coding核心执行引擎的技术演进
前端·react.js·前端框架
cidy_982 小时前
OptMem 使用教程
前端
满栀5852 小时前
原生JS + ECharts 多图表可视化实战:从业务实现到工程化优化
开发语言·javascript·echarts
杉氧2 小时前
用 Compose 挑战交互与动效天花板:ComposeCraftLab 开源实验室全解析
android·前端·kotlin
Canace2 小时前
AI 生成到 90% 突然断了:你的解决方案是?
前端·人工智能
TinssonTai2 小时前
Vite 8 版 Chrome 插件全家桶,popup/options/sidepanel 一次集齐
前端·vue.js
玉鸯2 小时前
让 Agent 面向用户:AG-UI 协议构建 Agent 前端
前端·python·agent