原生 Web Components 尝鲜:不引入构建工具写一个可复用的情绪打卡胶囊
原生 Web Components 尝鲜不引入构建工具写一个可复用的情绪打卡胶囊十月六日的深夜窗外下起了一层薄薄的秋雾路灯在雨水洗过的玻璃上倒映出朦胧的光晕。我合上那些动辄需要 Vite、Webpack 打包才能运行的现代前端脚手架在空文件夹里随手新建了一个极简的 HTML 测试页。在我的手账系统里每一篇日记的开头都需要一个小小的“情绪打卡胶囊Mood Capsule”——展示当天的主要心情平静、治愈、焦虑、欣喜点击时能平滑展开一组备选的小图标切换后自动将数据保存到本地存储中。以前在组件库思维的惯性下为了做一个这样可复用的小组件开发者往往要面临沉重的前置链条安装 React 或 Vue、配置 TypeScript 编译环境、安装 CSS 模块打包器、配置组件导出规则、最后打包出一个几十 KB 的 JS 文件引入网页。只要换了一个没有构建环境的普通 HTML 页面这个组件就立刻变成了无法运行的死代码。其实现代浏览器早已全平台原生支持了Web Components原生组件标准。不需要安装任何 NPM 依赖不需要运行任何构建打包命令直接在原生 JavaScript 里定义一个继承自HTMLElement的类利用 Shadow DOM 封装样式隔离利用 Custom Elements 注册自定义标签我们就能像写原生的video或input标签一样写出一个可以在任何网页中直接通过mood-capsule随插即用的温润手账情绪小胶囊。Web Components 的三大支柱Web Components 并不是一个单一的 API而是由 W3C 推动、现代浏览器底层原生集成的三项标准特性的集合Custom Elements自定义元素允许开发者通过customElements.define(mood-capsule, MoodCapsule)向浏览器底层的标签解析字典中注册全新的语义化 HTML 标签。Shadow DOM影子 DOM为组件提供彻底的样式与 DOM 树物理隔离。在 Shadow DOM 内部写p { color: orange; }无论外部全局样式怎么写绝不会产生任何样式污染Style Leakage外部样式也无法轻易打破组件的封装。HTML Templates模板与插槽利用template和slot实现类似现代框架组件的插槽内容投影。这三项特性全部由浏览器内核C 层面原生实现运行速度极快零运行时Zero Runtime Overhead额外内存开销。手写原生情绪打卡胶囊实战我们来手写这个名为mood-capsule的生活小组件。整个组件的全部逻辑、结构与水彩质感样式全部内聚在一个独立的mood-capsule.js文件中// mood-capsule.js - 原生 Web Component 情绪打卡胶囊 class MoodCapsule extends HTMLElement { constructor() { super(); // 开启 Shadow DOM 隔离 this.attachShadow({ mode: open }); } // 声明需要监听的属性属性变化时自动触发响应式渲染 static get observedAttributes() { return [mood]; } connectedCallback() { this.render(); this.bindEvents(); } attributeChangedCallback(name, oldValue, newValue) { if (name mood oldValue ! newValue) { this.render(); } } get mood() { return this.getAttribute(mood) || 平静; } set mood(val) { this.setAttribute(mood, val); } render() { const moodIcons { 平静: , 治愈: ☕, 欣喜: ✨, 疲惫: ️, 焦虑: }; const currentIcon moodIcons[this.mood] || ; this.shadowRoot.innerHTML style :host { display: inline-block; font-family: -apple-system, BlinkMacSystemFont, PingFang SC, sans-serif; user-select: none; } .capsule-wrapper { display: inline-flex; align-items: center; gap: 6px; padding: 6px 14px; background: rgba(250, 246, 238, 0.85); /* 暖米宣纸色 */ border: 1px solid rgba(192, 108, 70, 0.25); border-radius: 20px; font-size: 13px; color: #3C322A; cursor: pointer; backdrop-filter: blur(8px); transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1); box-shadow: 0 2px 8px rgba(60, 50, 42, 0.04); } .capsule-wrapper:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(192, 108, 70, 0.15); border-color: rgba(192, 108, 70, 0.45); } .icon { font-size: 15px; } .label { font-weight: 500; letter-spacing: 0.5px; } /style div classcapsule-wrapper idcapsule-box title点击切换今日心情 span classicon${currentIcon}/span span classlabel${this.mood}/span /div ; } bindEvents() { const box this.shadowRoot.getElementById(capsule-box); const moodList [平静, 治愈, 欣喜, 疲惫, 焦虑]; box.addEventListener(click, () { // 简单循环切换心情 const nextIdx (moodList.indexOf(this.mood) 1) % moodList.length; this.mood moodList[nextIdx]; // 派发标准自定义事件Custom Event通知外层父级页面 this.dispatchEvent(new CustomEvent(mood-change, { detail: { mood: this.mood }, bubbles: true, composed: true // 允许穿透 Shadow DOM 边界向外冒泡 })); }); } } // 向浏览器注册原生标签标签名必须包含连字符kebab-case customElements.define(mood-capsule, MoodCapsule);在任意 HTML 中无痛使用这个组件的引入有多简单你不需要运行npm run dev不需要配置任何打包管线。直接在任何普通的 HTML 静态单页的head里引入该脚本!DOCTYPE html html langzh-CN head meta charsetUTF-8 title秋日手账/title !-- 直接引入原生脚本零打包开销 -- script typemodule src./mood-capsule.js/script /head body stylebackground: #FAF7F2; padding: 40px; h2十月六日雨后初霁的手账/h2 !-- 像使用原生标签一样直接声明 -- mood-capsule mood治愈/mood-capsule script // 原生事件监听无缝捕获心情变动 document.querySelector(mood-capsule).addEventListener(mood-change, (e) { console.log(今日心情已更新为:, e.detail.mood); // 可随手保存至 localStorage localStorage.setItem(today_mood, e.detail.mood); }); /script /body /html在浏览器中双击打开这个 HTML 文件它瞬间完美运行。Shadow DOM 内部所有的圆角、毛玻璃与渐变样式被死死保护在组件内部哪怕外部页面的全局样式把所有的div背景都设成了黑色这个小胶囊依然保持着它温润清透的秋日水彩米宣色。摆脱技术绑架的轻快感现代前端生态在带来工程化便利的同时也无形中建立起了极其厚重的“框架壁垒”。很多刚入行的同学离开 React 或 Vue 就不知道该怎么写一个复用组件。每次想在个人小项目里做一个轻巧的功能都被迫承受几百兆node_modules的沉重锁链。但当你真正回到浏览器原本的原生标准规范中时你会惊叹于现代 Web 底层的强大与优雅。不需要任何转译不需要构建工具。一段干净纯粹的 JavaScript在任何一个标准现代浏览器里就能自由奔跑。这种脱离了重型生态依赖的轻快感就像秋日雨后卸下了沉重湿漉的外套只穿着一件舒适透气的羊毛衫在微凉的晚风里轻盈前行。

相关新闻

容器镜像预热与 P2P 分发:大促弹性能否成功的物理瓶颈——Dragonfly 镜像分发调优

容器镜像预热与 P2P 分发:大促弹性能否成功的物理瓶颈——Dragonfly 镜像分发调优

容器镜像预热与 P2P 分发:大促弹性能否成功的物理瓶颈——Dragonfly 镜像分发调优很多微服务研发与运维团队在备战大促时,往往把精力全部聚焦在 HPA 指标算法、K8s 调度器并发速度以及应用启动冷预热上。然而,在大促流量洪峰真正砸过来的前几…

2026/10/7 8:29:15 阅读更多 →
基于 Web Worker 的前端超大 PDF 离线分页与多模态预处理架构

基于 Web Worker 的前端超大 PDF 离线分页与多模态预处理架构

基于 Web Worker 的前端超大 PDF 离线分页与多模态预处理架构在做企业级财务票据与报销凭单提取系统时,一个高频出现的灾难级用户操作,就是**“直接上传一个超大体积的多页扫描版 PDF”**。 很多企业财务在整理月末单据时,习惯把一整周的几十…

2026/10/7 8:29:15 阅读更多 →
跨线程上下文透传:Tool 执行期间 TraceId 与 MDC 丢失的排查与根治

跨线程上下文透传:Tool 执行期间 TraceId 与 MDC 丢失的排查与根治

跨线程上下文透传:Tool 执行期间 TraceId 与 MDC 丢失的排查与根治国庆前夕,我们在对智能客服与售后工单系统进行全链路压测时,监控看板上出现了一个非常诡异的现象:在日志检索平台(ELK)中,原本…

2026/10/7 8:29:15 阅读更多 →

最新新闻

Java版驰骋BPM(JFlow)工作流引擎集成实战:从配置到组织同步

Java版驰骋BPM(JFlow)工作流引擎集成实战:从配置到组织同步

简介:这是一套基于Java的低代码BPM工作流引擎项目资源,集成表单引擎、流程引擎与权限控制,适合国内企业快速搭建业务审批与自动化流程。包内含2000个文件,其中Java源代码约1694个,构成核心业务逻辑;另有HTM…

2026/10/7 10:41:24 阅读更多 →
Linux内核心智模型:宏内核设计哲学与一切皆文件的本质

Linux内核心智模型:宏内核设计哲学与一切皆文件的本质

1. 为什么“Linux内核”不是一段代码,而是一套活的生存策略你打开终端敲下uname -r,看到一串像6.8.0-50-generic这样的版本号,这背后不是冷冰冰的二进制指令堆叠,而是一套持续演化了三十年、被全球数百万工程师用真实业务压力反复…

2026/10/7 10:41:24 阅读更多 →
2026降AI率工具实测:自考论文如何改出人味?

2026降AI率工具实测:自考论文如何改出人味?

2026年自考、成考、国开这几类群体里,“降AI率”突然成了刚需。原因很简单:提交毕业论文、课程报告、甚至部分实践作业之前,不少学校开始用AIGC检测系统做筛查,红字标出“疑似AI生成比例”。我也被问过太多次“到底哪个降AI率工具…

2026/10/7 10:41:24 阅读更多 →
Spring Boot社区康养系统开发全流程:从数据库设计到答辩通关指南

Spring Boot社区康养系统开发全流程:从数据库设计到答辩通关指南

每年到课程设计和毕业设计的季节,总能看到一批同学在“社区健康管理/康养管理”这类题目上反复挣扎。题目看着不难,但真正动手时才发现,它跟普通的增删改查系统不太一样——你要面对的不是一张简单的业务表,而是“老人档案 健康数…

2026/10/7 10:41:24 阅读更多 →
反转链表全攻略:迭代、递归与区间反转一次讲透

反转链表全攻略:迭代、递归与区间反转一次讲透

最近刷力扣热题 100(Hot 100)时,我反复在评论区看到同一个现象:好几道中等难度题目的题解里,大家都会绕回来先补一遍“反转链表”。链表这种结构,不反转时觉得哪儿都顺,一涉及反转,指…

2026/10/7 10:41:24 阅读更多 →
Altium Designer中DXF导入与PCB板框生成全流程指南

Altium Designer中DXF导入与PCB板框生成全流程指南

1. 结构图导入与板框生成的整体思路拆解搞PCB设计的人都有一个共识:板框这东西,看着简单,实际上是最容易埋雷的环节之一。尤其是当你拿到一份结构工程师给的DXF文件,里面可能有几十条甚至上百条线段、圆弧、样条曲线,还…

2026/10/7 10:40:23 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →