React Native 可以在自定义域上启动Expo吗?

7gcisfzg  于 2023-06-24  发布在  React
关注(0)|答案(1)|浏览(135)

我正在尝试使用托管在云中的Code Server开发React Native应用程序。
是否可以使用自定义域名运行expo,以便我可以使用移动终端访问链接?默认情况下,expo正在等待exp://10.0.0.186:19000,无法通过Internet访问。
我可以使用expo start --port XXX指定自定义端口,但我不知道是否可以指定自定义域?
我尝试使用--tunnel开关,但它不工作,它输出:

Error starting ngrok: /usr/lib/node_modules/expo-cli/node_modules/xdl/binaries/linux/adb/adb: 1: Syntax error: Unterminated quoted string
Tunnel URL not found (it might not be ready yet), falling back to LAN URL.
f45qwnt8

f45qwnt81#

--tunnel选项通常可以正常工作,假设您也已经根据Expo安装隧道文档全局安装了@expo/ngrok软件包。

自定义域名-问题

不幸的是,在撰写本文时,@expo/cli还没有提供使用自定义域的直接方法。它们确实提供了一种使用子域的方法(参见下面的解决方案)

自定义域名-解决方案

然而,如果你和我一样,对这个答案不满意,你可以自己动手:
1.获得一个ngrok帐户并设置您的自定义域(这将需要购买个人计划或更高版本)
1.修补@expo/cli以使用您的自定义域。
根据您的包管理器,您可以使用类似pnpm patchpatch-package的东西来创建补丁文件,并确保每次安装节点模块时都会更新它。
对于@expo/cli版本0.7.3,您要修改的文件位于node_modules/@expo/cli/build/src/start/server/AsyncNgrok.js中,其中包含以下内容:

const url = await instance.connect({
    ...urlProps,
    authtoken: NGROK_CONFIG.authToken,
    ...

更改它以覆盖hostname和authToken,并删除urlProps的扩展:

const url = await instance.connect({
    hostname: "<your custom domain>",
    authtoken: process.env.NGROK_AUTH_TOKEN,
    ...

我建议使用一个环境变量,而不是直接在补丁文件中,它将提交到您的存储库。
保存文件,然后创建并应用修补程序文件。您应该可以正常使用expo start --tunnel命令来配置自定义的ngrok域。

子域名

不是OP问题的有效答案,但如果您不想为上述解决方案购买域和ngrok订阅,您可以使用子域EXPO_TUNNEL_SUBDOMAIN环境变量,请参阅Expo环境变量文档
EXPO_TUNNEL_SUBDOMAIN -禁用使用exp.direct作为--tunnel连接的主机名。这将启用https://转发,可用于测试iOS上的通用链接。这可能会导致Expo链接和Expo Go出现意外问题。通过传递一个字符串值来选择要使用的确切子域,该字符串值不属于:true,false,1,0.
它可以很容易地添加到您的.env文件或package.json启动脚本中,例如:

"start": "EXPO_TUNNEL_SUBDOMAIN=yoursubdomain expo start --tunnel"

相关问题