来自世博网站
Expo让web开发者只需用JavaScript编写一次,就能构建出能够在iOS和Android上运行的真正原生应用。
这不是React Native所做的吗?有什么不同?
来自世博网站
Expo让web开发者只需用JavaScript编写一次,就能构建出能够在iOS和Android上运行的真正原生应用。
这不是React Native所做的吗?有什么不同?
当前回答
这里我要说明的是,Expo使用的是React的旧版本16.5,这将禁止你使用新的hooks功能。
如果您决定使用Expo,请注意您的版本控制。例如,如果遇到奇怪的错误,就需要在16.5版本中使用旧版本的反应导航。
其他回答
世博员工的回答和文件摘要:
React Native init:
优势
您可以添加用Java或Objective-C(可能是唯一但也是最强的一种)编写的本机模块。
缺点
Needs Android Studio and Xcode to run the projects You can't develop for iOS without having a Mac Device has to be connected via USB to use it for testing Fonts need to be imported manually in Xcode If you want to share the app you need to send the whole .apk / .ipa file Does not provide JavaScript APIs out of the box, e.g., Push-Notifications, Asset Manager, they need to be manually installed and linked with npm for example Setting up a working project properly (including device configuration) is rather complicated and can take time
Expo
优势
Setting up a project is easy and can be done in minutes You (and other people) can open the project while you're working on it Sharing the app is easy (via a QR code or link), you don't have to send the whole .apk or .ipa file No build necessary to run the app Integrates some basic libraries in a standard project (Push Notifications, Asset Manager, etc.) You can eject it to ExpoKit and integrate native code continuing using some of the Expo features, but not all of them Expo can build .apk and .ipa files (distribution to stores possible with Expo)
缺点
You can't add native modules (probably a game changer for some) You can't use libraries that use native code in Objective-C/Java The standard Hello World app is about 25MB big (because of the integrated libraries) If you want to use: FaceDetector, ARKit, or Payments you need to eject it to ExpoKit Ejecting it to ExpoKit has a trade-off of features of Expo, e.g. you cannot share via a QR code When ejecting to ExpoKit you are limited to the react-native version that is supported by ExpoKit then Debugging in ExpoKit (with native modules) is a lot more complicated, since it mixes two languages and different libraries (no official Expo support any more)
来源:
将Expo应用分离到ExpoKit:概念 react-native-init和create-react-native-app #516的区别 弹出到ExpoKit
当你在Expo中编写代码时,你就是在编写React Native代码。世博会已经 两个主要部分:
Expo CLI (expo-cli): a developer tool for creating projects, viewing logs, opening on your device, publishing, etc. Expo client: an app on your phone that lets you open your projects while you're working on them, without needing to go through XCode or Android Studio, and also lets other people view them too! And if you publish it through expo-cli, people can access it at any time through the Expo client on Android or on iOS if signed in to the same account it was published with. Lastly, we also make it possible to build standalone apps so people don't have to use the Expo client to open it, and you can distribute to the app store and play store if you like.
所以Expo是建立在React Native之上的一套工具。这些工具依赖于Expo上的一个关键信念:只要你有一套全面的面向JavaScript的api,就可以构建大多数应用程序,而不需要编写本地代码。
这一点很重要,因为使用React Native,你总是可以下拉到本地代码。这有时是非常有用的,但它是有代价的:如果你想让他们测试你的二进制文件,你需要把你的二进制文件发给他们,世界另一边的人不能在你工作的时候点击一个链接来打开它,你不能像在浏览器中那样一键发布它,让别人访问它。
对于Expo,我们建议尽量避免使用本地代码,如果可以的话。正如我上面提到的,我们认为JavaScript有了一套全面的api,对于大多数应用程序来说,这应该是不必要的。因此,我们的目标是提供这个全面的api集,然后构建所有可以存在于本机运行时共享世界中的强大工具。
但是,如果你必须发现你想要下拉到本地,你可以使用eject并继续使用Expo提供给你的本地api,同时拥有与任何本地项目相同的控制级别。
阅读更多关于弹射的内容
这里我要说明的是,Expo使用的是React的旧版本16.5,这将禁止你使用新的hooks功能。
如果您决定使用Expo,请注意您的版本控制。例如,如果遇到奇怪的错误,就需要在16.5版本中使用旧版本的反应导航。
关于Expo和React Native CLI的优点和缺点的答案是完整的。我还想谈谈我的个人经历。
在项目中,默认情况下,Expo包含许多模块,这使得使用它更容易。但它在制作阶段存在一个大问题,因为Android和iOS版本的尺寸太大了。例如,如果你有一个带有“Hello, World!”’,APK文件大小约为19 MB。在React Native CLI中使用相同的项目将导致应用程序大小为6 MB。
所以就我个人而言,如果你想开发一款商业应用,我不建议你使用Expo。
世博会CLI
优点:
无需安装Android Studio或Xcode即可开始构建。 不需要很多配置。 使用条形码扫描在Android和iPhone上轻松查看移动UI。通过在线iPhone和Android模拟器也更容易查看。 更快的设置和开发。
缺点:
无法添加本机依赖项。 创建。apk和。ipa文件是困难的。 apk/ipa的大小很大。
React Native CLI
优点:
轻松添加本机依赖项。 创建。apk和。ipa文件比使用Expo要容易得多
注意:React Native CLI是用来直接使用React Native框架的框架。
缺点:
需要高水平的配置。 基本了解Android和iOS文件夹结构。
如你所见,这两种方法各有利弊;您应该始终根据项目的需要来决定使用哪一种。