来自世博网站

Expo让web开发者只需用JavaScript编写一次,就能构建出能够在iOS和Android上运行的真正原生应用。

这不是React Native所做的吗?有什么不同?


当前回答

Brent Vatne的回答很好,但我想补充一些细节。


Expo扩展了React Native的API表面

React Native不能提供所有开箱即用的JavaScript api,只能提供大多数原始功能。React Native开发者应该使用Android Studio或Xcode来链接其他原生库。

Expo旨在增强React Native,并为您最常见的需求提供所需的所有JavaScript api。它基本上是一组定义良好的高质量本机库,已经打包在单个库中:ExpoKit。有时候这些库实际上已经存在于React Native世界中,并集成到ExpoKit中。

同样重要的是要注意,Expo团队不能将所有的库都包含到ExpoKit中(这可能会造成一些挫折),因为Hello, World!应用程序的大小会增加,因为它会发布很多在大多数应用程序中不会使用的API。

Expo提供无线JavaScript更新

与其他系统(CodePush等)一样,Expo提供了一个通过无线更新应用程序的系统。这意味着你在CDN上上传你的JavaScript包,移动应用程序将在下次启动时自动下载并使用新的JavaScript代码(不需要从商店请求发布/评论)。

Expo提供了一个CLI工具来上传/管理CDN上的JavaScript包。对于开发,你也可以选择成为CDN并在本地主机上托管JavaScript包。Expo XDE只是CLI上的一个可视化包装器。

Expo提供了一个通用客户端

Expo客户端是一个通用客户端,允许加载任何与Expo兼容的应用程序。所有的Expo应用程序共享完全相同的本机运行时(React native + ExpoKit)。唯一的区别是我们提供给它们的JavaScript代码。你发布到应用商店的Expo应用有你的JavaScript包URL硬编码在里面。Expo客户端以特定的方式构建,因此您可以通过扫描二维码或提供URL来选择加载JS的URL。

注意,这个客户端也可以从localhost加载JavaScript包,让你的开发体验更简单:不需要任何Xcode或Android Studio,它可以更快地获得你的第一个Hello, World!手机上运行的应用程序(从小时到分钟)。你可以在没有Mac的情况下在iPhone上开发游戏,设置过程只需要2分钟。

实际上,由于Expo SDK可以升级,所以Expo客户端包含了一个兼容层,以便能够运行前五个SDK版本。

Expo提供构建服务

由于所有的Expo应用程序共享相同的本机代码,Expo能够轻松地为您构建这些应用程序。他们创建了一个云构建服务。

由Expo构建的两个应用程序的主要区别在于硬编码的URL,应用程序应该将JavaScript包下载到该URL中运行。

Expo还为你做了一些其他的事情,比如提供一种声明式的方式来设置应用程序图标、方向、权限、API键,帮助你设置推送通知、配置文件……许多设置必须在构建时在应用程序中硬编码,并且不能在空中更改。

Expo之于React Native,就像PhoneGap之于Cordova

React Native类似于Cordova。它不是相同的视图技术(原生视图和webview),但都允许你通过JavaScript控制原生特性,并且都提供插件系统,以便开发人员可以轻松添加新的JavaScript和原生绑定。

PhoneGap类似于Expo。它们都试图用一组预定义的附加本地插件来丰富它们所基于的底层平台的原始API。PhoneGap还提供构建服务,并有一个通用的客户端,只要你使用批准的插件就可以工作。

结论

如您所见,Expo是一套工具。最后,它允许轻松地开发,共享和发布到商店你的移动项目。它与PhoneGap的体验非常相似(但要好得多,也不那么令人困惑)。

对于React Native的新项目,我肯定会推荐Expo,除了以下两种情况:

你已经知道你需要的API在世博会中是不可用的,而且不会很快 你非常关心应用的大小(Hello, World!)由于ExpoKit的大小超过25 MB,但之后它不会增加太多,因为它只是JavaScript)

其他回答

世博员工的回答和文件摘要:

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 CLI的优点和缺点的答案是完整的。我还想谈谈我的个人经历。

在项目中,默认情况下,Expo包含许多模块,这使得使用它更容易。但它在制作阶段存在一个大问题,因为Android和iOS版本的尺寸太大了。例如,如果你有一个带有“Hello, World!”’,APK文件大小约为19 MB。在React Native CLI中使用相同的项目将导致应用程序大小为6 MB。

所以就我个人而言,如果你想开发一款商业应用,我不建议你使用Expo。

世博员工的回答和文件摘要:

React Native init: 优势

您可以添加用Java或Objective-C(可能是唯一但也是最强的一种)编写的本机模块。

Disadvantages 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

世博会 优势

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)

Disadvantages 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是React Native CLI的包装,它在底层为开发人员提供方便。Expo解决的最常见的问题是,开发人员不必担心React Native CLI中经常出现的库链接问题。Expo现在提供了大量的库,这些库对健壮的开发非常有帮助。Expo的好处之一是,你可以在没有Mac的情况下通过Expo手机应用开发Android和iOS应用。

虽然它有很多好处,但使用Expo也有一些缺点:

应用程序的大小迅速增加。一个简单的Hello, World!app大小超过30mb 有时候,当你需要在你的应用程序中实现一些本地功能时,你将需要从Expo中弹出并返回React native CLI。而且您永远无法将其恢复到Expo CLI。

Brent Vatne的回答很好,但我想补充一些细节。


Expo扩展了React Native的API表面

React Native不能提供所有开箱即用的JavaScript api,只能提供大多数原始功能。React Native开发者应该使用Android Studio或Xcode来链接其他原生库。

Expo旨在增强React Native,并为您最常见的需求提供所需的所有JavaScript api。它基本上是一组定义良好的高质量本机库,已经打包在单个库中:ExpoKit。有时候这些库实际上已经存在于React Native世界中,并集成到ExpoKit中。

同样重要的是要注意,Expo团队不能将所有的库都包含到ExpoKit中(这可能会造成一些挫折),因为Hello, World!应用程序的大小会增加,因为它会发布很多在大多数应用程序中不会使用的API。

Expo提供无线JavaScript更新

与其他系统(CodePush等)一样,Expo提供了一个通过无线更新应用程序的系统。这意味着你在CDN上上传你的JavaScript包,移动应用程序将在下次启动时自动下载并使用新的JavaScript代码(不需要从商店请求发布/评论)。

Expo提供了一个CLI工具来上传/管理CDN上的JavaScript包。对于开发,你也可以选择成为CDN并在本地主机上托管JavaScript包。Expo XDE只是CLI上的一个可视化包装器。

Expo提供了一个通用客户端

Expo客户端是一个通用客户端,允许加载任何与Expo兼容的应用程序。所有的Expo应用程序共享完全相同的本机运行时(React native + ExpoKit)。唯一的区别是我们提供给它们的JavaScript代码。你发布到应用商店的Expo应用有你的JavaScript包URL硬编码在里面。Expo客户端以特定的方式构建,因此您可以通过扫描二维码或提供URL来选择加载JS的URL。

注意,这个客户端也可以从localhost加载JavaScript包,让你的开发体验更简单:不需要任何Xcode或Android Studio,它可以更快地获得你的第一个Hello, World!手机上运行的应用程序(从小时到分钟)。你可以在没有Mac的情况下在iPhone上开发游戏,设置过程只需要2分钟。

实际上,由于Expo SDK可以升级,所以Expo客户端包含了一个兼容层,以便能够运行前五个SDK版本。

Expo提供构建服务

由于所有的Expo应用程序共享相同的本机代码,Expo能够轻松地为您构建这些应用程序。他们创建了一个云构建服务。

由Expo构建的两个应用程序的主要区别在于硬编码的URL,应用程序应该将JavaScript包下载到该URL中运行。

Expo还为你做了一些其他的事情,比如提供一种声明式的方式来设置应用程序图标、方向、权限、API键,帮助你设置推送通知、配置文件……许多设置必须在构建时在应用程序中硬编码,并且不能在空中更改。

Expo之于React Native,就像PhoneGap之于Cordova

React Native类似于Cordova。它不是相同的视图技术(原生视图和webview),但都允许你通过JavaScript控制原生特性,并且都提供插件系统,以便开发人员可以轻松添加新的JavaScript和原生绑定。

PhoneGap类似于Expo。它们都试图用一组预定义的附加本地插件来丰富它们所基于的底层平台的原始API。PhoneGap还提供构建服务,并有一个通用的客户端,只要你使用批准的插件就可以工作。

结论

如您所见,Expo是一套工具。最后,它允许轻松地开发,共享和发布到商店你的移动项目。它与PhoneGap的体验非常相似(但要好得多,也不那么令人困惑)。

对于React Native的新项目,我肯定会推荐Expo,除了以下两种情况:

你已经知道你需要的API在世博会中是不可用的,而且不会很快 你非常关心应用的大小(Hello, World!)由于ExpoKit的大小超过25 MB,但之后它不会增加太多,因为它只是JavaScript)