html 中 不能直接用 ,因浏览器原生不支持服务端 include 语法;可行方案仅三种:服务端注入(最稳、seo 友好)、构建时处理(适合现代前端)、客户端 js 加载(慎用,仅限非关键内容)。

HTML 中 不能直接用 <include></include>?
浏览器原生不支持类似服务端的 include 语法,<!--#include--> 或 <include src="..."></include> 在纯 HTML 文件里完全无效——打开就是空白或报错。这不是你写错了,是标准没这功能。
真正能落地的复用方式只有三种:服务端注入、构建时处理、客户端 JS 加载。选哪种,取决于你有没有后端、用不用打包工具、是否允许 JS 执行后才补全 head。
用 Node.js / PHP 等后端动态生成
最稳、SEO 友好、首屏即完整。所有 meta、link、script 都在服务端拼好再吐给浏览器,爬虫和用户看到的是同一份渲染结果。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- PHP 示例:
include 'head-frag.php';放在每个页面内,head-frag.php里直接写<meta>、<link rel="stylesheet">等 - Node.js(Express):
res.render('page', { title: '首页' }),模板中用 - 注意:路径必须相对于模板根目录;变量要提前传入,比如
<title></title>
用 Webpack / Vite 构建时注入 片段
适合现代前端项目。不是运行时加载,而是在打包阶段把公共 head 内容“编译进去”,最终 HTML 是静态文件,但内容已复用。
- Vite 插件如
vite-plugin-html:在vite.config.ts中配置inject: { data: { headContent: '<meta name="theme-color" content="#2563eb">' } },模板里写 - Webpack 的
html-webpack-plugin:通过templateParameters注入,再用 EJS 语法嵌入 - 风险点:如果 head 里有需要 runtime 判断的内容(如用户登录态),构建时无法动态生成,得留空或改用 JS 注入
用 JS 动态插入 内容(慎用)
仅适用于非关键、可延迟、不影响 SEO 的场景,比如统计脚本、A/B 测试配置。它会在 DOM 加载后执行,搜索引擎可能忽略,LCP 等指标也会受影响。
- 基础写法:
document.head.innerHTML += '<meta name="foo" content="bar">';—— 但会重写整个 head,破坏原有节点顺序和事件绑定 - 安全做法:用
document.createElement+appendChild逐个加,例如:const meta = document.createElement('meta'); meta.name = 'viewport'; meta.content = 'width=device-width'; document.head.appendChild(meta); - 别忘了加
defer或放在底部,避免阻塞解析;也别在DOMContentLoaded前就操作document.head
真正难的不是怎么写,而是判断哪部分 head 必须服务端/构建时搞定(比如 <title></title>、<meta name="description">、关键 CSS)、哪部分可以放 JS 里(比如热更新的埋点 ID)。混用时容易漏掉一两个 meta,上线后才发现分享卡片没图没描述——这种细节,比语法本身更常出问题。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










