html.customData是唯一可靠路径,必须通过配置合法JSON Schema文件(version: 1.1)显式定义自定义标签名、属性及valueSet枚举值,并确保路径正确、语言模式为html、editor.quickSuggestions.strings启用,否则VS Code完全静默不提示。

html.customData 配置是唯一可靠路径
VS Code 原生不识别非标准 HTML 标签(比如 <my-button></my-button>、<data-table></data-table>),也不会在输入 <my-> 时弹出补全建议。想让它“认识”你的自定义标签,必须通过 <code>html.customData 显式注入一份 JSON Schema 描述文件——这不是可选项,是强制要求。
这个配置指向一个或多个 .json 文件,每个文件定义一组标签名、属性、属性值类型和文档说明。VS Code 的 HTML 语言服务会在光标进入标签名或属性位置时,按顺序加载这些 Schema 并合并建议。
- 必须是合法 JSON 格式,且顶层为对象(不能是数组)
- 文件路径支持相对路径(相对于工作区根目录)或绝对路径
- 多个文件用数组写法:
"html.customData": ["./custom-tags.json", "./web-components.json"] - 如果路径写错或 JSON 解析失败,VS Code 完全静默,不会报错也不会提示,只会“假装没看见”
自定义 Schema 文件怎么写才有效
Schema 文件不是自由发挥的文档,它必须严格遵循 VS Code 定义的 html-data 格式。常见错误是照搬 OpenAPI 或 JSON Schema v7 规范,结果补全完全不触发。
最小可用结构示例(保存为 custom-tags.json):
立即学习“前端免费学习笔记(深入)”;
{
"version": 1.1,
"tags": [
{
"name": "my-button",
"description": "自定义按钮组件",
"attributes": [
{
"name": "size",
"valueSet": ["small", "medium", "large"]
},
{
"name": "variant",
"valueSet": ["primary", "outline", "ghost"]
}
]
}
]
}
-
version必须是1.1(目前最新且稳定支持的版本) -
tags是数组,每个对象至少含name字段;attributes可选,但加了才能补属性和属性值 -
valueSet是字符串数组,不是正则或类型描述;写"number"没用,得写["1", "2", "3"]或枚举字面量 - 如果只想要标签名补全(不关心属性),可以删掉
attributes段,但name和description仍需保留
Vue / Web Components 场景下特别注意语言模式
在 .vue 文件中,即使你配好了 html.customData,<my-button></my-button> 在 <template></template> 里依然不补全,大概率是因为 VS Code 当前语言模式不是 html,而是 vue 或 vue-html。HTML 语言服务默认只在 html 模式下加载 customData。
- 右下角点击语言标识,手动切换为
HTML(临时验证是否生效) - 长期方案:在
settings.json中添加映射:"files.associations": {"*.vue": "html"}(粗暴但有效) - 更精准做法(推荐):
"emmet.includeLanguages": {"vue-html": "html"}+ 确保html.suggest.enabled为true - Web Components(如 Lit、Stencil)若用
.ts注册自定义元素,Schema 无法自动发现;必须手写custom-tags.json并维护更新
补全出现但属性值不提示?检查 strings 提示开关
即使 Schema 正确、路径无误、语言模式匹配,你仍可能遇到:输入 <my-button size="|"></my-button> 时,下拉列表为空。这不是 Schema 问题,而是 VS Code 默认关闭了“在字符串内触发建议”的能力。
- 必须开启:
"editor.quickSuggestions": {"other": true, "strings": true} - 单独设
"strings": true就够,"other": true是为了兼容其他上下文(如 JS 中对象键) - 如果项目用了 ESLint 或 TypeScript 插件,它们可能覆盖该设置;建议在工作区
settings.json中显式声明 - 改完后执行
Developer: Reload Window,否则strings开关不生效



















