ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

wp-calypso 组件库选型指南:在 WordPress.com 与 Gutenberg 生态中正确选择 Button 组件

wp-calypso 组件库选型指南:在 WordPress.com 与 Gutenberg 生态中正确选择 Button 组件 前端CMS【免费下载链接】wp-calypsoThe JavaScript and API powered WordPress.com项目地址https://gitcode.com/gh_mirrors/wp/wp-calypso点击查看免费下载在 wp-calypso 仓库中开发时最常遇到的一个困惑是“当我要写Button组件时到底应该用哪一个” 这份组件库选型指南将带你梳理wordpress/components、automattic/components、client/components、client/blocks以及各业务专用组件库的边界与适用场景并深入解析 WordPress.com 语境下组件命名、样式封装与复用规则的源码依据帮助你为具体界面做出有理有据的选型决策。背景组件选型为什么会成为问题wp-calypso即 client 目录所承载的 Calypso 单页应用是一个由大量 React 组件拼装而成的大型前端项目。仓库文档 docs/component-libraries.md 坦诚地描述了现状组件相当混乱同一组件存在多个“貌似相同”的版本缺少统一的设计系统和连贯的设计语言。多年来Automattic 内部出现过多个组件团队的形态也发起过统一设计语言的倡议但都没有真正彻底成功。因此在仓库中工作的人经常要面对一个没有标准答案的问题同一个概念比如按钮在不同上下文里该用哪份实现。本文档的目的就是为这个问题提供一套可操作的决策框架。三大组件来源先分清上下文再选型按照 docs/component-libraries.md 的指引当你在 Calypso 仓库中需要选择组件时核心依据是界面所处的上下文wordpress/components面向 WordPress.org 生态如块编辑器适用场景WordPress.org 语境下的界面典型代表是块编辑器Block Editor。特性由 Gutenberg 项目维护API 与视觉语言与 WordPress 编辑器保持一致。在仓库中的直接证据根目录 package.json 与 package.json 均声明了wordpress/components当前仓库锁定版本为^37.0.0说明 Calypso 内部也直接依赖这套组件来构建 Gutenberg 相关界面。一个值得注意的仓库内实践automattic/components中原来的Button组件见 packages/components/src/button/README.md已被标记为废弃文档明确建议改用wordpress/components的Button原因是旧按钮带有“aggressive and generic CSS”过于激进且通用的 CSS会在引入时破坏其他按钮的样式。这是“WordPress.org 语境优先使用wordpress/components”这条规则在源码层面的直接体现。automattic/components与client/components面向 WordPress.com 上下文适用场景WordPress.com 产品界面Calypso 的主体。automattic/components位于 packages/components是可独立发布的 npm 包供 Automattic 各产品复用。其入口 packages/components/src/index.ts 统一导出了Button、Gridicon、Card、Popover、SegmentedControl等一批纯 UI 基础组件目录下包含badge/、button/、card/、gravatar/、tooltip/等 50 余个基础组件文件夹。client/components位于 client/components是只属于 Calypso 应用内部的组件集合数量更多、更贴近业务如chart/、date-picker/、forms/、jetpack/、notice/、section-nav/等上百个组件目录。其说明文档 client/components/README.md 指出这些组件按 docs/coding-guidelines/css.md 的规范自带样式并从组件目录的style.scss手动加载。automattic/components的安装与使用方式见 packages/components/README.md# 安装组件库及其依赖的配色方案 yarn add automattic/components automattic/calypso-color-schemes// 引入颜色变量——整个应用只需导入一次 import automattic/calypso-color-schemes; // 引入所需组件 import { Button } from automattic/components; const CallToAction () ( Button primary onClick{ () alert( Thank you for taking action! ) } Take action now! /Button / );需要留意的是部分组件依赖wordpress/components的 CSS 样式才能正确渲染在 WordPress 插件中应把wp-components样式表声明为插件样式表的依赖在非 WordPress 项目中则直接引入node_modules/wordpress/components/build-style/style.css。client/blocks由基础组件组合而成的“复杂实体组件”适用场景代表应用领域实体的复杂组件。特性通常由多个 UI 组件组合而成并且通常连接到 Redux 状态能够分发 action。源码佐证client/blocks/README.md 明确写道Blocks 是由 UI 基础组件生成更复杂实体的 React 组件一般连接到状态、具备分发 action 的能力带有应用语义如 Site、PostCard、Comments 等概念其功能被封装起来便于在不同 section 中复用。目录实例client/blocks 下包含site/、post-card/reader-post-card、comments/、like-button/、follow-button/、signup-form/、importer/等数十个高复用性业务组件。以client/blocks/site/为例其入口 client/blocks/site/index.jsx 开头导入了自身样式./style.scss内部使用了SiteIcon另一个 block、SiteIndicator等组件并从calypso/state/selectors/*拉取 Redux 选择器、在文件末尾通过connect( mapStateToProps, {...} )连接 store见 client/blocks/site/index.jsx——这正是“blocks 连接 Redux、组合多个 UI 组件”定义的活例子。业务专用组件库项目内的第二层选择文档还提示你正在开发的具体项目可能拥有更专用的组件库。在 wp-calypso 仓库中这类例子包括automattic/jetpack-componentsJetpack 生态专用组件仓库中 Jetpack 相关代码大量分布在 client/components/jetpack 与 client/jetpack-cloud。woocommerce/componentsWooCommerce 生态专用组件。规则很简单先看目标界面属于哪个产品上下文优先使用该上下文对应的组件库只有当项目没有更专用选择时才回落到通用组件库。选型决策的本质没有唯一正确答案文档明确指出最终使用哪个Button取决于上下文、用例、约束与最终目标并不必然存在唯一正确答案。一个实用的判断路径可以归纳为界面是否属于 WordPress.org / 块编辑器语境 → 优先wordpress/components界面是否属于某个业务线Jetpack / WooCommerce 等且有专用库 → 优先专用库其余 WordPress.com 界面 → 在automattic/components与client/components中寻找最贴近需求的组件需要表达领域实体Site、PostCard、Comments且需要读写 Redux 状态 → 在client/blocks中查找或组合。如果仍然难以判断文档建议在Automattic/team-calypso团队中咨询并把你的决策心得补充回 docs/component-libraries.md帮助后来者。选型之外的硬约束组件怎么写、类名怎么取选型只是第一步真正决定“组件是否合格”的是命名与样式规范。这在 docs/components.md组件设计总纲与 docs/coding-guidelines/css.mdCSS/Sass 编码规范中有完整的定义它们与组件库文档直接互补。组件 vs 子组件命名空间的划分Calypso 的组件体系分为两类组件component由存放主文件index.jsx的文件夹代表是该文件夹的“命名空间”。子组件sub-component同一文件夹内用于渲染组件局部的其他*.jsx文件。由此产生三条结构性规则每个组件只有一个style.scss组件与子组件中的类名一律以组件名文件夹名为前缀子文件夹在功能上不依赖其父文件夹。也就是说子组件写 HTML 类名时要用所属文件夹即组件的名字样式也统一进该文件夹的style.scss。把一个子组件提升为独立组件拥有自己的文件夹之前必须想清楚一旦提升它的作用域与前缀就从局部变为全局、独立了。BEM 风格语法.component__element类名写作.my-component__element用__表示元素归属关系组件名持有index.jsx的文件夹名必须全局作用域、具体、含义清晰尽量避免.my-component h1这类裸 HTML 选择器能写.my-component__title就写后者详见 docs/coding-guidelines/css.md避免 Sass 缩进只有伪类选择器、媒体查询和is-modifier例外绝大多数选择器应该是样式文件根层级上的单类选择器。文件夹组织不要用目录结构表达语义任何组件文件夹都应能随时被移到 client/components 而不丢失含义或产生冲突。文件夹只为组织目的存在与语义不耦合。文档给出了两个典型例子错误示例把渲染文章元信息的组件放在my-sites/posts/meta-info——meta-info过于通用、脱离容器后含义不明应命名为post-meta或post-meta-info与父文件夹无关。命名对比若把分页导航写成posts/navigation.jsx类名是.posts__navigation作为posts的子组件随其迁移若移入独立文件夹posts/posts-navigation/index.jsx则类名变为.posts-navigation成为独立于posts的组件放在posts目录下仅仅是组织需要。两种做法都正确创建独立文件夹的取舍标准是我们希望这块 UI 的独立性有多强、它是否会被其他位置复用。任何超出直接父级的分组都只是组织性的不应影响类名与组件命名。复用的真相不在client/components也能被复用组件天然可复用与其在目录树中的位置无关——“可复用”不是组件放进client/components的前提。例如client/blocks/site组件被用于编辑器渲染当前站点、侧边栏的站点选择器、“Me” 页面中的站点展示等多个场景。真正放进client/components的是那些对各业务主 section 没有天然倾向、更纯粹的 UI 积木。表达力为什么放弃内联样式避免用内联 JS 样式作为 props最大的收益在于在“远端父组件”的上下文中修改子组件的场景。文档中的经典案例你想修改SiteIcon组件在my-sites侧边栏中展示时的边框颜色。渲染链是Sidebar → SiteSelector → Site → SiteIcon。若用内联样式就必须把 style prop 从Sidebar一路透传到site-icon沿途组件都要携带一个与己无关的属性被设计意图强行耦合。而借助 CSS 与命名约定只需在侧边栏的style.scss中写一行.sidebar .site-icon { /* 修改该上下文中 SiteIcon 的边框 */ }这种写法表达力强、易读且立即向阅读者传达“site-icon是sidebar的某个层级子组件”这一组合关系——样式表天然地反映了组件组合树同时因为特异性提高侧边栏样式表的构建顺序不再影响最终生效结果。把选型落到代码从 Button 组件看仓库实践结合仓库实际代码可以看到这套指南在真实组件上的体现automattic/components的Button曾在 packages/components/src/button/README.md 中记录了完整的 props 体系plain、compact、primary、borderless、scary、busy、href等其中href提供时会渲染a而非button并支持Gridicon图标组合——这些细节正是“组件库是产品语境基础设施”的证明。但该组件现已废弃废弃理由与 docs/component-libraries.md 的“按上下文选库”原则互为印证同一概念在 WordPress.org 语境块编辑器与 WordPress.com 语境中分别由不同实现承担且实现会随设计系统演进而迁移。常见问题与决策速查问题答案我要在块编辑器扩展里写按钮用wordpress/components我要在 WordPress.com 的 Calypso 界面写基础 UI优先automattic/components其次client/components组件代表 Site / PostCard 等实体且要连 Redux用client/blocks项目是 Jetpack / WooCommerce 专项先查automattic/jetpack-components、woocommerce/components等专用库旧版automattic/components的 Button 还能用吗已废弃改用wordpress/components的Button总结wp-calypso 的组件生态是“多库并存、按上下文取用”的体系wordpress/components服务 WordPress.org 语境automattic/components与client/components服务 WordPress.com 语境client/blocks承载连接 Redux 的复杂实体组件各业务线还有自己的专用组件库。选型没有唯一标准答案关键是先确认界面上下文与使用约束与此同时无论选哪套组件都必须遵守.component__element命名、单一style.scss、组件文件夹语义独立等仓库级规范——这正是 docs/component-libraries.md 与 docs/components.md、docs/coding-guidelines/css.md 共同构成的完整知识闭环。赞分享前端CMS【免费下载链接】wp-calypsoThe JavaScript and API powered WordPress.com项目地址https://gitcode.com/gh_mirrors/wp/wp-calypso点击查看免费下载相关推荐WordPress.com 前端组件解析AkismetIcon 图标组件在 wp-calypso 中的实现与使用WordPress.com 前端组件解析AkismetIcon 图标组件在 wp calypso 中的实现与使用 本文以 wp calypso 仓库中的 cl前端CMSwp-calypso 中的 A4APlusWpComLogo 组件A4A 与 WordPress.com 组合 Logo 的实现与使用指南wp calypso 中的 A4APlusWpComLogo 组件A4A 与 WordPress.com 组合 Logo 的实现与使用指南 导读 A4APlu前端CMSWordPress.com 插件搜索页组件解析PluginsSearchResultsPage 在 wp-calypso 中的实现与使用WordPress.com 插件搜索页组件解析PluginsSearchResultsPage 在 wp calypso 中的实现与使用 导读 Plugins前端CMS上一篇CherryUSB多类设备开发详解HID/MSC/音频设备驱动实现下一篇Cursor Free VIP5步高效解锁AI编程助手Pro功能的完整开源方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表