快速原型阶段必须保留doctype-first、html-lang-require、id-unique、tag-pair四条硬性规则,因其一旦缺失将导致怪异模式、无障碍失效、DOM不可控及结构错乱,且无法批量修复;其余规则可临时禁用但须标注原因并限期恢复。

快速原型阶段不该牺牲可维护性底线,HTML质量妥协必须可控、可追溯、可批量修复。
原型期禁用但必须记录的硬性规则
不是所有规则都适合在原型阶段关闭——有些一旦放开,后续几乎无法自动修复。这些规则必须保留,哪怕报错也得人工确认:
-
doctype-first:缺失或错位的<!DOCTYPE html>会直接导致 IE 或旧 WebView 进入怪异模式,样式和 JS 行为全乱,无法靠后补救 -
html-lang-require:没有lang属性的页面,屏幕阅读器无法切换语音,无障碍测试一票否决,且无法通过脚本批量注入(lang 影响整个文档根节点) -
id-unique:重复id会让document.getElementById()、CSS ID 选择器、锚点跳转全部失效,JS 脚本行为不可预测,后期 grep + 替换极易出错 -
tag-pair:未闭合标签(如<p>内容<div>嵌套</p>)会被浏览器自动修正,DOM 结构与源码严重不一致,W3C 验证直接报错,且无法用正则安全修复
可临时禁用但需标注原因的规则
这些规则影响体验或协作效率,但不破坏基础功能,可在 .htmlhintrc 中设为 false,同时在注释中说明理由和预计恢复时间:
-
attr-value-double-quotes:原型中常写img src=logo.png快速过一遍,但需在注释里写<!-- HTMLHint disable-line attr-value-double-quotes: prototyping, will re-enable before PR --> -
attr-lowercase:临时允许onClick或data-Meta等命名,但禁止混用(比如同一文件里既有class又有CLASS),避免后期 grep 时漏掉大写变体 -
title-require:单页原型常无标题,但需确保每个<html>标签内至少留一个占位<title>[WIP]</title>,防止空 title 被 SEO 工具误判为垃圾页
原型交付前必须运行的三步补救检查
原型转正式开发前,不能只靠人眼扫一遍。以下命令必须执行,且失败即阻断合并:
立即学习“前端免费学习笔记(深入)”;
- 运行
htmlhint --rule "{'tagname-lowercase': true}" src/**/*.html:强制校验标签小写,这是语义化和后续自动化工具(如 Prettier、Svelte/Vue 模板解析)的前提 - 用
grep -r 'class=' src/ | grep -v 'class="[^"]*"' | head -5快速抽检引号缺失情况——引号问题在模板引擎里极易引发 XSS 或属性截断 - 打开 Chrome DevTools → Elements 面板,右键任意元素 → “Edit as HTML”,手动删掉一个
</div>再回车,观察浏览器是否自动补全并移动结构——如果 DOM 自动重排剧烈,说明原始 HTML 存在隐式闭合错误,必须返工
团队协作中容易被忽略的“临时”陷阱
最危险的不是没写好,而是“先这样,回头再改”。实际中,这些“临时”状态往往持续数月:
- 用
<div class="card">代替<article class="card">时,没在 issue 里关联语义化升级任务,结果上线后 SEO 流量下降 12%,才想起补<article>,但已埋进 37 个组件里 - 关闭
alt-require后,图片全写成<img src="x.jpg">,等接入无障碍审计时,发现 200+ 处要补 alt,且设计师已离职,文案无从考证 - 把
<button onclick="submit()>当快捷写法,结果后期加权限控制时,发现所有按钮逻辑耦合在 HTML 里,无法统一拦截
真正省时间的做法,是把“原型容忍度”写进 MR 描述模板,每项豁免都带超链接指向对应 issue,并设定 72 小时内必须关闭。



















