as属性写错会导致preload静默失效,Network中Priority降为Low、Initiator变为(Other);它决定请求头、CORS、缓存和优先级,非建议值而是强制开关。

as属性写错等于没写,不是警告而是静默失效
浏览器不会报错,也不会在控制台提示 as 填错,但 Network 面板里 Priority 会显示为 Low,Initiator 变成 (Other)——这说明它被当成普通 fetch 处理了。根本原因在于:as 不是“建议类型”,而是强制决定请求头、CORS 策略、缓存分区和优先级调度的开关。
- CSS 文件必须用
as="style"(不是"stylesheet"或空值) - 字体必须用
as="font"+crossorigin(同源也得加) - JS 脚本统一用
as="script"(模块脚本、带integrity的也都适用) - 图片只能用
as="image"(as="img"、as="picture"全部无效) - 视频必须用
as="video"+crossorigin(跨域 CDN 必须配,否则静默失败)
字体和图片的 crossorigin 容易漏,但漏了就白 preload
很多人以为 crossorigin 只对跨域资源需要,其实不是:Chrome 和 Safari 对 as="font" 强制要求 crossorigin,哪怕字体和 HTML 同源;图片若托管在 CDN 上且响应头没带 Access-Control-Allow-Origin: *,也必须显式声明 crossorigin,否则预加载响应会被丢弃,Network 显示 net::ERR_FAILED 或状态为 (blocked)。
-
<link rel="preload" href="/fonts/inter.woff2" as="font" crossorigin>✅ -
<link rel="preload" href="/img/banner.webp" as="image" crossorigin>✅(CDN 图片) -
<link rel="preload" href="/img/logo.png" as="image">✅(同源图,无需 crossorigin) -
<link rel="preload" href="/fonts/inter.woff2" as="font">❌(同源也失败)
preload 只下载,不执行也不应用,CSS 和字体要额外处理
rel="preload" 的本质是提前拉取字节流进缓存,它不触发解析、不应用样式、不注册字体。如果只写 <link rel="preload" href="main.css" as="style">,页面依然白屏——你必须再写一行 <link rel="stylesheet" href="main.css">,且两处 href 字符串必须完全一致(包括斜杠、大小写、查询参数),否则会触发二次请求。
- CSS 需配合
onload="this.onload=null;this.rel='stylesheet'"才能自动生效 - 字体需在 CSS 中保留
@font-face声明,preload 只加速加载,不替代声明 - 图片 preload 后,
<img>标签仍需设fetchpriority="high"和loading="eager"才能确保及时解码渲染 - 视频 preload 不会让
<video>元素自动进入canplay状态,仍需监听事件再调用play()
modulepreload 和 preload 的 as 属性根本不能混用
rel="modulepreload" 明确禁止 as 属性,加了就静默失效;而 rel="preload" as="script" 是通用下载指令,不解析 import 语句。两者行为完全不同:前者会递归预取静态 import 依赖,后者只拉一个文件。
立即学习“前端免费学习笔记(深入)”;
-
<link rel="modulepreload" href="/assets/main.mjs">✅(无 as) -
<link rel="modulepreload" href="/assets/main.mjs" as="script">❌(直接忽略) -
<link rel="preload" href="/assets/main.mjs" as="script">✅(但不递归) - 同一模块既写
preload又写modulepreload,可能因缓存 key 不一致导致重复请求
href 在 preload 标签里写的是 /js/app.js,而后续 <script src="js/app.js"> 少了个开头斜杠,浏览器就当两个资源处理。这种细微差异不会报错,但会让所有 preload 努力归零。



















