【问题标题】:What is the difference between Expo and React Native?Expo 和 React Native 有什么区别?
【发布时间】:2017-01-03 09:09:40
【问题描述】:

来自the Expo website

Expo 让 Web 开发人员只需使用 JavaScript 编写一次,即可构建可在 iOS 和 Android 上运行的真正原生应用程序。

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

【问题讨论】:

    标签: react-native react-native-android expo react-native-ios exponentjs


    【解决方案1】:

    当您在 Expo 中编写代码时,您正在编写 React Native 代码。世博有 两个主要部分:

    1. Expo CLI (expo-cli):用于创建项目、查看日志、在您的设备上打开、发布等的开发者工具。

    2. Expo 客户端:手机上的一款应用,可让您打开项目 当您在处理它们时,无需通过 XCode 或 Android Studio,还可以让其他人也查看它们!如果您通过expo-cli 发布它,人们可以随时通过 Android 或 iOS 上的 Expo 客户端访问它,前提是登录到发布它的同一帐户。最后,我们还可以构建独立的应用程序,这样人们就不必使用 Expo 客户端来打开它,并且您可以根据需要分发到应用商店和 Play 商店。

    所以 Expo 是一套建立在 React Native 之上的工具。这些工具依赖于 Expo 所持有的一个关键信念:只要您拥有一整套暴露于 JavaScript 的 API,就可以构建大多数应用程序而无需编写本机代码。

    这很重要,因为使用 React Native 你总是可以下拉到原生代码。有时这非常有用,但这是有代价的:如果你想让他们测试它们,你需要把你的二进制文件发送给他们,世界另一端的人不能在你工作的时候点击一个链接来打开它在它上面,你不能像在浏览器中那样一键发布它,让别人访问它。

    对于 Expo,如果可以的话,我们建议尽量避免使用原生代码。正如我上面提到的,我们认为有了一套可用于 JavaScript 的全面 API,对于大多数应用程序来说,这应该不是必需的。因此,我们的目标是提供这套全面的 API,然后构建可以在共享本机运行时的世界中存在的所有出色工具。

    但是,如果您必须发现您想要下拉到原生,您可以使用弹出并继续使用 Expo 为您提供的原生 API,同时拥有与任何原生项目相同级别的控制。

    Read more about ejecting

    【讨论】:

    • “使用 Exponent,您不能下拉到本机代码”。很高兴知道您不必使用本机代码,但是如果您需要,为什么 Exponent 会阻止您这样做?
    • 啊,我明白了。因此,Exponent 客户端是完全开源的 (github.com/exponentjs/exponent),这意味着您可以根据需要编写本机代码,但实际上您只是将 Exponent 库视为典型 React Native 应用程序中的本机模块集合。这完全没问题,也是我们开源项目的动力。也就是说,如果您希望能够使用我们的工具(应用程序二进制构建器、应用程序/播放商店中的 Exponent 客户端以共享测试构建、内置推送通知等),那么您无法编写本机代码。
    • 在撰写本文时,Expo 在集成有用的原生插件方面做得相当不错。但是,他们缺少 IAP 的主要插件集成,没有它,您无法从您的应用程序中赚钱!!!你问,如果我不能盈利,做一个应用有什么意义!!
    • ExpoLink 现已弃用/即将弃用,将由Expo Bare Workflow取代
    • 我找不到关于 Expo 构建和推送通知服务如何工作的清晰文章,但似乎如果您使用 Expo,您将依赖他们基于云的构建系统并且可以仅通过其后端接收推送通知。我不知道 Expo 应用程序依赖的其他服务;我希望其他人可以更详细地解释它。
    【解决方案2】:

    Expo 员工的文档和回答摘要:

    React Native 初始化:

    优势

    • 您可以添加用 Java/Objective-C 编写的本机模块(可能是唯一但最强大的模块)

    缺点

    • 需要 Android Studio 和 XCode 来运行项目
    • 没有 Mac 就无法进行 iOS 开发
    • 设备必须通过 USB 连接才能用于测试
    • 字体需要在 XCode 中手动导入
    • 如果您想分享应用程序,您需要发送整个.apk / .ipa 文件
    • 不提供开箱即用的 JS API,例如Push-Notifications、Asset Manager,例如需要手动安装并与 npm 链接
    • 正确设置工作项目(包括设备配置)相当复杂,可能需要时间

    世博会

    优势

    • 设置项目很简单,只需几分钟即可完成
    • 您(和其他人)可以在处理项目时打开该项目
    • 分享应用很容易(通过二维码或链接),您不必发送整个.apk.ipa 文件
    • 无需构建即可运行应用程序
    • 在标准项目中集成一些基本库(推送通知、资产管理器等)
    • 您可以将其弹出到 ExpoKit 并集成本机代码,继续使用某些 Expo 功能,但不是全部
    • Expo 可以构建 .apk.ipa 文件(可以通过 Expo 分发到商店)

    缺点

    • 您无法添加本机模块(对某些人来说可能会改变游戏规则)
    • 您不能在 Objective-C/Java 中使用使用本机代码的库
    • 标准的 Hello World 应用大约有 25MB 大(因为集成了库)
    • 如果您想使用:FaceDetector、ARKit 或 Payments,您需要将其弹出到 ExpoKit
    • 将其弹出到 ExpoKit 需要权衡 Expo 的功能,例如无法通过二维码分享
    • 弹出到 ExpoKit 时,您仅限于 ExpoKit 支持的 react-native 版本
    • ExpoKit 中的调试(使用本机模块)要复杂得多,因为它混合了两种语言和不同的库(不再支持 Expo 官方)

    来源:

    【讨论】:

    • 感谢@BenjaminHeinke 清楚地了解了优缺点。我已经遇到了劣势#2,因为我们决定采用 expo 来响应原生应用程序。因此,我们无法与 Appsee 集成。没有解决方法吗?
    • 设备不必连接到 USB 进行测试,只有第一次编译和安装必须通过 USB 完成。稍后您可以使用 Wi-Fi!但是,如果您对本机进行更改,则需要重新编译。
    【解决方案3】:

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


    Expo 扩展了 React Native 的 API 界面

    React Native 并没有为您提供开箱即用的所有 JS API,而只提供最原始的功能。 React Native 开发者应该使用 Android Studio/XCode 来链接额外的原生库。 Expo 旨在增强 RN 并提供满足最常见需求所需的所有 JS API。它基本上是一组定义明确的优质原生库,已经为您打包在一个库中:ExpoKit。有时这些库实际上已经存在于 RN 世界中,并集成到 ExpoKit 中。

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

    Expo 提供无线 JS 更新

    与其他系统(CodePush...)一样,Expo 提供了一个系统来通过无线方式更新您的应用程序。这意味着您将 JS 包上传到 CDN,移动应用程序将在下次启动时自动下载并使用新的 JS(无需从商店请求发布/审查)。

    Expo 提供了一个 CLI 工具来上传/管理其 CDN 上的 JS 包。对于开发,您还可以选择成为 CDN 并在 localhost 上托管 JS 包。 XDE 只是 CLI 上的一个可视化包装器。

    Expo 提供通用客户端

    Expo 客户端是一个通用客户端,允许加载任何与 Expo 兼容的应用程序。所有 Expo 应用程序都共享完全相同的本机运行时(RN + ExpoKit),唯一的区别是我们为它们提供的 JS。您发布到应用商店的 Expo 应用程序中包含硬编码的 JS 捆绑 URL。 Expo客户端以特定方式构建,因此您可以通过扫描QRCode或提供url来选择加载JS的url。

    请注意,此客户端还可以从 localhost 加载 JS 包,让您的开发体验更轻松:不需要 XCode 或 Android Studio,而且在手机上运行您的第一个 Hello World 会更快(从几小时到几分钟)。您实际上可以在没有 Mac 的情况下在 iPhone 上进行开发,并且设置需要 2 分钟。

    实际上由于Expo SDK是可以升级的,Expo客户端包含一个兼容层,因此可以运行最新的5个SDK版本。

    Expo 提供构建服务

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

    Expo 构建的 2 个应用程序的主要区别在于应用程序应该下载 JS 包以运行的硬编码 url。

    Expo 还为您做一些其他事情,例如提供一种声明方式来设置应用程序图标、方向、权限、api 键,帮助您设置推送通知、配置文件...许多设置必须在构建时在应用程序,不能通过无线方式更改。

    Expo 之于 React Native 就像 Phonegap 之于 Cordova

    React Native 类似于 Cordova。它不是同一种视图技术(native vs webview),但都允许您从 javascript 控制原生功能,并且都提供插件系统,以便开发人员可以轻松添加新的 JS/native 绑定。

    PhoneGap 类似于 Expo。他们都试图通过一组预定义的附加原生插件来丰富他们所构建的底层平台的原始 API。 PhoneGap 还提供build servicegeneric client,只要您使用经批准的插件即可使用。

    结论

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

    我会明确地向任何新的 React Native 新建项目推荐 Expo,除了这两种情况:

    • 您已经知道您需要的 API 在 Expo 中不可用,并且不会很快提供
    • 您非常关心您的应用程序大小(由于 ExpoKit 的大小,HelloWorld 大于 25mb,但之后它并没有增加太多,因为它只是 JS)

    【讨论】:

    • 我正在尝试查找 API 的 Expo 不支持的列表。有谁知道在哪里可以找到这个?
    • @ronnyrr 我认为这就是您要查找的内容:expo.canny.io 这是您可以按受欢迎程度排序的功能请求列表
    【解决方案4】:

    在Expo官方文档中有说明

    What is the difference between Expo and React Native?

    Expo 有点像用于 React Native 的 Rails。很多事情都为您准备好了,因此您可以更快地开始并走上正确的道路。

    有了 Expo,您不需要 Xcode 或 Android Studio。你只需使用任何你喜欢的文本编辑器(Atom、vim、emacs、Sublime、VS Code,任何你喜欢的)来编写 JavaScript。您可以在 Mac、Windows 和 Linux 上运行 XDE(我们的桌面软件)。

    以下是 Expo 为您提供的一些开箱即用的功能:

    支持 iOS 和 Android

    您可以立即在 iOS 和 Android 上使用用 Expo 编写的应用程序。您不需要为每一个都经历一个单独的构建过程。只需在 iOS 或 Android 上的 App Store(或在您计算机上的模拟器或模拟器中)的 Expo Client 应用程序中打开任何 Expo 应用程序。

    推送通知

    推送通知在 iOS 和 Android 上开箱即用,使用一个统一的 API。您不必设置 APNS 和 GCM/FCM 或配置 ZeroPush 或类似的东西。我们认为我们现在已经让这一切变得尽可能简单。

    Facebook 登录

    这可能需要很长时间才能自己正确设置,但您应该能够在 10 分钟或更短的时间内在 Expo 上运行。

    即时更新

    只需在 XDE 中单击发布,即可在几秒钟内更新所有 Expo 应用程序。您无需进行任何设置;它就是这样工作的。如果您不使用 Expo,您可以使用 Microsoft Code Push 或针对此问题推出自己的解决方案

    资产管理

    图像、视频、字体等都通过 Expo 在 Internet 上动态分发。这意味着它们可以即时更新,并且可以即时更改。 Expo 内置的资产管理系统负责将您的存储库中的所有资产上传到 CDN,以便任何人都能快速加载。

    如果没有 Expo,通常的做法是将您的资产捆绑到您的应用中,这意味着您无法更改它们。或者,您必须自己管理将资产放在 CDN 或类似设备上。

    更容易更新到新的 React Native 版本

    我们每隔几周就会发布新的 Expo。如果你愿意,你可以继续使用旧版本的 React Native,或者升级到新版本,而不必担心重建你的应用程序二进制文件。您可以自行考虑升级 JavaScript。

    但没有原生模块……

    Expo 的最大限制是,如果不分离并使用 ExpoKit,就无法添加自己的原生模块。

    【讨论】:

    • 我在 Windows 8 中使用 expo。如何生成 QR 码以便我直接在我的设备上运行我的应用程序。
    • 我没有在Windows上尝试过,但我认为它在任何系统上都必须是相似的。二维码在Expo XDE 控制台或exp start 控制台命令输出中自动生成。
    • $prasanna 有时您看不到二维码,因为您的手机和开发机器不在同一个网络上。例如,如果您在家工作,请确保您的手机在您的家庭网络上。等等……
    • expo start 还会在您的本地主机上显示一个 IP 地址,您可以从中访问二维码
    【解决方案5】:

    世博会命令行

    优点:

    1. 无需安装 Android Studio 或 Xcode 即可开始构建。
    2. 不需要太多配置。
    3. 使用条形码扫描在安卓和 iPhone 上轻松查看的移动 UI。使用在线 iphone 和 android 模拟器也更容易查看。
    4. 更快的设置和开发。

    缺点:

    1. 无法添加本机依赖项。
    2. 创建.apk.ipa 文件很困难。
    3. apk/ipa 的大小很大。

    React Native CLI

    优点:

    1. 轻松添加本机依赖项。
    2. 创建 .apk.ipa 文件比使用 Expo 容易得多

    注意:React Native CLI 是用于直接使用 React Native 框架的框架。

    缺点:

    1. 需要高级别的配置。
    2. 要求具备 Android 和 iOS 文件夹结构的基本知识。

    如您所见,这两种方法各有利弊;您应该始终根据您对项目的需要来决定使用哪个。

    【讨论】:

    • 简明扼要的解释。谢谢!
    【解决方案6】:

    关于 expo 和 react-native-cli 的优缺点的答案是完整的。我想提一点作为我的个人经验。 Expo 默认在项目中包含许多模块,并且使用它更容易。但它在生产阶段有一个大问题,因为内置的androidios 版本有这么大的尺寸。例如,如果您有一个带有'Hello World' 的页面,则apk 文件大小约为19 MB。在 react-native-cli 中拥有相同的项目将产生一个大小为6 MB 的应用程序。

    因此,如果您想开发商业应用程序,我个人不建议使用 expo。

    【讨论】:

    • 我不认为这是一个足以让 expo 应用程序无法投入生产的充分理由。除此之外,之前的答案已经彻底解释了这一点
    【解决方案7】:

    我会在此说明 Expo 使用的是较旧版本的 react 16.5,这将禁止您使用新的钩子功能。如果您决定使用 Expo,请注意查看您的版本控制。如果您遇到奇怪的错误,则需要将旧版本的 say react-navigation 与 16.5 版本一起使用。

    【讨论】:

    • expo update 在获得 Expo 管理的大多数软件包的兼容版本方面做得非常好。截至目前,我认为它不会更新 React Navigation,但该库实际上是由 Expo 赞助的。就个人而言,我很少遇到 React Navigation 和 Expo 之间的兼容性问题(我想我在使用 beta 版本时遇到了几个问题)。但是,您可能会看到更多不由 Expo 管理的软件包的兼容性问题。
    【解决方案8】:

    expo 是一个围绕 React Native 构建的工具链,可帮助您快速启动应用程序。 它提供了一组工具来简化 React Native 应用程序和接口和服务的开发和测试,这些工具通常在第三方原生 React Native 组件中可用。使用 Expo,您可以在 Expo SDK 中找到所有这些。

    【讨论】:

      【解决方案9】:

      我已经体验了一年多与 expo 合作的经历 如果应用程序的大小对您不重要,请使用 Expo,因为它很容易实现 Map,Push 比 React-native 更容易,但是如果您想在 Google Play 或其他商店中发布应用程序,您将在项目结束时遇到挑战删除 APK 中的一些权限 React-native 您可以更改所有内容,但导入一些库(例如推送通知或地图)也需要一些挑战,因为您必须手动将这些库添加到 android 和 iOS 项目中

      【讨论】:

      • 如果您需要使用第三方 SDK,但只有 Android AAR 可用,您可以将此 AAR 集成到基于 Expo 的项目中吗?
      【解决方案10】:

      expo 是 react native cli 的封装器,它在底层做一些事情以方便开发人员,expo 解决的最常见问题,开发人员不必担心 react native 中经常出现的库的链接问题cli。 Expo 现在提供了大量的库,它们对稳健的开发非常有帮助。 expo 的好处之一是您可以通过 expo 移动应用程序开发适用于 android 和 ios 的应用程序,而无需使用 mac。

      因为它有很多好处,所以使用 expo 也有一些缺点

      • 应用程序大小像地狱一样增加。简单的 hello world 应用大小 > 30 mb
      • 有时,当您需要在应用程序中实现一些本机功能时,您需要退出 expo 并返回以响应本机 cli。而且您永远无法将其恢复为 expo cli。

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 2016-04-11
        • 2019-06-21
        • 2021-10-07
        • 2019-04-27
        • 2019-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多