标签内容默认不渲染、不执行脚本、不加载资源,必须用 document.importnode(tmpl.content, true) 克隆使用;其内禁用 ,绑定需手动实现;工厂函数封装输入数据→dom节点逻辑;web components 是唯一零构建真组件方案,但需遵守命名与 shadow dom 规范。

直接用 <template></template> 标签不等于有了组件
浏览器遇到 <template></template> 会跳过解析,里面的内容既不渲染、也不执行脚本、更不加载图片或字体。你写再多结构,不配 JS 克隆插入,页面就是空白——这不是 bug,是规范行为。
常见误操作包括:innerHTML = tmpl.innerHTML(破坏表单状态)、把 <template></template> 当 Vue 的 <template></template> 用(它不支持 v-if)、或在 <tbody> 里直接放 <code><template></template>(浏览器可能丢弃整块)。
- 必须用
document.importNode(tmpl.content, true)克隆,不是cloneNode(true)——前者保留<select></select>选中态、<input checked>状态,后者会丢失 -
<template></template>内不能有<script></script>或<style></style>,它们不会自动执行;如需样式,得手动adoptedStyleSheets或外链 - 插值语法如
{{title}}是纯文本,JS 不识别,得靠querySelectorAll('[data-bind]')手动替换
<template></template> + 工厂函数才是可复用的最小闭环
所谓“组件”,本质是输入数据 → 输出 DOM 节点。纯 HTML 没函数、没作用域,所以必须封装成 JS 函数:
- 工厂函数接收配置对象(如
{ title: '新闻', items: [...] }),返回DocumentFragment,不是字符串 - 模板内用
data-bind="title"而非class="title",避免样式类与绑定逻辑耦合 - 禁止硬编码 ID(如
id="card-1"),多次调用会导致重复 ID,影响getElementById或 CSS#id选择器 - 若需更新,缓存首次生成的节点,后续只改
textContent或dataset,不重新克隆——否则失去性能优势
CDN 引入组件库时,bootstrap.bundle.min.js 不能省
Bootstrap 5 的交互功能(模态框、下拉菜单、折叠)依赖 Popper 和内部事件系统,单独引入 bootstrap.min.js 会导致 data-bs-toggle 完全失效,控制台无报错,但点击没反应。
- 务必用
bootstrap.bundle.min.js,它已打包 Popper,一行搞定 - 图标缺失?大概率漏了
bootstrap-icons或font-awesome的 CDN,别只引 CSS 忘 JS(Font Awesome 6 无需 JS,但 Bootstrap Icons 需要) - 服务端渲染(如 Flask/Gin)时,CDN 地址必须是完整 HTTPS,不能写
./js/bootstrap.js——浏览器会按当前路由拼路径,404 是常态 - 混用自定义 CSS 和 Bootstrap class(如一边写
btn btn-primary,一边又写.my-btn { background: blue })必然导致样式覆盖难排查
Web Components 是唯一不依赖构建工具的真组件方案
如果你坚持零构建、纯前端、跨项目复用,且不想手写工厂函数,customElements.define() 是目前最稳的原生路径。但它有硬约束:
- 组件名必须含短横线,如
"nav-bar","Navbar"会被浏览器拒绝注册 -
<template></template>内不能写<style></style>,CSS 得通过adoptedStyleSheets注入,或用shadowRoot.appendChild(styleEl) - Shadow DOM 默认
mode="closed",外部 CSS 进不去;要继承全局样式,显式设mode="open" - 事件监听必须写在
this.shadowRoot.addEventListener(),写document.addEventListener()监不到内部按钮点击
真正容易被忽略的是:所有这些方案——<template></template> 工厂、CDN 组件库、Web Components——都只是“让 HTML 看起来像组件”,背后全是 JS 在调度。HTML 本身仍是静态字符串,没数据流、没响应式、没生命周期。指望它自己活过来,就等于指望纸片自己走路。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











