文档 Head 中究竟应该放什么
<head> 元素是 HTML 中最容易被误解的部分之一。开发者要么把见过的所有 meta 标签都塞进去,要么几乎留空。这两种做法都无法很好地服务于用户和网站。
本文为现代 HTML head 元素提供了一个清晰的思维模型——什么是必需的,什么是情境性的,以及什么是可以跳过的。
核心要点
- 文档 head 充当协调层的角色,在可见内容加载之前告诉浏览器、搜索引擎和服务如何解释你的页面。
- 必需元素包括 charset、viewport、title 和 meta description——省略这些会导致实际问题。
- 资源提示如 preconnect、dns-prefetch 和 preload 可以提升性能,但应有意识地使用。
- 许多常见的 head 元素(如 keywords meta 标签)在现代环境中没有任何益处,应该删除。
Head 作为协调层
将文档 head 视为一个协调层。它告诉浏览器、搜索引擎和其他服务在任何可见内容加载之前如何解释、渲染和优先处理你的页面。
head 处理三个核心职责:
- 文档元数据 – 编码、标题、描述
- 浏览器行为 – 视口、配色方案、渲染提示
- 早期加载决策 – 资源提示、关键资源、预连接
你的 head 中的所有内容都应该服务于这些目的之一。如果不是,它可能应该放在别处——或者根本不需要。
必需的 Head 元素
这些元素几乎应该出现在每个 HTML 文档中。省略它们会导致实际问题。
字符编码和视口
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
将这些放在最前面。charset 声明必须非常早地出现在文档中,以便浏览器能够正确解析内容。viewport meta 标签确保在移动设备上正确渲染。没有它,浏览器会假定桌面宽度布局并缩小显示。
文档标题
<title>页面标题 | 网站名称</title>
标题出现在浏览器标签页、书签和搜索结果中。保持描述性并控制在 60 个字符以内。这对于可用性和 SEO 都是不可协商的。
Meta 描述
<meta name="description" content="页面内容的简明摘要。">
搜索引擎通常在结果中显示这个内容。为人类编写——150-160 个字符,准确描述页面内容。
情境性的 Head 内容
这些元素在特定上下文中很重要。在相关时包含它们,不相关时跳过。
前端性能的资源提示
现代浏览器支持几种影响加载行为的资源提示:
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="dns-prefetch" href="//cdn.example.com">
<link rel="preload" href="critical.css" as="style">
Preconnect 与你即将需要的源建立早期连接。用于字体提供商或 API 端点。
DNS-prefetch 提前解析域名。它比 preconnect 更轻量,适用于第三方资源。
Preload 立即获取关键资源。谨慎使用——预加载太多会适得其反。
规范 URL 和语言替代版本
<link rel="canonical" href="https://example.com/page">
<link rel="alternate" hreflang="es" href="https://example.com/es/page">
规范 URL 防止重复内容问题。Hreflang 标签帮助搜索引擎提供正确的语言版本。
Discover how at OpenReplay.com.
主题和配色方案元数据
<meta name="theme-color" content="#ffffff">
<meta name="color-scheme" content="light dark">
主题颜色影响移动端的浏览器 UI。配色方案提示帮助浏览器在你的 CSS 加载之前应用适当的默认样式。
Open Graph 和社交媒体元数据
<meta property="og:title" content="页面标题">
<meta property="og:image" content="https://example.com/image.jpg">
如果你的页面会在社交平台上分享,就包含这些。否则,它们只会增加字节而没有益处。
经常被误解或过度使用的内容
一些 head 内容通过盲目复制而持续存在,尽管在现代环境中用处有限。
Keywords meta 标签 – 搜索引擎会忽略它。删除它。
过多的验证标签 – 只添加你实际使用的。废弃服务的旧验证标签只会使你的文档混乱。
冗余的 viewport 值 – user-scalable=no 和 maximum-scale=1 损害可访问性。除非有令人信服的理由,否则避免使用它们。
Generator meta 标签 – 这些会暴露你的 CMS 或框架版本。它们不提供用户益处,可能会造成安全隐患。
顺序很重要
文档 head 元数据应该遵循逻辑顺序:
- Charset 和 viewport(必须首先)
- 安全头(CSP,如果通过 meta 传递)
- Title 和 description
- Preconnect 和资源提示
- 样式表
- 社交媒体元数据
- 结构化数据
这个顺序确保浏览器在处理不太紧急的元数据之前先处理关键信息。
实用的基准
这是一个涵盖基本要素的最小化现代 HTML head:
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>描述性页面标题</title>
<meta name="description" content="清晰、准确的页面摘要。">
<link rel="canonical" href="https://example.com/page">
<link rel="stylesheet" href="styles.css">
</head>
根据实际需求在此基准上添加——而不是因为你在样板代码中看到过。
结论
最佳的 HTML head 实践归结为有意识性。每个元素都应该证明其存在的价值。当你将 head 视为协调层而不是垃圾场时,你会得到更快的页面、更清晰的标记和更少的意外。
常见问题
浏览器需要在开始解析文档内容之前知道字符编码。如果 charset 声明出现得太晚,浏览器可能已经错误地解释了字符,导致编码错误和乱码文本,这些问题无法在不重新加载页面的情况下纠正。
只有当你的页面可能在社交平台上被分享时才需要。Open Graph 标签控制你的内容在 Facebook、LinkedIn 和类似服务上分享时的显示方式。对于内部页面、管理面板或不太可能被分享的内容,这些标签会增加不必要的字节而不提供任何益处。
Preconnect 执行完整的连接设置,包括 DNS 查找、TCP 握手和 TLS 协商。DNS-prefetch 只将域名解析为 IP 地址。对于你肯定会使用的关键第三方源使用 preconnect。对于可能需要但不太确定的资源使用 dns-prefetch。
可以,你可以使用将 http-equiv 设置为 Content-Security-Policy 的 meta 标签。但是,基于 meta 的 CSP 有局限性。它不能使用某些指令,如 frame-ancestors 或 report-uri。要获得完整的 CSP 功能,应通过 HTTP 头传递。
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.