template.content.clonenode(true)是唯一可靠克隆方式,必须取content→clonenode(true)→插入,true不可省略,否则仅复制空fragment;需处理id/name冲突、事件重绑、script/style不执行等问题。

<template></template> 不是组件,只是浏览器跳过解析的占位容器;直接拿它渲染页面,首屏会空白、表单状态丢失、脚本不执行——性能优化不是加个标签就完事,得先搞清它怎么“活”起来。
为什么<template></template>克隆后表单控件状态全丢了
常见错误是用 cloneNode(true) 复制 <template></template> 内容,但该方法不保留 <input checked>、<select></select> 当前选中项、<textarea></textarea> 的用户输入值。这些状态只存在于真实 DOM 节点实例上,克隆时不会带过去。
正确做法是用 document.importNode(tmpl.content, true):它能穿透 Shadow DOM,保留表单控件的运行时状态,也兼容现代框架嵌套场景。
- 必须传第二个参数
true,否则只克隆结构,不深拷贝子节点 - 不能对克隆出的
DocumentFragment再调用innerHTML = ...,会清空已有状态 - 若需预设初始值,应在克隆后、插入前,通过
node.value = data.xxx或node.checked = true显式赋值
非首屏内容用<template></template>加载,但别配display: none
display: none 的区块仍参与 HTML 解析、CSSOM 构建和布局计算,只是不绘制——对商品列表页后 50 条、长图文页下半截,这会拖慢首屏可交互时间(FID)和最大内容绘制(LCP)。
用 <template></template> + IntersectionObserver 按需加载才是真懒加载:
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 模板内容写在
<template id="list-item"></template>里,完全不进渲染流程 - 监听目标元素进入视口时,才调用工厂函数生成真实 DOM 并
appendChild - 避免在模板内写
id属性,多次实例化会导致 ID 重复,破坏 CSS 选择器或document.getElementById查询
art-template 的 {{block}} 命名冲突会让继承链失效
大型门户常用 art-template 多层继承:layout → inner-layout → page。但如果多个子模板都定义了 {{block 'content'}},最末层会覆盖中间层的同名 block,导致“导航区插入点”被悄悄吞掉。
命名必须全局唯一且带区域语义:
- 用
'header-nav'、'main-hero'、'sidebar-recommend'替代泛泛的'content'或'body' - 所有 block 名维护在项目根目录的
blocks.json中,构建时校验是否重复 - 继承层级建议不超过三层,否则编译缓存命中率骤降,本地调试时改一个变量要等 8 秒以上
<template></template> 和 Web Components 的边界在哪
它不提供封装性,没有样式隔离,无法监听属性变更,也不自动处理资源加载——所谓“组件化”,只是把 HTML 片段抽出来,靠 JS 手动挂载和更新。
适合场景很明确:
- 静态卡片、弹窗、表单项组等低频、非强交互模块
- 服务端已吐出完整 HTML,前端仅需局部替换数据(如评论数、点赞态)
- 不依赖 scoped CSS、不需自定义生命周期、无跨团队复用诉求
一旦出现样式污染、频繁状态同步、多处绑定同一数据源,就得切到 Web Components 或轻量框架——<template></template> 是起点,不是终点。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










