Carbon 设计系统 React 图形组件库 @carbon/pictograms-react 使用指南 Carbon 设计系统 React 图形组件库 carbon/pictograms-react 使用指南【免费下载链接】carbonA design system built by IBM项目地址: https://gitcode.com/GitHub_Trending/carbo/carbon本篇指南以 packages/pictograms-react/README.md 为主体系统讲解 IBM Carbon Design System 官方 React 图形Pictogram组件库carbon/pictograms-react的安装方式、模块导入策略、颜色定制与无障碍a11y实践并结合仓库源码深入剖析其底层渲染原理、类型生成机制与构建流程。读完本文你将能够在 React 应用中正确引入 pictogram 组件、按设计规范自定义填充色并写出对屏幕阅读器友好、可聚焦的 SVG 图形。carbon/pictograms-react当前仓库版本 11.110.0是 packages/pictograms 中 1500 张官方 SVG 图形pictogram的 React 组件化封装。它不直接存放图形资源而是通过构建脚本把packages/pictograms/src/svg/下的原始.svg文件批量转换为可被 React 组件消费的 JavaScript 模块同时提供 ESM、CommonJS、UMD 三种模块格式和完整的 TypeScript 类型声明。它被广泛应用于数字产品与软件产品中帮助团队在不引入整棵组件树的前提下快速复用 Carbon 官方图形资产。一、安装与版本要求在项目中安装carbon/pictograms-react可以使用 npmnpm install -S carbon/pictograms-react如果项目使用 Yarnyarn add carbon/pictograms-react从 package.json 可以看到本包的运行时约束peerDependenciesreact 16即要求宿主项目安装 React 16 及以上版本本包不会重复捆绑 Reactdependenciescarbon/icon-helpersSVG 属性装配与渲染工具、prop-types组件运行时类型校验、ibm/telemetry-js遥测采集sideEffects:false声明模块无副作用便于 webpack、Rollup 等打包器进行 tree-shaking按需摇掉未使用的组件。二、组件导入方式2.1 ESM 命名导入推荐每个图形对应一个以 PascalCase 命名的 React 组件直接按名称从包入口导入即可import { Airplane } from carbon/pictograms-react;组件名称由原始 SVG 文件名转换而来。例如packages/pictograms/src/svg/airplane.svg对应的组件就是Airplanepackages/pictograms/src/svg/cloud--analytics.svg对应的组件是CloudAnalytics双连字符--会被转换为 CamelCase 的驼峰分隔。2.2 CommonJS 导入对于未启用 ESM 的构建环境包提供了 CommonJS 版本lib目录const { Airplane } require(carbon/pictograms-react);2.3 模块格式与 UMD包在发布时同时产出三种格式分别对应 package.json 中的入口字段入口字段目录格式适用场景mainlib/index.jsCommonJSNode.js / 传统打包器modulees/index.jsES Modulewebpack / Rollup 等现代打包器—umd/UMD浏览器script直接引入其中es与lib目录均由 tasks/build.js 中的构建任务生成先用carbon/icon-build-helpers的builders.react基于carbon/pictograms/metadata.json生成组件源码再通过 TypeScript 编译器分别以ESNext和CommonJS两种模块体系产出声明文件。2.4 查找某个图形的导入路径仓库中每个图形的原始定义位于 packages/pictograms/pictograms.yml该文件为每张图提供了三项关键元数据name文件级标识名如accelerated-computing用于生成组件名friendly_name人类可读的友好名称如Accelerated computing用于设计资产检索aliases检索别名如speed、stopwatch、fast用于模糊搜索。如果你在开发时不确定某个图形的准确导入路径可以在该 YAML 文件中按关键词反查name再据此推导出组件名。三、通过fill属性定制图形颜色所有 pictogram 组件生成的svg都支持通过fill属性修改填充色。官方推荐的方式是传入自定义 class 名在 CSS 中设置该属性比内联样式更易维护、可复用也更适合主题切换/* CSS 自定义类名将图标填充色设置为 rebeccapurple */ svg.my-custom-class { fill: rebeccapurple; }import { Airplane } from carbon/pictograms-react; function MyComponent() { return ( button Airplane aria-labelAdd classNamemy-custom-class / /button ); }需要说明的是className与fill都属于透传到svg节点的常规属性最终由底层的carbon/icon-helpers统一装配详见第五节。四、无障碍支持聚焦与aria-label默认情况下carbon/pictograms-react生成的图形被视为装饰性内容decorative content即只要组件上未传入特定的可访问性相关 props渲染出的svg就会被自动加上aria-hiddentrue屏幕阅读器不会朗读它。这种默认行为对纯装饰图形是正确且必要的可以避免噪音。4.1 让图形被屏幕阅读器朗读当你希望图形承载语义信息例如作为按钮的一部分传达动作含义时传入aria-label或aria-labelledby即可import { Airplane } from carbon/pictograms-react; function MyComponent() { return ( button Airplane aria-labelAdd / /button ); }传入这两个属性中的任意一个后组件会自动为svg节点补充合适的role具体为roleimg从而被辅助技术正确识别为一个图像角色。4.2 让图形获得键盘焦点如果希望svg本身能接收焦点例如作为可点击图形需要显式传入tabIndeximport { Airplane } from carbon/pictograms-react; function MyComponent() { return Airplane aria-labelAdd tabIndex0 /; }当同时传入tabIndex与aria-label或aria-labelledby时组件会在底层svg上设置对应的tabindex并把focusable设为true以兼容旧版浏览器如 Internet Explorer 11对 SVG 焦点支持不足的问题。4.3 属性装配的源码级原理上述默认与条件行为并非散落在每个组件里而是统一由依赖包carbon/icon-helpers中的 getAttributes 函数实现其核心逻辑为为每个svg注入默认属性focusable: false与preserveAspectRatio: xMidYMid meet其中focusable是字符串属性因此不使用布尔值若传入的 attributes 中存在aria-label或aria-labelledby则设置role img若此时还传入了tabindex则同时将focusable置为true并写入tabindex否则纯装饰场景设置aria-hidden true。该函数的注释中还引用了allyjs.io关于 SVG 聚焦的文档说明focusable的兼容性处理是经过调研的刻意设计。相应逻辑也在 getAttributes 的测试 中覆盖。五、底层渲染原理从 SVG 文件到 React 组件pictogram 组件并没有在运行时直接读取.svg文件而是把图形描述为图标描述符icon descriptor。描述符是一个纯数据对象结构定义于 types.tsinterface IconDescriptor { elem?: string; // 元素名默认 svg attrs?: Recordstring, string; // 该元素的属性集合 content?: ArrayIconDescriptor; // 子节点可递归嵌套 path、circle 等 }在非浏览器环境或需要字符串输出的场景toString 会把描述符递归序列化为 SVG 字符串在浏览器场景toSVG 则会通过document.createElementNS(http://www.w3.org/2000/svg, elem)递归创建真实的 DOM 节点。两者都会在根节点上调用getAttributes完成前述无障碍属性的装配。React 组件层则由构建任务 tasks/build.js 中的builders.react.run(metadata, ...)批量生成它以carbon/pictograms构建出的metadata.json为输入为packages/pictograms/src/svg/下的每一张图形生成一个独立的 React 组件文件并最终聚合出index.js作为包入口。生成的文件带有 “Code generated by carbon/pictograms-react. DO NOT EDIT.” 的横幅注释明确这些产物是构建生成、不应手工修改。六、TypeScript 支持carbon/pictograms-react对 TypeScript 一等公民支持。package.json的types字段指向es/index.d.ts构建脚本在产出 JS 的同时会生成配套声明为每个图形组件生成独立的.d.ts声明其类型为CarbonPictogramType见 tasks/build.js 中的generateModuleTypes汇总入口类型index.d.ts导出通用Icon组件与CarbonPictogramProps、CarbonPictogramType类型按打包器输出格式Rollup 的单引号与 tsdown 的双引号分别解析 ESM 与 CommonJS 的分桶bucket导出并为每个 bucket 生成对应的声明文件。这意味着在 TypeScript 项目中import { Airplane } from carbon/pictograms-react即可获得完整的属性类型提示与校验。七、遥测、许可证与进一步阅读许可证本包以 Apache 2.0 License 开源。IBM Telemetry包通过postinstall脚本运行ibmtelemetry --configtelemetry.yml配置见 packages/pictograms-react/telemetry.yml仅收集去标识化、匿名化的指标数据例如 JSX 属性名是否使用了aria-hidden、aria-label、tabIndex等可访问性属性。安装即表示同意采集可通过环境变量等方式退出采集。图形资产源头所有图形的原始 SVG 位于 packages/pictograms/src/svg其清单与别名定义在 packages/pictograms/pictograms.yml配套的贡献指南见 packages/pictograms/docs/contributing.md。框架生态对照除 React 外Carbon 还提供了carbon/pictograms纯 SVG/SCSS 资产以及 Vuepackages/pictograms-vue等变体便于在不同技术栈间复用同一套图形语义。【免费下载链接】carbonA design system built by IBM项目地址: https://gitcode.com/GitHub_Trending/carbo/carbon创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考