升级Angular 16导致SharePoint Office加载项出现this._history.replaceState报错
你遇到的问题核心是Angular 16对Router模块的底层实现调整,触发了Office.js长期存在的history API破坏问题,具体原因分三点:
Angular路由对history API的依赖增强:
尽管你使用了哈希定位策略(HashLocationStrategy),Angular 16在路由导航的内部逻辑中,新增了对history.replaceState的调用——用于同步路由状态到浏览器历史记录。而Angular 14/15版本在哈希模式下,路由变化仅依赖哈希值的修改,不会主动调用replaceState,因此Office.js删除该方法的行为没有被触发。哈希模式的内部逻辑更新:
Angular 16优化了路由状态的管理机制,即使在哈希模式下,也会尝试通过history.replaceState来更新历史栈的状态元数据(比如路由的额外信息),而之前的版本完全依赖哈希变化的原生hashchange事件,不需要操作history的replaceState方法。Office.js的固定行为:
Office.js加载时会主动覆盖/删除window.history.pushState和replaceState,这是一个长期存在的兼容性问题,但只有当应用主动调用这些API时才会暴露错误。Angular 16的路由调整刚好触发了这个被破坏的API,所以之前版本没问题,升级后报错。
补充验证
你可以通过调试Angular Router的源码(比如Router类的navigate方法流程),会发现在导航完成阶段,Angular 16会调用History.replaceState来同步路由状态,而这个方法已经被Office.js移除,因此抛出this._history.replaceState is not a function错误。
你找到的缓存并恢复history方法的方案是有效的,它能修复Office.js对浏览器历史API的破坏,适配Angular 16的路由逻辑。
内容的提问来源于stack exchange,提问作者Amir

