customelements.define()必须在html解析前执行,否则标签被当作未知元素不升级;标签名须含短横线,类须继承htmlelement且显式命名,重复注册或未注册即使用均导致失败。

customElements.define() 必须在使用自定义标签前执行,否则标签只是普通未知元素,不触发生命周期、无 Shadow DOM、无法响应属性变更。
为什么 <my-button></my-button> 写了却没渲染
浏览器不会自动把任意带连字符的 HTML 标签识别为组件。它只认注册过的名称。
-
document.querySelector('my-button')能取到节点,但node instanceof MyButton是false -
this.shadowRoot为null,因为attachShadow()根本没被调用 -
connectedCallback完全不执行——连注册都没做,哪来的回调 - 常见错误提示:
Failed to execute 'define' on 'CustomElementRegistry': the name "my-button" has already been used,本质是重复注册;更普遍的情况是压根没注册就写了标签
constructor 里能读 this.getAttribute() 吗
不能。属性尚未解析,此时读取一律返回 null 或空字符串。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- 必须用
attributeChangedCallback响应变更,且需配合static get observedAttributes()显式声明监听列表 -
observedAttributes返回空数组或未定义 →attributeChangedCallback永远不会触发 - 想初始化时读属性?改用
connectedCallback:它在元素挂载后立即执行,此时所有属性已就位 -
constructor只做同步初始化:调super()、创建shadowRoot、设置初始结构(如innerHTML或克隆<template></template>)
attachShadow({ mode: 'closed' }) 有什么坑
调试时基本等于自断手脚。
-
mode: 'closed'下,el.shadowRoot恒为null,DevTools 里也看不到影子树结构 - 第三方库(如测试工具、a11y 扫描器)无法访问内部节点,导致测试失败或无障碍支持缺失
- 除非有强安全隔离需求(如嵌入不受信内容),否则默认用
'open' - Shadow DOM 的样式封装靠的是作用域机制,不是靠
closed模式实现的
发布前必须检查的三件事
Web Components 不是写完 class 就能扔进生产环境的。
- 确保所有依赖的 polyfill 已加载(如
@webcomponents/webcomponentsjs),尤其要覆盖 IE11 和旧版 Safari - 自定义标签名必须含连字符(
-),如my-button合法,mybutton或MyButton会直接报错 - 避免在
render()或生命周期中直接操作全局 DOM(如document.body.appendChild),这会破坏封装性,也容易引发内存泄漏
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










