Hello world!
Contents
新建项目
Expo官方网站给出两条路:
- 1. 用expo.new自动设置
- 2. 快速开始文档
第一种方式,expo.new
(expo的新花样,链接)会导引你进入一个Expo精心设计的网站,通过你的github账号联动,选择你要创建的项目类型,在网页界面中一步步指引你以EAS工具建立自己的项目,它在你完成 npx eas-cli@latest init:onboarding
命令后自动建立与你GitHub repo的连接。
没错,这是一个云服务,想法很酷,也比较新,但不知现在有多少程序员喜欢用这种方式进入学习和开发呢?本书写作的时候,作者还未发现有人强烈推荐,本人也没有尝试过,还是静观其变吧。我们先走第二条路。
[!NOTE] 接下来 的操作过程记录,都是基于作者自己的开发环境。 如果我们的开发环境相似,那真是太好了! 如果遇到因环境差别产生的障碍,希望你通过摸索和网上询问,掌握相应的变通技巧!👍
运行下面这行命令,可用create-expo-app工具建立一个最新版本的Expo App项目。
npx create-expo-app@latest
这句命令默认引入了一个模版(template),包括用Expo Router库建立的多屏幕架构。当然,我们可以选择不同的模版,只要在命令中加入--template
参数即可,比如接下来的例子我们会用blank
模版,建立一个最小库依赖的不包括导航配置的项目。
npx create-expo-app@latest --template blank
安装过程中,会有一个问题:What is your app name?
我们给本课程的项目取名叫expo-lesson-blank,之后再无交互。
很快安装就结束了,毕竟是个很“空”的项目。
运行程序
安装命令的结尾处贴心地把运行操作打印出来,让我们赶快run一下,这其实也是对我们前期各种准备工作和安装环境是否正常的检查机会。
[!NOTE] 如果下面的过程不顺利,请移步前面章节检查自己的环境配置情况。
我们进入刚才建立的项目目录:cd expo-lesson-blank
;
执行npm run ios
(安卓也行,根据你的偏好来,但本书不讳言各方面内容比较偏向iOS开发);
很快我们的iOS模拟器(Simulator)就自己启动了,并且用Expo Go打开了我们第一个app的界面。如果你是第一次运行,可能在命令行中会提示一下要在模拟器安装Expo Go这个应用,回答Yes就可以。
[!TIP] Expo Go的下载地址:Google Play(Android), App Store(iOS),请在自己的手机上装一下,后面的课程会用到。
我们在启动过程的提示中可以看到,刚才实际上是 直接调用了expo cli工具,执行了
expo start --ios
这条命令,未来的大多数时间,我们都要习惯以expo命令来启动自己写的app了。
我们退出现在的执行命令(Ctrl + C),然后再执行expo。
oops,报错了!
原因是我们从头到尾都没有安装过expo cli,当然没法直接调用它。
现在我们有两个选择,第一当然是安装expo cli,但个人更倾向于永远不去安装它,我们用万能的npx搞定一切,执行npx expo
即可,这样带来的好处包括但不限于不用再担心包管理和新版本升级等烦心事。(对npx没有印象的同学,请移步[[前面章节]]。)
expo命令跳出的这些内容包含哪些重要信息呢?我们来解读一下。
[!NOTE] 当然你也可以跳过这段以后再来看,现在只要知道按i打开iOS模拟器,按b去安卓运行就可以了。
› Metro waiting on exp://192.168.1.2:8081
› Scan the QR code above with Expo Go (Android) or the Camera app (iOS)
› Using Expo Go
› Press s │ switch to development build
› Press a │ open Android
› Press i │ open iOS simulator
› Press w │ open web
› Press j │ open debugger
› Press r │ reload app
› Press m │ toggle menu
› Press o │ open project code in your editor
› Press ? │ show all commands
从上到下逐句解读:
Metro waiting on exp://192.168.1.2:8081
: 说明expo启动了一个叫Metro的服务,它在ip地址192.168.1.2(我家wifi路由器给开发电脑分配的地址)的8081端口等待前端(模拟器或真机)的访问 ,如果你同时在这台开发主机启动了其他Metro服务,它们就会开启其他端口,以8082,8083的顺序建立下去。Scan the QR code above with Expo Go (Android) or the Camera app (iOS)
: 可以用你的手机扫描装置扫描上面的二维码访问Metro服务,当然现在你要安装Expo Go这个应用才行,而且你的手机要和开发主机在一个局域网段内并且互相可访问。国内的同学别看到二维码就想起微信,iPhone的话用手机操作系统自带的那个相机工具就可以,安卓的话Expo Go里的扫码工具更好。- 这两句告诉我们expo cli现在采用Expo Go模式,而且它还可以支持
development build
模式,你按一下s就可以了。
› Using Expo Go
› Press s │ switch to development build
当然现在你按下 s 就会得到一个报错,告诉你还没有生成开发包呢,赶快再按s切回来。
- 剩下的内容就很直白了:
› Press a │ open Android
› Press i │ open iOS simulator
› Press w │ open web
› Press j │ open debugger
› Press r │ reload app
› Press m │ toggle menu
› Press o │ open project code in your editor
a 打开安卓模拟器;
i 打开iOS模拟器;
w web页面(没错expo还支持web开发,似乎想和next.js硬钢,但我们的课程不会再提。);
j 打开debugger调试器,不建议;
r 重启app,其实和按下a, i, 或者在前端调出菜单reload的效果一样;
m 切换菜单,不常用;
- 最后一行
Press ? │ show all commands
是说随时按下问号你都可以回到这里,相当于调出帮助信息。
[!NOTE] 值得注意的是,这些快捷键在整个命令期间,也就是app运行调试期间都是生效的。虽然很快终端面板就会被各种log日志信息刷屏了,但我们依然可以随时按下这些单个字母快捷键启动相关功能。
打开项目
为了了解这个最新项目的结构,我们可以执行ls或者用之 前安装好的vscode直观查看。
假设我们还在终端程序里并位于项目根目录下,执行code .
,没错这样就可以用vscode打开项目了。
我们发现,这个blank的模版果然很空、很纯粹,呈现了一个expo项目的基础核心内容。
所有的代码都在这个App.js文件中(没错,它甚至没用到Type Script)。
剩下的文件,虽然做过前端的同学都不陌生,但复习一遍对巩固知识是有好处的:
babel.config.js
是一个JavaScript配置文件,用于告诉 Babel 编译器如何处理代码。简单来说,它的作用包括:
选择预设:定义要使用的预设,比如转换ES6+代码到旧版浏览器兼容的代码。
添加插件:添加额外的插件来支持特定的语言特性。
环境配置:根据不同的运行环境(如开发或生产环境)调整编译选项。
忽略文件:指定 Babel 忽略某些文件或文件夹,不进行转换。
源码映射:生成源码映射,方便调试。
它使得你的代码能够兼容更多环境,同时保持代码的现代性和简洁性。
package.json
一 个非常重要的文件,它在 Node.js 项目中扮演着核心角色。以下是它的一些基本要点:
项目信息:包含项目的名称、版本、描述、作者、许可证等元数据。
依赖管理:列出项目所需的所有依赖包和它们各自的版本号,确保项目可以正确安装和运行。
脚本:定义可以执行的脚本命令,比如 npm start 或 npm test,方便自动化任务。
配置:包含项目的配置选项,比如 Babel 编译器的配置或测试工具的配置。
入口点:指定项目的主文件或模块,通常是 main 字段。
版本范围:使用语义化版本控制(SemVer)来管理依赖的版本,确保兼容性。
package.json
文件通常位于项目的根目录,是项目依赖和配置的中心。通过 npm install
命令,可以基于这个文件自动安装所有依赖。
app.json
React Native 和 Expo 都使用 app.json
文件来配置应用,但它们的配置重点有所不同:
React Native:
- 主要配置应用基本信息,如名称、版本、描述。
- 可以指定应用的入口文件和资产。
Expo:
- 除了基本配置,还包括 Expo 特有的配置,如预览选项和平台特定功能。
- 支持通过 Expo 平台进行 OTA 更新。
简而言之,Expo 的 app.json
提供了更多与 Expo 平台相关的配置选项,使得开发和发布流程更加简化。而 React Native 的 app.json
更专注于应用本身的基本配置。