React Native项目报错求助:字体识别失败及版本不匹配问题
兄弟,你的问题核心在于你用的是Expo托管的React Native项目(从package.json里react-native指向expo的tar包、app.json里的sdkVersion就能看出来),这类项目和普通的裸RN项目不一样,不能用react-native link或者react-native-git-upgrade这类命令,这就是你后续踩坑的原因。下面一步步帮你解决:
1. 先搞定Unrecognized font family 'simple-line-icons'这个初始报错
simple-line-icons是Native Base依赖的字体,在Expo项目里根本不需要手动link,用Expo自带的字体加载工具就能解决:
- 先确认装了
expo-font,没装的话跑这个命令:npm install expo-font - 然后在你的项目入口(比如
App.js)里加一段字体预加载的代码,确保App启动前先把字体加载好:import React, { useState, useEffect } from 'react'; import { View, Text } from 'react-native'; import * as Font from 'expo-font'; // 导入你需要的图标库 import { SimpleLineIcons } from '@expo/vector-icons'; export default function App() { const [isFontReady, setIsFontReady] = useState(false); useEffect(() => { async function loadRequiredFonts() { await Font.loadAsync({ // 加载Native Base需要的simple-line-icons 'simple-line-icons': require('native-base/Fonts/SimpleLineIcons.ttf'), // 如果用@expo/vector-icons的其他字体,也可以在这里加 ...SimpleLineIcons.font, }); setIsFontReady(true); } loadRequiredFonts(); }, []); // 字体没加载完之前显示加载状态 if (!isFontReady) { return <View><Text>加载中...</Text></View>; } // 下面写你原来的App内容就行 return ( <View> {/* 测试一下字体能不能正常显示 */} <Text style={{ fontFamily: 'simple-line-icons', fontSize: 32 }}></Text> </View> ); }
2. 为啥react-native link会报Cannot read property 'pbxprojPath' of null?
因为Expo托管的项目根本没有本地的iOS/Android原生工程文件(比如iOS的.xcodeproj文件),react-native link是用来修改这些原生文件的,在Expo项目里跑这个命令当然会找不到路径报错。
另外,你已经装了@expo/vector-icons,这是Expo官方适配的图标库,直接用就行,完全不需要再装react-native-vector-icons(两者功能重复,还容易冲突),建议把后者卸载:
npm uninstall react-native-vector-icons
3. 版本不匹配的问题:别用react-native-git-upgrade!
Expo项目的React Native版本是和Expo SDK绑定死的,比如你用的SDK 32对应的RN版本就是0.57.1,所以你看到的“package.json里的版本和node_modules里的不匹配”其实是正常的——package.json里的RN是Expo托管的版本链接,node_modules里的是实际安装的对应版本。
如果要升级,得按Expo的规则来:
- 先查好你要升级到的SDK版本对应的RN版本(比如SDK 33对应RN 0.59.x)
- 跑
expo upgrade [SDK版本号](比如expo upgrade 33),这个命令会自动帮你更新所有相关依赖的版本,包括react-native、expo这些,不用手动改package.json。
最后给你俩小建议
- 清理缓存的话,Expo项目用
expo r -c重启,比普通的RN缓存清理更彻底。 - 升级SDK的时候记得检查
native-base的版本是否兼容,比如你现在用的Native Base 2.10.0和SDK 32是兼容的,后续升级SDK也要对应找兼容的Native Base版本。
内容的提问来源于stack exchange,提问作者Citrix

