ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

从 CHANGELOG 看 @react-native-vector-icons/fontawesome-pro-solid 的版本演进与实现原理

2026/9/21 15:13:45 拓冰建站 浏览量
从 CHANGELOG 看 @react-native-vector-icons/fontawesome-pro-solid 的版本演进与实现原理 从 CHANGELOG 看 react-native-vector-icons/fontawesome-pro-solid 的版本演进与实现原理【免费下载链接】react-native-vector-iconsCustomizable Icons for React Native with support for image source and full styling.项目地址: https://gitcode.com/gh_mirrors/re/react-native-vector-icons本文以packages/fontawesome-pro-solid包的 CHANGELOG.md 为骨架梳理 Font Awesome Pro Solid 图标包从 0.1.0 到 1.1.2 的完整版本脉络并结合同目录下的 README.md、package.json 与源码实现图标集组件、静态导出、Expo 配置插件、iOS Podspec、Android 原生包解释每次变更背后的工程动机与落地细节。读完本文你将理解该包为何不内置字体文件、如何在 RN 与 Expo 中正确接入、static 导出与 expo plugin 各自解决什么问题以及依赖react-native-vector-icons/common的演进如何驱动包版本迭代。一、包定位一个只提供字形表、不提供字体文件的图标集包react-native-vector-icons/fontawesome-pro-solid是 react-native-vector-icons 家族中面向Font Awesome Pro Solid实心风格字体的独立子包。与免费图标包不同它在 README.md 开头用 IMPORTANT 提示明确声明本包不包含字体文件你必须自行提供。这是因为 Font Awesome Pro 是商业授权字体仓库不能随包分发.ttf。包内实际携带的是字形映射表glyphmap与接入脚手架glyphmaps/FontAwesomeProSolid.json图标名到字形码点的映射src/index.ts 与 src/static.ts图标集组件app.plugin.jsExpo 配置插件react-native-vector-icons-fontawesome-pro-solid.podspeciOS 资源接入android/src/main/Android 侧的空原生包与 Manifest。核心组件实现非常简洁src/index.tsimport { createIconSet } from react-native-vector-icons/common; import glyphMap from ../glyphmaps/FontAwesomeProSolid.json; export const FontAwesomeProSolid createIconSet(glyphMap, { postScriptName: FontAwesome7Pro-Solid, fontFileName: fa-solid-900.ttf, }); export type FontAwesomeProSolidIconName keyof typeof glyphMap; /** alias */ export default FontAwesomeProSolid;关键信息一目了然字体 PostScript 名为FontAwesome7Pro-Solid字体文件名为fa-solid-900.ttf与 Font Awesome 7 的命名体系一致0.1.0 版本即升级到 Font Awesome 7。createIconSet来自 packages/common/src/create-icon-set.tsx负责把字形表与字体名绑定成一个可直接渲染的 React Native 组件。文件头注释还标注了该文件由packages/generator-react-native-vector-icons的模板生成手工修改会在重新生成时丢失——这也是本仓库一切图标包由统一生成器产出的工程惯例。二、版本时间线从 0.1.0 到 1.1.2 的九次发布CHANGELOG.md 完整记录了该包的演进史下面按时间倒序还原每个版本的关键变更版本发布日期核心变更1.1.22026-05-24依赖更新react-native-vector-icons/common→ 13.0.11.1.12026-04-23修复expo plugin 导出问题PR #1909由 Vojtech Novak 贡献1.1.02026-04-12新增Expo config pluginsPR #1893由 Vojtech Novak 贡献1.0.02026-03-26依赖更新react-native-vector-icons/common→ 13.0.0首个 1.0 稳定版0.2.02026-03-20新增为图标家族暴露 static 静态导出PR #1880Vojtech Novak0.1.32026-03-17依赖更新react-native-vector-icons/common→ 12.4.20.1.22026-03-10生成器自动更新上游版本PR #1873Font Awesome 升级到 7.2.0PR #1874John Ferlitocommon → 12.4.10.1.12026-02-25修复增加 targetSdkVersion 以避免 READ_PHONE_STATE 权限PR #1866 / issue #1861Phecda Su0.1.02025-11-01新增升级 Font Awesome 到版本 7采用新包结构PR #1857John Ferlitocommon → 12.4.0九次发布呈现出一条清晰的能力演进主线先完成 Font Awesome 7 与新包结构的迁移0.1.0→ 修复 Android 权限隐患0.1.1→ 引入上游版本自动同步与 FA 7.2.00.1.2→ 补齐 static 静态导出0.2.0→ 迈向 1.0 稳定版1.0.0→ 打通 Expo 配置插件1.1.0/1.1.1→ 依赖持续跟进1.1.2。下文逐项展开这些变更的源码证据。三、关键变更的源码级解读3.1 Font Awesome 7 升级与新包结构0.1.00.1.0 是一次里程碑式发布将 Font Awesome 升级到版本 7 并采用新包结构。反映在源码上字体 PostScript 名变为FontAwesome7Pro-Solid见 src/index.tsREADME 的 Versions 章节给出包版本与上游字体版本的对照表RNVI 版本上游Font Awesome版本 0.1.07.1.0 0.1.17.2.0也就是说0.1.0 对应 FA 7.1.00.1.2 升级到 FA 7.2.0。表格中 Prior to version 12 的说明指在 react-native-vector-icons 主包版本 12 之前这个字体子包的版本号直接跟踪上游 FA 版本而独立成包后版本号改为跟随自身发布节奏上游字体版本通过 CHANGELOG 与上表单独追踪。3.2 自动同步上游版本0.1.20.1.2 引入生成器在生成过程中自动更新.yo-rc.json中的上游版本PR #1873并同步把 Font Awesome 升级到 7.2.0PR #1874。这与 src/index.ts 头部本文件由 generator 模板生成改动请在packages/generator-react-native-vector-icons中进行的注释互为印证整个字体包的生命周期上游版本、字体文件、字形表、组件模板都由统一生成器驱动CHANGELOG 里的生成器自动更新上游版本正是为了让这一流程免于手工维护。3.3 静态导出 static export0.2.00.2.0 为图标家族暴露 static 导出PR #1880解决在无法使用 React 组件的场景如静态图片源下引用图标的问题。src/static.ts 与 index.ts 内容一致但通过 package.json 的exports字段暴露独立入口./static: { import: { types: ./lib/typescript/module/src/static.d.ts, default: ./lib/module/static.js }, require: { types: ./lib/typescript/commonjs/src/static.d.ts, default: ./lib/commonjs/static.js } }因此开发者可以这样按需导入import { FontAwesomeProSolid } from react-native-vector-icons/fontawesome-pro-solid/static;配合react-native-vector-icons/common中的getImageSource机制见 packages/common/src/get-image-source.ts可把图标渲染为图片源用于Image或原生导航栏。包还通过./glyphmaps/*.json导出暴露字形表供需要直接读取码点的工具链使用。3.4 Expo 配置插件1.1.0 / 1.1.11.1.0 引入 Expo config pluginsPR #18931.1.1 修复其导出问题PR #1909均由 Vojtech Novak 贡献。插件实现位于 app.plugin.js逻辑清晰const { withInfoPlist } require(expo/config-plugins); module.exports (config) withInfoPlist(config, (c) { const projectRoot c.modRequest.projectRoot; const appPkg JSON.parse(fs.readFileSync(path.join(projectRoot, package.json), utf-8)); const fontDirName appPkg.reactNativeVectorIcons?.fontDir || rnvi-fonts; const fontsDir path.join(projectRoot, fontDirName, fontawesome-pro-solid); // 校验字体目录存在收集 .ttf 文件 // 将字体文件名追加进 iOS 的 UIAppFontsInfo.plist c.modResults.UIAppFonts [...new Set([...(c.modResults.UIAppFonts || []), ...fonts])]; return c; });插件做的事很聚焦读取应用 package.json 中可选的reactNativeVectorIcons.fontDir配置默认rnvi-fonts检查rnvi-fonts/fontawesome-pro-solid/目录把其中的.ttf注册进 iOS 的UIAppFonts并用Set去重防止与已有字体冲突。目录缺失或没有.ttf时抛出带路径的明确错误。使用方式README.md{ expo: { plugins: [react-native-vector-icons/fontawesome-pro-solid] } }更多 Expo 接入细节可参考 docs/SETUP-EXPO.md。1.1.1 的修复表明插件必须通过module.exports导出完整配置修改函数打包工具才能正确解析——这是该类插件最常见的坑点。3.5 Android targetSdkVersion 与 READ_PHONE_STATE 权限0.1.10.1.1 修复了一个隐蔽的 Android 问题增加targetSdkVersion以避免应用被授予READ_PHONE_STATE权限issue #1861 / PR #1866。从源码看Android 侧是一个空实现的原生包VectorIconsFontAwesomeProSolidPackage.kt 继承BaseReactPackagegetModule恒返回nullgetReactModuleInfoProvider返回空映射——它不提供任何 NativeModule只为与旧版 autolinking 机制兼容而存在。这正是权限问题的根源旧版 Android 构建工具在targetSdkVersion缺失时可能对空包做默认权限处理从而意外引入READ_PHONE_STATE显式声明targetSdkVersion后Gradle 构建按新版本策略处理权限不再泄漏。Manifest 本身完全干净AndroidManifest.xml 与 AndroidManifestNew.xml 均无权限声明印证了该修复的目标是确保不请求任何敏感权限。3.6 依赖演进与 common 包同步升级CHANGELOG.md 中四次发布0.1.3、1.0.0、1.1.2 及 0.1.0 的 common 12.4.0、0.1.2 的 12.4.1都在更新同一依赖react-native-vector-icons/common12.4.0 → 12.4.1 → 12.4.2 → 13.0.0 → 13.0.1。这在 package.json 中体现为dependencies: { react-native-vector-icons/common: workspace:^ }——monorepo 内通过 workspace 协议引用共享核心。由于createIconSet、getImageSource、动态加载等全部实现在 common 包中字体子包本身只是一个字形表 字体名的薄封装因此 common 的每次 API 升级都必须同步驱动各字体包发版这是 CHANGELOG 中依赖更新频繁出现的根本原因。四、安装与实战使用4.1 安装npm install react-native-vector-icons/fontawesome-pro-solid包对 Node 的要求为 18.0.0见 package.json 的engines字段expo/config-plugins为可选的 peer 依赖仅使用 Expo 插件时需要。4.2 提供字体文件关键步骤由于包不携带字体使用前必须将授权获得的fa-solid-900.ttf放到应用根目录下rnvi-fonts/fontawesome-pro-solid/fa-solid-900.ttf默认目录为rnvi-fonts也可在应用的 package.json 中自定义{ reactNativeVectorIcons: { fontDir: my-fonts } }fontDir同时被 iOS 的 Podspec 与 Expo 插件读取保持两处配置一致即可。字体放入后iOS / macOS构建时由 react-native-vector-icons-fontawesome-pro-solid.podspec 自动处理——Podspec 会从应用根目录向上查找最近的 package.json读取reactNativeVectorIcons.fontDir将fontawesome-pro-solid目录下的.ttf拷贝进 pod 自身的fonts/目录先清理旧文件再通过s.resources fonts/*.ttf注册为资源。Podspec 同时声明支持 iOS、tvOS 9.0、visionOS 1.0Android字体通过构建脚本自动拷贝进 assets无需手工干预README 中说明 The font will be automatically copied during the build process for both iOS and Android。4.3 渲染图标import { FontAwesomeProSolid } from react-native-vector-icons/fontawesome-pro-solid; FontAwesomeProSolid namehouse color#ff0000 size{20} /name的类型即字形表键名FontAwesomeProSolidIconName可享受完整的 TypeScript 自动补全与拼写检查。其余 props 与 React NativeText组件一致支持style、onPress等。4.4 Expo 项目接入在app.json或app.config.js的plugins数组中加入包名即可见上文 3.4 节expo prebuild时会自动把字体注册进 iOSInfo.plist的UIAppFonts。五、总结react-native-vector-icons/fontawesome-pro-solid的 CHANGELOG 虽然只有短短九条记录却浓缩了一个字体子包从诞生到稳定的完整生命周期围绕 Font Awesome 7 的包结构重构0.1.0、Android 权限隐患的收敛0.1.1、上游版本自动同步0.1.2、static 静态导出能力0.2.0、1.0 稳定化1.0.0、Expo 插件打通1.1.0/1.1.1以及持续的 common 依赖跟进。结合 src/index.ts、app.plugin.js、Podspec 与 Android 原生包等实现可以清楚看到这类包的架构哲学是薄封装 共享核心 生成器驱动——字体包本身不实现任何渲染逻辑一切交给react-native-vector-icons/common自身只负责字形表、字体名与各平台接入脚手架从而让整个图标家族保持一致的维护节奏与工程质量。【免费下载链接】react-native-vector-iconsCustomizable Icons for React Native with support for image source and full styling.项目地址: https://gitcode.com/gh_mirrors/re/react-native-vector-icons创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考