RN问题解决

2024.6.14时最新版本为 0.74.2,2024.8.1时最新版本为0.74.4,但其相关依赖不太稳定,尝试使用 0.74.2 版本操作

创建项目时报错:RN error Error

RN error Error: getaddrinfo ENOENT raw.githubusercontent.com at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:108:26)

raw.githubusercontent.com 是 GitHub 提供的一个服务,用于直接访问存储在 GitHub 仓库中的原始文件(如文本文件、脚本等),而无需下载整个仓库。在 React Native (RN) 开发环境中,这个 URL 常见于以下几种场景(文心一言生成,可了解):

  • 依赖管理工具安装: 如 Homebrew 安装脚本 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)",Homebrew 是一个 macOS 下的包管理器,广泛用于安装 RN 开发所需的工具链和依赖,比如 Node.js、watchman、Yarn 或者其他 CLI 工具。

  • 脚本或配置文件获取: 在某些情况下,开发者可能会从 raw.githubusercontent.com 直接拉取脚本或配置文件到本地,作为项目初始化的一部分或者是运行某些自动化任务的需要。

  • 快速分享和集成代码片段: 开发者可能会分享一些示例代码或者配置文件的链接,其他用户可以直接通过这些链接查看或下载内容,便于快速集成或参考。

  • 持续集成/部署脚本: 在 CI/CD 流程中,可能会使用此类链接来动态获取最新的脚本或配置,确保构建过程使用的是最新或指定版本的资源。

其最显著的是我们在启动项目时,会自动将模拟器启动

问题分析

  • 为无法访问该域名的问题

解决方案

  • 检查网络设置

  • 使用代理服务

  • 更换 DNS 服务器等方法来解决访问限制

DNS 服务可能是 域名ip 未绑定的原因

我们需要查看 C:\Windows\System32\drivers\etc里查看是否有raw.githubusercontent.com 与其对应的 ip 绑定,没有的话我们需要去查看 raw.githubusercontent.com 所对应的 ip

  • 进入该网址 https://www.ipaddress.com/,输入域名搜索

  • 下图所框便是其对应的 ip

  • C:\Windows\System32\drivers\etc 里的 hosts 里最下面写入对应的配置,保存后重新创建项目

185.199.108.133 raw.githubusercontent.com

185.199.109.133 raw.githubusercontent.com

185.199.110.133 raw.githubusercontent.com

185.199.111.133 raw.githubusercontent.com

下载 gradle-x.x-all.zip 太慢

Downloading https://services.gradle.org/distributions/gradle-8.6-all.zip

解决方案

  • 配置镜像

  • [项目名]\android\gradle\wrapper\gradle-wrapper.properties 中进行如下操作

1
2
3
4
5
6
7
8
9
10
11
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
# 原网站下载
# distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip
# 配置阿里镜像下载
distributionUrl=https\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.6-all.zip

networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

配置好之后仍满可以试试多次重新执行启动项目命令,当进度明显快了就可以了,第一次可能有点慢,因为要安装 gradle-8.6-all.zip

依赖库下载太慢

解决方案

  • [项目名]\android\build.gradlerepositories 内有 google() mavenCentral()

1
2
3
4
repositories {
google()
mavenCentral()
}
  • google(): 这一行指定了Google的Maven仓库作为依赖项的来源。这对于下载Android SDK相关依赖、Jetpack库以及其他Google提供的库非常关键。

  • mavenCentral(): 这一行指定了Maven中央仓库,它是Java开发中最常用的依赖库仓库,包含了大量开源库和框架。

  • 但由于这两个仓库的服务器都在国外,我们也需要对其进行镜像处理,有两种解决方案:

    • 局部配置:直接在 build.gradlerepositories 中修改
    • 全局配置: 在 C:\Users[用户名].gradle 文件夹下创建 init.gradle 文件,里面进行如下配置,这样我们就不需要每个项目都进行配置了
1
2
3
4
5
6
7
// 局部配置
repositories {
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
// 此为阿里镜像下载源
maven { url 'https://mirrors.aliyun.com/macports/distfiles/gradle/' }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// 全局配置
allprojects{
repositories {
def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/central/'
def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/public/'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('http://repo1.maven.org/maven2')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
remove repo
}
if (url.startsWith('https://jcenter.bintray.com/') || url.startsWith('http://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
remove repo
}
}
}
maven {
url ALIYUN_REPOSITORY_URL
url ALIYUN_JCENTER_URL
url 'https://maven.aliyun.com/repository/google/'
url 'https://maven.aliyun.com/repository/gradle-plugin/'
}
}


buildscript{
repositories {
def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/central/'
def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/public/'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('http://repo1.maven.org/maven2')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
remove repo
}
if (url.startsWith('https://jcenter.bintray.com/') || url.startsWith('http://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
remove repo
}
}
}
maven {
url ALIYUN_REPOSITORY_URL
url ALIYUN_JCENTER_URL
url 'https://maven.aliyun.com/repository/google/'
url 'https://maven.aliyun.com/repository/gradle-plugin/'
}
}
}
}

调试断开后设备上打开报错

当我们启动程序并连上设备后,我们可以看到页面资源,但当我们断开后再打开就会报错 Unable to load script…,是因为我们的 JS代码和静态资源 并没有集成到Android项目中进行构建和发布

解决方案

  • [项目名]\android\app\src\main\ 目录下创建 assets 文件夹,并在下面创建 index.android.bundle 文件

  • 然后在控制台项目根目录运行命令 npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

  • 当我们再次运行时,即使断开我们也可以看到我们的资源

error Error: connect ETIMEDOUT 185.199.108.133:443

过段时间重新尝试安装

error: unknown command ‘run-android’

依赖包删除重新 npm iyarn