增强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了吗。

相关推荐
之歆9 分钟前
DAY08_CSS浮动与行内块布局实战指南(下)
前端·css
yqcoder26 分钟前
CSS Position 全解析:5 种定位模式详解
前端·css
Rhi6371 小时前
从零搭建项目:React 19 + Vite 8 + Tailwind CSS v4 实战配置
前端
竹林8181 小时前
用Viem替代ethers.js:从一次签名失败到完整迁移的实战记录
前端·javascript
之歆1 小时前
DAY08_CSS浮动与行内块布局实战指南(上)
前端·css
light blue bird2 小时前
主子端台二分法任务汇总组件
前端·数据库·.net·桌面端winform
不可能的是2 小时前
Claude Code 子 Agent 机制全解:怎么跑起来、怎么被管理、怎么互不干扰
javascript
jeffwang2 小时前
我做了个让 AI 看屏幕跑测试的工具,因为 Playwright 测不了我的 Flutter Web
前端
HSunR3 小时前
dify 搭建ai作业批改流
开发语言·前端·javascript
代码不加糖3 小时前
2026 跨境电商独立站实战:从 0 到 1 搭建高转化 SaaS 商城(附源码)
开发语言·前端·javascript