Expo 搭建 React-native 项目,妈妈再也不用担心我的环境配置

孙乾
• 阅读 16621

react-native 相信大部分前端开发都不会陌生——使用 JavaScript 和 React 编写原生移动应用。用 js 就能分 ios 和 android 的一杯羹。(哈哈,开个玩笑:)。玩笑归玩笑,但它能说明在开发移动应用领域,RN 有它的一席之地。

面临的问题

掌握 RN 无意能给自己增添更多筹码。但学习 RN 并有没想象中的那样顺畅。我觉得, 最大的困扰就是环境配置。react-native 中文网 教程需要根据 开发平台目标平台 来安装依赖,十分的繁琐,通常没有几个小时是配置不好的,估计很多人都会卡在这里。

而且,对 iOS 程序员来说,可能不懂 Android 编译环境;对 Android 程序员来说,可能不懂 Xcode;对于前端开发人员或者其他开发人员,可能更恼火,两个都不会。

那有什么办法可以降低配置环境的复杂度呢?有 Expo,不需要配置 iOS Android 编译环境。

关于 expo ,中文网上有一个注意事项:

沙盒环境大量依赖于国外网络环境,也不能直接发布应用,只是用于学习、演示、试验等目的。不建议国内用户使用。

感觉上面那个是说 expo snack,反正,知道有这么个情况存在就可以了。而且,expo 有关于 纯 react-native 项目 转 expo 项目,或者 从 expo 项目中弹出 react-native 项目的完整教程方案,所以,开整吧。

Expo 搭建 RN 项目

Expo 搭建项目有两种方式:一种是通过 Expo 的脚手架 expo-cli;一种是通过 create-react-native-app。本文采用第一种。

1、安装 expo-cli

npm install expo-cli --global

2、创建项目

expo init my-new-project

会有两类模板让你选择:托管工作流,裸露工作流(感觉叫原生工作流更好理解点。详情见Workflows

expo init simple-project
? Choose a template:
  ----- Managed workflow -----
❯ blank                 a minimal app as clean as an empty canvas
  blank (TypeScript)    same as blank but with TypeScript configuration
  tabs                  several example screens and tabs using react-navigation
  ----- Bare workflow -----
  minimal               bare and minimal, just the essentials to get you started
  minimal (TypeScript)  same as minimal but with TypeScript configuration

3、启动项目

cd my-new-project
expo start

4、预览项目

项目启动后,有两种方式预览:下载 Expo Client 手机客户端(手机应用商店搜索 expo ),扫描二维码;或者 在终端输入 ai,启动 Android 或 iOS 模拟器。

目录结构

不同模板的目录结构和截图如下:

模板 目录结构 截图
blank .
├── .expo/
├── .expo-shared/
├── .git/
├── .gitignore
├── App.js
├── app.json
├── assets/
├── babel.config.js
├── node_modules/
├── package.json
└── yarn.lock
Expo 搭建 React-native 项目,妈妈再也不用担心我的环境配置
tabs .
├── .expo/
├── .expo-shared/
├── .git/
├── .gitignore
├── App.js
├── __tests__/
├── app.json
├── assets/
├── babel.config.js
├── components/
├── constants/
├── navigation/
├── node_modules/
├── package.json
├── screens/
└── yarn.lock
Expo 搭建 React-native 项目,妈妈再也不用担心我的环境配置
minimal .
├── .babelrc
├── .buckconfig
├── .git/
├── .gitattributes
├── .gitignore
├── App.js
├── __tests__/
├── android/
├── app.json
├── babel.config.js
├── index.js
├── ios/
├── node_modules/
├── package.json
└── yarn.lock
Expo 搭建 React-native 项目,妈妈再也不用担心我的环境配置

小联系

这里,简单看下 minimal 模板的项目目录 和 react-native init xxx 项目目录有啥不一样。

模板 minimal react-native init xxx
.
├── .babelrc
├── .buckconfig
├── .git/
├── .gitattributes
├── .gitignore
├── App.js
├── __tests__/
├── android/
├── app.json
├── babel.config.js
├── index.js
├── ios/
├── node_modules/
├── package.json
└── yarn.lock
.
├── .buckconfig
├── .eslintrc.js
├── .flowconfig
├── .gitattributes
├── .gitignore
├── .prettierrc.js
├── .watchmanconfig
├── App.js
├── __tests__/
├── android/
├── app.json
├── babel.config.js
├── index.js
├── ios/
├── metro.config.js
├── node_modules/
├── package.json
└── yarn.lock

感觉,主要区别在于 app.json 的配置不同,以及 构建方式的不同(一个 expo 一个 metro)

react-native

{
  "name": "nativeDemo",
  "displayName": "nativeDemo"
}

minimal 多了个 expo 字段,详情见 Configuration with app.json

{
  "name": "minimalProject",
  "displayName": "minimalProject",
  "expo": {
    "name": "minimalProject",
    "slug": "minimalProject",
    "privacy": "unlisted",
    "sdkVersion": "36.0.0",
    "version": "1.0.0",
    "entryPoint": "node\_modules/expo/AppEntry.js",
    "platforms": [
      "ios",
      "android",
      "web"
    ]
  }
}

这为 react-native init xxxexpo init xxx 相互转换提供了参考:

在 app.json 中添加 expo 字段,根目录要有 App.js

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
React Native与ExMobi技术路线探索
随着Facebook陆续开源ReactNative的iOS和Android版本,这种以JavaScript来开发原生APP的方式在移动应用开发圈里得到广泛关注,虽然ReactNative并不是第一个采用JavaScript编写原生APP的产品,但是其独特的设计思想和实现方式是非常值得借鉴的。而作为国内老字号的移动应用开发平台,同样支持开发原生APP
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
3年前
SwiftUI 跨组件数据传递
作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言众所周知,SwiftUI的开发模式与React、Flutter非常相似,即都是声明式UI,由数据驱动(产生)视图,视图也会与数据自动保持同步,框架层会帮你处理“绑定”的问题。在声明式UI中不存在命令式地让一个视图变成xxx