记一个 Fetch 问题引发的考古

3,251 阅读1分钟

起因

起因是隔壁项目组在测试发现版本环境发起的请求没有携带 cookie 导致认证报错,第一反应是 fetch 请求的参数 option 里 credentials 没有配置导致的。查看代码发现确实没有配置 credentials 选项,但是奇怪的是开发环境相同代码没有该问题,怀疑是 Fetch API credentials 默认值有历史变更。果然查看差异发现开发环境浏览器是 Chrome v90,而版本环境浏览器是 Chrome v63。将版本环境浏览器更新,问题解决,为了兼容老版本浏览器,后续还需要将代码中 fetch 的 credentials 选项设置为 same-origininclude

开始考古,找了一圈,先说结论

  • credentials 现在的默认值是 same-origin ,原默认值为 omit
  • 2018 年 4 月标准变更
  • 2018 年,Chrome 68、Firefox 61.0b13、Safari 12 开始支持该特性
  • 若要兼容老版本浏览器,注意设置 credentials

考古过程痕迹:

1、MDN 的 3 个坑

坑1:文档参数说明没有说默认值

developer.mozilla.org/en-US/docs/…

Untitled.png

坑2:关于这点在与 jQuery 的区别里提到,而且中英文文档不一致(中文文档没有这部分):

developer.mozilla.org/en-US/docs/…

Untitled 1.png

在这里也提了一嘴

developer.mozilla.org/en-US/docs/…

Untitled 2.png

这块中文文档倒是有,但是内容还是不一致

developer.mozilla.org/zh-CN/docs/…

Untitled 3.png

2、看看标准

现有标准fetch.spec.whatwg.org/

Untitled 4.png

该标准变更的 PRMake fetch() use "same-origin" credentials by default

Untitled 5.png

3、Chrome 考古

在这里 chromestatus.com/features 可以查看 Chrome 全部特性

chromestatus.com/features#cr…

Untitled 6.png

Feature: Fetch API: Credentials mode default to "same-origin"

Untitled 7.png