12k
All articles

文档 Head 中究竟应该放什么

详解 HTML 文档 head 中应包含的内容,涵盖 charset、viewport、社交元数据、资源提示及结构化数据的排列顺序。

OpenReplay Team
OpenReplay Team
文档 Head 中究竟应该放什么

<head> 元素是 HTML 中最容易被误解的部分之一。开发者要么把见过的所有 meta 标签都塞进去,要么几乎留空。这两种做法都无法很好地服务于用户和网站。

本文为现代 HTML head 元素提供了一个清晰的思维模型——什么是必需的,什么是情境性的,以及什么是可以跳过的。

核心要点

  • 文档 head 充当协调层的角色,在可见内容加载之前告诉浏览器、搜索引擎和服务如何解释你的页面。
  • 必需元素包括 charset、viewport、title 和 meta description——省略这些会导致实际问题。
  • 资源提示如 preconnect、dns-prefetch 和 preload 可以提升性能,但应有意识地使用。
  • 许多常见的 head 元素(如 keywords meta 标签)在现代环境中没有任何益处,应该删除。

Head 作为协调层

将文档 head 视为一个协调层。它告诉浏览器、搜索引擎和其他服务在任何可见内容加载之前如何解释、渲染和优先处理你的页面。

head 处理三个核心职责:

  1. 文档元数据 – 编码、标题、描述
  2. 浏览器行为 – 视口、配色方案、渲染提示
  3. 早期加载决策 – 资源提示、关键资源、预连接

你的 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 标签帮助搜索引擎提供正确的语言版本。

主题和配色方案元数据

<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=nomaximum-scale=1 损害可访问性。除非有令人信服的理由,否则避免使用它们。

Generator meta 标签 – 这些会暴露你的 CMS 或框架版本。它们不提供用户益处,可能会造成安全隐患。

顺序很重要

文档 head 元数据应该遵循逻辑顺序:

  1. Charset 和 viewport(必须首先)
  2. 安全头(CSP,如果通过 meta 传递)
  3. Title 和 description
  4. Preconnect 和资源提示
  5. 样式表
  6. 社交媒体元数据
  7. 结构化数据

这个顺序确保浏览器在处理不太紧急的元数据之前先处理关键信息。

实用的基准

这是一个涵盖基本要素的最小化现代 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 声明必须出现在前 1024 字节内?

浏览器需要在开始解析文档内容之前知道字符编码。如果 charset 声明出现得太晚,浏览器可能已经错误地解释了字符,导致编码错误和乱码文本,这些问题无法在不重新加载页面的情况下纠正。

我应该在每个页面上都包含 Open Graph 标签吗?

只有当你的页面可能在社交平台上被分享时才需要。Open Graph 标签控制你的内容在 Facebook、LinkedIn 和类似服务上分享时的显示方式。对于内部页面、管理面板或不太可能被分享的内容,这些标签会增加不必要的字节而不提供任何益处。

preconnect 和 dns-prefetch 有什么区别?

Preconnect 执行完整的连接设置,包括 DNS 查找、TCP 握手和 TLS 协商。DNS-prefetch 只将域名解析为 IP 地址。对于你肯定会使用的关键第三方源使用 preconnect。对于可能需要但不太确定的资源使用 dns-prefetch。

我可以通过 meta 标签传递内容安全策略吗?

可以,你可以使用将 http-equiv 设置为 Content-Security-Policy 的 meta 标签。但是,基于 meta 的 CSP 有局限性。它不能使用某些指令,如 frame-ancestors 或 report-uri。要获得完整的 CSP 功能,应通过 HTTP 头传递。

Open-source session replay

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.

Star on GitHub12k

We use cookies to improve your experience. By using our site, you accept cookies.