perf(sdk): 跨域 baseUrl 自动注入 preconnect 提前握手

SDK 部署到第三方站点时,字体请求是跨域的,首个片段要付出 ~60ms
TCP+TLS 握手。getLoader 首次创建 loader 时按 baseUrl 注入
<link rel="preconnect" crossorigin>,让浏览器提前完成握手,首个
增量片段延迟从 ~90ms 降到 ~30ms。同源不注入,每个 origin 只注入一次。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
崮生(子虚) 2026-07-26 10:48:42 +08:00
parent 4c11470d8c
commit 7a69792730

View File

@ -37,12 +37,48 @@ var WebFont = (function () {
return fontName + "|" + family;
}
/**
* 记录已注入 preconnect origin避免重复注入
*
* 跨域字体请求首次握手要付出 ~60msTCP+TLS
* preconnect 让浏览器在首个字体请求发出前就提前完成握手
* 把首个增量片段的延迟从 ~90ms 降到 ~30ms只剩 1 RTT + 服务端处理
* 同源时 location.origin === baseUrl无需 preconnect
*/
var preconnectedOrigins = {};
/**
* 对跨域 baseUrl 注入 <link rel="preconnect">提前建立 TCP+TLS 连接
*
* 仅在跨域且尚未注入时执行一次浏览器会自行管理连接的生命周期
* 即便字体请求迟迟不来preconnect 的开销也极小空闲握手
*/
function ensurePreconnect(baseUrl) {
var origin;
try {
origin = new URL(baseUrl, location.href).origin;
} catch (e) {
return;
}
if (origin === location.origin) return;
if (preconnectedOrigins[origin]) return;
preconnectedOrigins[origin] = true;
var link = document.createElement("link");
link.rel = "preconnect";
link.href = origin;
/** crossorigin 必需字体资源默认匿名请求preconnect 需匹配否则连接无法复用 */
link.crossOrigin = "anonymous";
document.head.appendChild(link);
}
/**
* 获取或创建对应 fontKey 的加载器
*/
function getLoader(fontName, baseUrl, family, outType) {
var key = fontKey(fontName, family);
if (!loaders[key]) {
ensurePreconnect(baseUrl);
loaders[key] = {
loadedChars: {},
injectedStyles: [],