节目信息
ShopTalk | 整理时间:二零二六年二月
主持人:Chris Coyier & Dave Rupert
节目简介
本期节目深入探讨了前端开发中的几个重要话题:Lit-HTML 在 Web Components 中的应用、Popover API 的隐式锚点功能、Safari 跨平台测试的困境,以及给 HTML/CSS/JavaScript 初学者的实用建议。两位主持人还分享了网站构建工具的选择经验。
核心话题讨论
话题 1:Lit-HTML 与 Web Components
Chris: 最近前端大师博客上有两篇关于 Web Components 的内容,其中一篇关于 Lit-HTML 的部分相当不错。其实很多人不知道,可以在 Lit Element 之外单独使用 Lit-HTML。
Dave: 我从那位开发者那里听说后,就推动他更深入地探讨了一下。我当时觉得这个点很多人都不知道,应该强调一下。
Chris: 是的,Lit-HTML 内部有个鲜为人知的酷功能。它在 HTML 标签模板字面量中也能实现类似效果,会在更新位置留下小标记,通过注释形式存在。
Dave: 它不会像 React 那样需要触发整个模板或上游的逻辑,也不必更新整个组件树。Lit Element 或 Lit HTML 只会更新发生变化的那部分内容。
Chris: 没错,如果你将计数从 2 改为 3,仅更新计数的文本部分。这就是使用库的原因——精准的 DOM 更新功能。
Dave: 我不明白为什么人们不直接接受这种模板字面量的方式,或者用 JSX 模板字面量也行,这样或许就能摆脱编译器的依赖。
Chris: 虽然 Babel 让你能够脱离编译器来使用 React 组件,但 Lit-HTML 这种技术在更广泛的 JavaScript 生态系统中尚未得到充分应用。
💡 要点: Lit-HTML 可以独立于 Lit Element 使用,提供精准的 DOM 更新能力。与 React 不同,它只更新变化的部分,不需要触发整个组件树的重新渲染。
话题 2:Popover 隐式锚点
Dave: 还记得我之前做的那个 Web 组件吗?一个菜单按钮,使用了弹出层 API。我意识到必须连接两件事:Popover ID 和按钮,还有锚点名称和位置锚点。
Chris: 你总是得为它们分配唯一的值并将两者关联起来,对吧?
Dave: 没错,这真麻烦。但如果它们都放在一个 Web 组件内部,还需要手动去记吗?后来我学到了一个新东西——锚点作用域。如果我在卡片范围内定义锚点,即使页面上有十五个卡片,也不会产生作用域泄漏。
Chris: 有趣,所以不需要为每个菜单设置唯一 ID?
Dave: 不需要!每个地方都可以使用相同的名字,因为你在限制其作用范围。这非常棒。
Chris: 我还学到了一个新知识——隐式目标。用于弹出层时,如果通过锚点定位打开,它内部存在一个隐式锚点,即触发它打开的元素。
Dave: 所以你将其外边距设置为零,并指定一个位置区域,它就会围绕该按钮打开,无需额外操作即可实现定位。
Chris: 完全不需要显式连接,它们默认就是关联的。
Dave: 这意味着不需要在 CSS 里特意创建唯一 ID,比如菜单-19 这种。因为支持 CSS 锚点定位的浏览器中,弹出框已具有隐式锚点。
💡 要点: Popover API 提供了隐式锚点功能,通过 anchor-scope 可以限定锚点作用范围。这简化了弹出层与触发元素的关联,无需为每个实例设置唯一 ID。
话题 3:Safari 跨平台测试困境
Dave: 有个问题来自阿德里安·西蒙斯:苹果是否应该像微软过去为 IE 提供跨平台机器镜像那样,提供用于 Safari 测试的虚拟机?
Chris: 如今在 Linux 或 Windows 上测试 Safari 几乎不可能,BrowserStack 这类工具速度慢且成本高昂。
Dave: 苹果其实有理由——只要下载免费的 Xcode,就能获得 iOS 模拟器,支持的 iOS 版本回溯得相当远。
Chris: 但那只适用于 Mac 用户。如果你是 Linux 用户呢?苹果能给你什么?
Dave: 我不认为会实现,但如果他们能做到提供带旧版 Safari 的 macOS 试用版,让 Linux 用户可以测试,那会很好。
Chris: 问题是旧版 Safari 上某些功能运作得太完美了,用户没有动力升级。如果我们都过于用心地支持五年前的 Safari,等于在鼓励用户继续不升级。
Dave: Safari 的存在是为了支持苹果的生态系统,不像 Chrome 作为在线软件业务,有动力让浏览器在任何设备上运行。
💡 思考: 跨浏览器测试的困境反映了平台厂商的战略差异。苹果的封闭生态策略与 Google 的开放策略形成对比,这对开发者来说是个持续的挑战。
话题 4:给 HTML/CSS/JS 初学者的建议
Dave: 有位听众卡米尔来信,她正在学习 HTML、CSS 和 JavaScript,想问初学者有哪些建议。
Chris: 选择原生技术作为爱好非常特别。我建了一个网站用于测试和玩这些技术——CodePen 是绝佳的入门起点。
Dave: 我喜欢构思一个有趣的微型组件,它能以优雅的方式完成某项功能。不必将其视为一个完整网站,而仅仅是一个组件或一次有趣的交互探索。
Chris: 我总是冒出各种想法,比如”我能不能用 CSS 做一个条形图?”然后直接动手试试。关键是思考那个最简单的实现版本会是什么样子,不是功能最齐全的版本。
Dave: 当你在玩转网络技术时,这些探索最终往往会回归到你日后从事的专业工作中。
Chris: 有很多 CSS 可以替代数百甚至数千行的 JavaScript 代码。如果你是那个了解如何通过代码提升交付速度的人,你就是公司中极具价值的资产。
Dave: CodePen 上也有人用 CSS 完整地创作出绘画级的效果,不断挑战技术极限。这种探索本身就充满乐趣。
💡 要点: 初学者应从小型项目入手,专注于单一组件或交互。CodePen 是理想的实验平台,探索性学习能培养解决实际问题的能力。
话题 5:网站构建工具选择
Dave: 有听众问,使用构建工具是否会对网站开发造成过度限制,以及云托管的内容管理系统是否合适。
Chris: 我们在业务中确定了三层方案。第一层是静态网站构建器,如 Jekyll、11ty、Astro,适合设置好就不管的项目。
Dave: 第二层呢?
Chris: Webflow 这类产品。它非常注重组件化设计,后端使用 React 技术,但生成的内容基本上是静态 HTML。适合需要一定自定义能力的客户。
Dave: 但 Squarespace 和 Wix 似乎也可以修改内容?
Chris: 是的,但实际操作中,客户经常更新到一半就打电话让我帮忙。这些工具的编辑自由度很高,但实际使用时人们往往不会频繁更新。
Dave: 第三层是什么?
Chris: Craft CMS,属于 WordPress、Drupal 这类内容管理系统。适用于更严肃的项目,需要变更管理、内容编辑流程,比如每天发布多篇稿件或管理结构化数据。
Dave: 其他值得考虑的 CMS?
Chris: Sanity 在我们的 Discord 群组中很受欢迎。Contentful 也不错,但要注意它的定价——免费计划之后直接跳到每月近千元,不像常规 SaaS 的渐进式定价。
💡 要点: 选择建站工具需考虑两个维度:定制需求和更新频率。低频更新用静态站点,中等需求用 Webflow,复杂业务用专业 CMS。
📚 技术术语
- Lit-HTML: Google 开发的 HTML 模板库,可在 Lit Element 之外独立使用,提供高效的 DOM 更新能力
- Popover API: 浏览器原生弹出层 API,支持隐式锚点定位,简化了弹出菜单等组件的实现
- anchor-scope: CSS 属性,用于限定锚点名称的作用范围,避免多个组件之间的 ID 冲突- 隐式锚点 (Implied Anchor): Popover API 的特性,弹出框自动关联触发它的按钮元素,无需显式声明
- Webflow: 可视化网站构建平台,生成静态 HTML,适合需要设计自由度的项目
- Craft CMS: 专业级内容管理系统,适合复杂的内容结构和编辑流程
💬 金句摘录
“当你在玩转网络技术时,这些探索最终往往会以某种方式回归到你日后从事的专业工作中。” —— Dave Rupert
“关键是思考那个最简单的实现版本会是什么样子,不是功能最齐全的版本,而是尽可能简单地完成这件事的最简方式。” —— Chris Coyier
“有很多 CSS 可以替代数百甚至数千行的 JavaScript 代码。如果你是那个了解如何通过代码提升交付速度的人,你就是公司中极具价值的资产。” —— Chris Coyier
“当一个你学习过的 API 实际上比你想象的更好时,这种感觉真不错。” —— Dave Rupert
🤔 思考与启发
本期节目展现了前端技术演进与开发者成长的几个关键思考:
- 技术深度决定开发效率: Lit-HTML 的精准 DOM 更新、Popover API 的隐式锚点,这些底层技术理解越深,开发效率越高。不必总依赖框架的”魔法”,原生能力往往更优雅。
- 学习路径的启示: 从小型组件实验开始,逐步积累经验。CodePen 上的”奇怪”探索(如 CSS 绘画)看似无用,却培养了深厚的功底,在实际工作中能提供更优的解决方案。
- 工具选择的务实主义: 建站工具没有银弹。静态站点、可视化构建器、专业 CMS 各有适用场景。关键是分析客户的真实需求——他们真的需要每天修改内容吗?
延伸思考: 随着浏览器原生能力越来越强(如 Popover API、Anchor Positioning),我们是否应该重新审视对 JavaScript 框架的依赖?原生 Web Components 加上精准的库(如 Lit-HTML)是否是更可持续的技术选型?
