UI组件前端【免费下载链接】octiconsA scalable set of icons handcrafted with ❤️ by GitHub项目地址https://gitcode.com/gh_mirrors/oc/octicons点击查看免费下载primer/octicons-react-symbols是 GitHub Octicons 图标集当前仓库 octicons为 React 应用提供的一套优化渲染方案它把每个 Octicon 的完整 SVG 绘图定义注册为全局共享的symbol页面上的每个图标实例只渲染一个轻量的svguse //svg引用节点。本文从安装、基础用法、嵌套去重机制、图标引用渲染原理、兼容性命名到自定义图标工厂逐一展开并结合本仓库 lib/octicons-react-symbols 下的源码与测试用例说明每个机制背后的实现细节读完即可在真实项目中落地并自行扩展。设计动机为什么需要共享 Symbols而不是重复渲染常规的 React 图标组件如 lib/octicons_react 中的组件每次渲染都会把完整的path绘图指令输出一遍。对于在页面中反复出现的图标状态标记、导航项、列表行内图标等这意味着大量重复的 SVG DOM 节点被创建和更新。primer/octicons-react-symbols的方案是把绘图定义与实例引用分离Symbol 层每个图标定义一个symbol含完整path绘图内容通过OcticonSymbols组件一次性注册到隐藏的 sprite 容器中引用层具体使用位置只渲染一个svguse href#symbol-id //svg引用尺寸与无障碍属性由引用组件负责。该包的自述文件lib/octicons-react-symbols/README.md明确指出这种模式对于在同一应用中反复渲染相同图标的场景尤为有用因为 symbol 定义可以共享而每个图标只渲染一个小的svguse /引用。从源码结构看src/Icon.tsx引用组件最终输出的正是外层svguse href{...}这一极简结构。安装在项目中使用 npm 安装即可npm install -S primer/octicons-react-symbols包的 peer 依赖为react与react-dom的 18.x 或 19.x 版本types/react、types/react-dom可选构建产物通过exports字段暴露类型声明与运行时代码具体可见 lib/octicons-react-symbols/package.json。基础用法Symbol 注册 引用渲染使用分两步先在应用根部或需要图标的子树根部挂载OcticonSymbols把需要用到的 symbol 注册进去然后在下游组件中直接渲染对应的IconReference组件。自述文件中的最小示例import {OcticonSymbols, CheckSymbol} from primer/octicons-react-symbols function RootLayout() { return ( OcticonSymbols symbols{[CheckSymbol]} App / /OcticonSymbols ) }下游组件正常渲染图标引用import {CheckIconReference} from primer/octicons-react-symbols function Status() { return CheckIconReference / }CheckSymbolCheck图标的 symbol 对象包含id与definition见 src/IconReference.tsx 中的OcticonSymbol接口CheckIconReferenceCheck图标的引用组件渲染svguse //svg。命名规律为${PascalCase图标名}Symbol与${PascalCase图标名}IconReference二者成对出现由构建脚本自动生成见下文生成管线一节。引用组件的 PropsIconReference组件即Icon组件接受的 Props 定义在 src/types.ts 的OcticonReferenceProps中Prop类型说明sizenumber \| small \| medium \| large渲染高度像素默认16字符串尺寸映射为 16/32/64fillstring填充色默认currentColor随 CSS 的color继承aria-labelstring提供后可访问名称同时让图标获得roleimgaria-labelledbystring引用外部元素作为可访问名称titlestring \| ReactElement渲染title子元素tabIndexnumber键盘聚焦支持非负数时focusabletrueidstring透传到svg的idclassNamestring透传到svg的class此外所有原生svg属性如data-testid、style、onClick等都会透传到底层svg元素ref也会转发到该元素——这一点由 src/tests/Icon.test.tsx 中的测试断言验证。嵌套与去重Context 驱动的 Symbol 注册机制OcticonSymbols支持嵌套。自述文件给出的规则是嵌套的OcticonSymbols组件只渲染那些尚未被祖先提供的 symbol。该行为由 src/OcticonSymbols.tsx 实现组件内部通过 React ContextOcticonSymbolsContext维护一个已注册 symbol ID 的Set。渲染流程为useContext读取祖先已注册的 ID 集合遍历本次symbols数组凡是 ID 尚未注册过的 symbol 才加入symbolsToRender并同步把 ID 加入新集合通过Provider把合并后的集合传给子树symbolsToRender非空时渲染一个aria-hiddentrue、width{0}、height{0}、displaynone的隐藏 spritesvg把各 symbol 的definition以Fragment形式写入其中否则不渲染任何 sprite 容器。对应测试 src/tests/OcticonSymbols.test.tsx 覆盖了三种关键场景重复注册去重同一 symbol 传入两次、以及嵌套层重复传入最终只渲染一个symbolquerySelectorAll(svg)长度为 1嵌套补充注册嵌套层传入的新 symbol 会被渲染而祖先已有的 symbol 不会重复渲染隐藏容器渲染symbol 渲染进隐藏 sprite 容器同时children正常输出。这条机制的实用价值在于应用可以按模块粒度注册图标例如每个路由各自声明自己用到的 symbol而不必担心全局出现重复定义或重复 DOM。引用渲染原理尺寸换算与无障碍默认值图标引用组件Icon负责把注册好的 symbol以正确尺寸渲染出来。核心逻辑在 src/Icon.tsx尺寸映射size支持数字与三个命名档位映射关系为small: 16、medium: 32、large: 64src/Icon.tsx最近自然高度closestNaturalHeight会在当前图标的自然尺寸如 16、24中选取不大于目标高度的最大值作为 viewBox 高度宽度按该自然尺寸的实际宽高比等比放大src/Icon.tsx。例如size{20}且图标只有 16/24 两档时会选择 16 的绘图、按比例放大到 20×20viewBox 与引用viewBox使用所选自然尺寸的宽高use href#${symbolId} /指向对应尺寸的 symbol ID如#symbol-octicon-check-16无障碍默认值未提供任何可访问名称时默认aria-hiddentrue且不设置role提供aria-label/aria-labelledby后aria-hidden不再设置、roleimg生效src/tests/Icon.test.tsx样式默认值fill默认currentColordisplayinline-blockoverflowvisible并通过style合并保留vertical-align: text-bottom传入的自定义style会与其合并测试见 src/tests/Icon.test.tsx键盘聚焦tabIndex大于等于 0 时focusabletrue否则focusablefalse测试见 src/tests/Icon.test.tsx。兼容性名称别名与弃用图标的迁移约定包内存在两套兼容性命名自述文件给出了明确的使用约定Play 别名当前受支持PlaySymbol与PlayIconReference是TriangleCircle这一图标对的带圆圈别名两者仍然受支持。别名 symbol 保留自己的 SVG ID因此注册PlaySymbol才能正常渲染PlayIconReference——迁移 symbol 与引用组件时必须成对进行。BookmarkFilled 与 RepoDeleted弃用保留旧图BookmarkFilled与RepoDeleted这两对仍然可用但带有弃用提示且只保留原始的 16px 绘图。它们的规范命名分别是BookmarkFill与RepoDelete这两对规范名称提供了 16px 与 24px 两个自然尺寸。src/tests/aliases.test.tsx 对此做了系统化验证测试遍历每个兼容对断言别名 symbol 保留独立 ID如symbol-octicon-play、引用指向各自尺寸的 symbol、别名与规范 symbol 的绘图子节点逐一相等且在注册别名与规范 symbol 后全文档中同一 ID 只出现一次。CHANGELOGlib/octicons-react-symbols/CHANGELOG.md同时记录0.3.0 版本为bookmark-fill与repo-delete补齐了 16px 与 24px 两套绘图同时保留play作为受支持的别名并保留bookmark-filled、repo-deleted旧名与其原有绘图。自定义 Symbols用 createIconReference 创建私有图标内置图标无法覆盖所有场景时可以使用createIconReference工厂函数自定义 symbol 与其配套的引用组件。该工厂的签名与类型定义在 src/IconReference.tsximport {createIconReference, OcticonSymbols} from primer/octicons-react-symbols const [StatusSymbol, StatusIconReference] createIconReference({ id: symbol-status, name: StatusIconReference, sizes: { 16: { definition: ( symbol idsymbol-status-16 viewBox0 0 16 16 path d... / /symbol ), id: symbol-status-16, width: 16, }, 24: { definition: ( symbol idsymbol-status-24 viewBox0 0 24 24 path d... / /symbol ), id: symbol-status-24, width: 24, }, }, }) function RootLayout() { return OcticonSymbols symbols{[StatusSymbol]}{/* Application content */}/OcticonSymbols } function Status() { return StatusIconReference aria-labelSuccess size{24} / }关键约束与实现细节ID 一致性每个尺寸的definitionsymbol的id与sizes中该尺寸的id字段必须指向同一个 SVG symbol ID否则use将引用不到定义返回结构工厂返回[symbol, IconReference]二元组IconReferenceResult第一个元素用于注册第二个元素用于渲染命名name字段用于设置引用组件的displayName方便在 React DevTools 中识别测试断言见 src/tests/OcticonSymbols.test.tsx多尺寸打包工厂会把各尺寸的definition以Fragment形式合并进同一个 symbol 对象src/IconReference.tsx并把每个尺寸的id与width提取为引用组件所需的sizes元数据——引用组件据此计算 viewBox、宽度缩放与use的 href。生成管线内置图标从何而来OcticonSymbols与CheckSymbol、CheckIconReference这类内置图标并非手写而是由构建脚本从图标数据自动生成script/build.tslib/octicons-react-symbols/script/build.ts读取primer/octicons/build/data.json图标名、各高度下的宽度与 SVG AST对每个图标生成${PascalCase名称}Symbol与${PascalCase名称}IconReference两个导出symbol ID 统一为symbol-octicon-${图标名}-${高度}如symbol-octicon-check-16viewBox 为0 0 ${width} ${height}通过 Babel AST 将 SVG 元素转为 JSX 写入src/generated/下每图标一个的.tsx文件并生成汇总导出index.ts生成文件头部均标注auto-generated by script/build.ts. Do not edit directly即源码中对生成文件不做手工修改构建命令为node script/build.ts rolldown -c见 lib/octicons-react-symbols/package.json 的scripts.build最终产物输出到dist。script/build.ts同时处理弃用逻辑当某图标标记为deprecated且存在aliasOf时生成的导出会附带deprecated Use ${Replacement}Symbol and ${Replacement}IconReference instead的注释这正是 README 中兼容性名称一节在生成代码层面的落地形式。写在最后适用场景与取舍从实现与测试看primer/octicons-react-symbols适合同一批图标在页面中大量复用的 React 应用符号定义只需注册一次页面节点显著变轻且尺寸、无障碍、焦点等行为由引用组件统一保证。若应用只需零星使用几个图标或需要更强的 tree-shaking 与按需加载特性可以对比本仓库中的 lib/octicons_react完整 React 组件与 lib/octicons_node 等实现按场景选择。无论选择哪种方案图标源文件 与 icon-metadata.json 都是各语言包装层的同一数据来源。赞分享UI组件前端【免费下载链接】octiconsA scalable set of icons handcrafted with ❤️ by GitHub项目地址https://gitcode.com/gh_mirrors/oc/octicons点击查看免费下载相关推荐primer/octicons-react-symbols 版本演进与 SVG Symbol 共享渲染机制解析primer/octicons react symbols 版本演进与 SVG Symbol 共享渲染机制解析 primer/octicons reactUI组件前端primer/octicons-react 使用指南在 React 中引入 GitHub Octicons 图标primer/octicons react 使用指南在 React 中引入 GitHub Octicons 图标 本篇指南以 lib/octicons_reUI组件前端使用 primer/octicons Node 包GitHub Octicons 图标库的安装、API 与 SVG 渲染实践使用 primer/octicons Node 包GitHub Octicons 图标库的安装、API 与 SVG 渲染实践 本文是 primer/octUI组件前端上一篇ROCm 7.14.0 内核驱动与固件包支持矩阵Instinct、Radeon 与 Ryzen 平台的版本对齐指南下一篇JAX vs PyTorchOpenLLaMA两种权重格式的性能对比与转换指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
google-api-python-client 贡献指南:从开发环境搭建、测试矩阵到代码风格全解析 后端 【免费下载链接】google-api-python-client 🐍 The official Python client library for Googles discovery based APIs. 项目地址: https://gitcode.com/gh_mirrors/go/google-api-python-client 点击查看 免费下载 导读
本文以 google-api-pyth… · 2026/9/25 5:54:56
智慧医院PPT落地指南:从架构图到可执行技术参数 简介:本资源是一份面向医院基建、智能化工程设计与医疗信息化从业者的三级甲等智慧医院智能化系统全流程规划设计方案PPT,共134页,系统回应了医疗现代化、建筑智能化与病房家庭化三大核心诉求。方案紧扣智慧医院建设实际痛点,深度… · 2026/9/25 5:54:56
Ubuntu安装全攻略:从镜像下载到双系统分区及初始化配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 5:54:56
高云FPGA ILA调试实战:从配置失效到波形捕获的全流程解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:24:06
CTF夺旗赛入门指南:从Web渗透到逆向分析的完整学习路径 1. CTF到底是个什么竞赛先说一句可能会得罪人的话:很多刚接触网络安全的人,是被"黑客""攻防""破解"这些词吸引进来的,但真正入行以后你会发现,CTF才是离"白帽思维"最近的训练场。CTF&… · 2026/9/25 6:24:06
ATGM332D RMC报文解析与北京时间转换实战:从原始数据到可用定位 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:24:00
ESP32换板为何不能直接运行?小智源码适配本质解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:24:00
CANoe中LIN诊断调度表4种切换模式深度解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:23:59
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37