Firebase Auth预连接(preconnect)/DNS预取配置无效排查及Firebase Database WebSocket DNS预取可行性咨询
我来帮你一步步排查和解答这两个问题~
一、Firebase Auth预连接(preconnect)配置无效的排查方向
首先得说,你写的preconnect标签格式是完全正确的:
<link rel="preconnect" href="https://identitytoolkit.googleapis.com" crossorigin> <link rel="preconnect" href="https://securetoken.googleapis.com" crossorigin>
跨域请求的preconnect必须加crossorigin属性,这点你没做错。那为啥没效果?可以从这几个角度去查:
标签加载顺序不对
预连接的核心是提前建立连接,所以link标签必须放在Firebase SDK的初始化脚本之前,而且要尽可能放在<head>的最顶部!如果你的Firebase初始化脚本在preconnect标签之前加载,浏览器还没来得及完成预连接握手,SDK就已经发起请求了,那预连接等于白加。浏览器调试没抓对时机
你可以打开Chrome DevTools的「Network」面板,过滤identitytoolkit.googleapis.com和securetoken.googleapis.com这两个域名,然后看请求的「Timing」标签:- 如果预连接生效,「Connection Setup」的时间会极短(几毫秒),甚至会显示「Reused connection」;
- 另外要注意,预连接只是帮你提前完成TCP+TLS握手,CORS预飞行(OPTIONS请求)还是会触发的,但握手的时间已经省下来了,整体请求耗时应该还是会缩短——别误以为预连接能消除OPTIONS请求哦。
Securetoken.googleapis.com的请求触发条件特殊
你观察得没错,这个域名只有在token过期需要刷新时才会发起请求。如果你的测试场景里token还没过期,浏览器根本不会发这个请求,自然看不到预连接的效果。可以试试主动清除浏览器localStorage里的Firebase相关token(比如搜firebase:authUser开头的键),然后刷新页面测试,这时候应该能看到复用预连接的情况。浏览器兼容性或缓存问题
虽然主流浏览器(Chrome、Firefox、Edge)都支持preconnect,但还是可以试试强制刷新页面(Ctrl+Shift+R),清除浏览器缓存后再测试,避免之前的连接缓存干扰结果。
二、Firebase Database WebSocket的DNS预取可行性
你问的这个点很专业!首先明确:
- Preconnect确实不支持WebSocket(因为它只针对HTTP/HTTPS协议),但DNS预取(dns-prefetch)是完全有效的。
你写的这个标签是正确的:
<link rel="dns-prefetch" href="https://my-app.firebaseio.com">
DNS预取只会提前完成域名的DNS解析步骤,不管后续是HTTP请求还是WebSocket连接,都能省掉DNS查询的等待时间。而且Firebase Database的WebSocket连接域名就是你的数据库域名(比如my-app.firebaseio.com),所以这个配置完全能生效,放心用就行。
内容来源于stack exchange

