{"id":10339,"date":"2018-08-07T19:27:30","date_gmt":"2018-08-07T16:27:30","guid":{"rendered":"https:\/\/railsware.com\/blog\/?p=10339"},"modified":"2025-01-31T19:42:03","modified_gmt":"2025-01-31T16:42:03","slug":"react-native-vs-native-app-development-ios-and-android-in-one-go","status":"publish","type":"post","link":"https:\/\/railsware.com\/blog\/react-native-vs-native-app-development-ios-and-android-in-one-go\/","title":{"rendered":"React Native vs. Native App Development &#8211; iOS and Android in One Go"},"content":{"rendered":"\n<p class=\"intro-text\">The development of a mobile application for a <a href=\"https:\/\/railsware.com\/blog\/digital-product-development\/\" target=\"_blank\" rel=\"noopener noreferrer\">digital product<\/a> is a two-lane (or even three-lane) street. Product owners need to take care of users with both iOS and Android on their devices. At the same time, modern technologies provide the capability to build a single app for both platforms. React Native is one of the tools hoping to replace native app development in the future. How likely is it to succeed?<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"2400\" height=\"1260\" src=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2021\/02\/react-native-vs-native-development.jpg\" alt=\"React Native vs Native app development\" class=\"wp-image-13493\" srcset=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2021\/02\/react-native-vs-native-development.jpg 2400w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2021\/02\/react-native-vs-native-development-360x189.jpg 360w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2021\/02\/react-native-vs-native-development-1024x538.jpg 1024w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2021\/02\/react-native-vs-native-development-768x403.jpg 768w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2021\/02\/react-native-vs-native-development-1536x806.jpg 1536w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2021\/02\/react-native-vs-native-development-2048x1075.jpg 2048w\" sizes=\"auto, (max-width: 2400px) 100vw, 2400px\" \/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\">React Native<\/h2>\n\n\n\n<p>In 2015, Facebook announced the release of this superb solution, which allows you to use the same technology for building apps for different mobile platforms &#8211; on a shared codebase. React Native is based on principles that had been introduced four years earlier with the release of React.js. This JavaScript library paved the way to creating a dynamic and powerful user interface in web development. If you want to read about the differences between both Facebook brainchildren, you can do it in our <a href=\"https:\/\/railsware.com\/blog\/react-vs-react-native-development-whats-the-difference\/\" target=\"_blank\" rel=\"noopener noreferrer\">React vs. React Native<\/a> blog post.<\/p>\n\n\n\n<p>With the framework launch, the number of naysayers began to decrease. At the time, developers thought that writing an iPhone app with JS would be terrific but highly improbable. Androiders were less skeptical because they had been waiting until Facebook made React Native available for the most popular mobile operating system in the world so far. Nevertheless, the demand for multi-platform projects spurred a chain reaction, which consolidated React Native\u2019s position in the industry.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How React Native builds a mobile app<\/h3>\n\n\n\n<p>The way you build a mobile app with React Native resembles web app creation. However, web components are replaced with native ones. First, you need to write a single codebase using React. That\u2019s the core of your app. After that, you need to enhance the core with native components to tailor a suitable cross-platform user interface.<\/p>\n\n\n\n<p>To keep up traditions, let\u2019s see how the classic app, &#8220;Hello, world!&#8221;, looks.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import React, { Component } from 'react'\nimport { Text, AppRegistry } from 'react-native'\n\nclass HelloWorld extends Component {\n  render() {\n    return (\n      &lt;View\n        style={{\n          flexDirection: 'row',\n          height: 100,\n          padding: 20,\n        }}\n      >\n        &lt;View style={{ backgroundColor: 'blue', flex: 0.3 }} \/>\n        &lt;View style={{ backgroundColor: 'red', flex: 0.5 }} \/>\n        &lt;Text>Hello, world!&lt;\/Text>\n      &lt;\/View>\n    )\n  }\n}\n<\/pre>\n\n\n\n<p>Components like Text and View take after their web app building counterpart. At the same time, there are plenty of platform-specific options to implement some native UI behavior. React Native engages relevant APIs to render either iOS or Android components. There are several ways to differentiate between them depending on the platform. The first one is by using the <em>Platform<\/em> module, which can detect the OS:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import {Platform, StyleSheet} from 'react-native';\n\nconst styles = StyleSheet.create({\n  height: Platform.OS === 'ios' ? 200 : 100,\n});<\/pre>\n\n\n\n<p>However, this option is not applicable when big parts of a component are platform-specific. Besides, the module does not implement the platform-specific code, as an app developer has to fill each branch in. So, another way is to use a wrapping platform-independent component. <em>react-native-datepicker<\/em> component has the same properties (public interface) on both platforms as it handles internally all the potential differences between platform-specific components. <em>DatePickerAndroid<\/em> is specific for Android, so whenever you have a date picker in your app, you have to handle this one on Android and another one, <em>DatePickerIOS<\/em> on iOS. If you look on <em>mode<\/em> in both &#8211; they are different. So. in some cases, it might not be enough to do just<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const DatePicker = Platform.OS === 'ios' ? DatePickerIOS : DatePickerAndroid\n<\/pre>\n\n\n\n<p>since they have different interfaces.<\/p>\n\n\n\n<p>Another option is to split the code out into separate files marked with a corresponding extension: <em>.ios.<\/em> or <em>.android.<\/em>, for example <em>DatePicker.android.js<\/em>. Such filename would make it easier to understand.<\/p>\n\n\n\n<p>In this regard, threads play a significant role in the building process, because they execute separate tasks in parallel:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Main or UI thread &#8211; renders platform-specific UI<\/li>\n\n\n\n<li>JS thread &#8211; runs the basic JS logic code<\/li>\n\n\n\n<li>Native modules thread &#8211; accesses APIs of different platforms<\/li>\n\n\n\n<li>Render thread &#8211; generate OpenGL commands to draw UI<\/li>\n<\/ul>\n\n\n\n<p><a href=\"https:\/\/railsware.com\/blog\/react-native-ui-components\/\" target=\"_blank\" rel=\"noopener noreferrer\">React Native UI components<\/a> are independent and do not require any wrapper like in hybrid apps.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">React Native pros and cons<\/h3>\n\n\n\n<p>The framework is no longer a new technology but a promising solution to build cross-platform apps. However, it can be both attractive and inappropriate depending on what your goals are. Below, you will find the benefits and flaws that characterize React Native.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Pros<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Single codebase<\/strong>\n<p>This is the main privilege of all cross-platform frameworks including React Native. Instead of building two separate apps, developers can reuse most of the JS code for both Android and iOS.<\/p>\n<\/li>\n\n\n\n<li><strong>Open source<\/strong>\n<p>This attribute provides almost limitless capabilities for the framework improvement with additional features.<\/p>\n<\/li>\n\n\n\n<li><strong>Web to Mobile<\/strong>\n<p>Web technologies underlie the basic principles of React Native which facilitates an engineer\u2019s transition to mobile app development. Thanks to JavaScript, creating mobile applications is similar to web development.<\/p>\n<\/li>\n\n\n\n<li><strong>Components<\/strong>\n<p>You can reuse plenty of accessible components in other projects which is a substantial bonus to your endeavors.<\/p>\n<\/li>\n\n\n\n<li><strong>Hot reloading<\/strong>\n<p>The development time is cut, and productivity goes up due to hot reloading. With this feature, the app is kept running, and new versions of files that you edit at runtime are updated. Now, tweaking the UI is not accompanied by any loss of your state. An engineer immediately sees changes in the app.<\/p>\n<\/li>\n\n\n\n<li><strong>Declarative programming<\/strong>\n<p>React Native leverages declarative programming for creating a mobile UI. That approach facilitates the coding process and makes the code readable and flexible, which is extremely important when new engineers join the project.<\/p>\n<\/li>\n\n\n\n<li><strong>Smaller time expenses<\/strong> <p>With React Native, both the development time and time to market are significantly lessened. Instead of coding separately for Android and iOS, you <a href=\"https:\/\/myhours.com\/articles\/time-management-skills-techniques-strategies-list\" target=\"_blank\" rel=\"noopener\" title=\"\">save valuable time<\/a> due to the code\u2019s reusability. Although you can\u2019t share all of the code, your time efficiency will be extremely high. We\u2019ll dive into that later on.<\/p> <\/li>\n\n\n\n<li><strong>Development costs reduction<\/strong>\n<p>This benefit follows from the previous one in the sense that the less time you spend on development, the smaller the budget you can make do with.<\/p>\n<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Cons<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Native API support<\/strong>\n<p>Although React Native supports the most used APIs, some specific ones or functionality are not available. However, native modules can be a solution to this issue.<\/p>\n<\/li>\n\n\n\n<li><strong>Native Modules<\/strong>\n<p>The native-specified modules like camera access, push notifications, memory storage, device sensors, and others are the key to the above-described problem. At the same time, to take advantage of these parts of the code implemented in the native language, engineers have to possess expertise in this language. If you need to make something that is not available at React Native, you\u2019ll have to learn Java\/Kotlin or Objective-C\/Swift to build the module.<\/p>\n<\/li>\n\n\n\n<li><strong>Design<\/strong>\n<p>Each platform has a specific design language and navigation patterns &#8211; iOS has been stricter for a very long time, and Android is catching up with material design. React Native provides the automatic transformation of the graphical elements according to the required platform. However, there might be some placement issues. As a result, you have to dive deep into the code and figure out how to adjust to the design guidelines.<\/p>\n<\/li>\n\n\n\n<li><strong>Native app interaction<\/strong>\n<p>Unlike native frameworks that ensure access to other native applications, React Native requires the use of third-party libraries or native modules to implement any integration no matter what technology you&#8217;re using.<\/p>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How React Native differs from native app development<\/h2>\n\n\n\n<p>We can\u2019t claim that React Native is better or worse than native development. It\u2019s absolutely different. And the way it differs can be crucial for your decision. Let\u2019s take a look at some essential points in React vs. Native face-off.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">General architecture<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl1-1024x500.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"500\" src=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl1-1024x500.jpg\" alt=\"React-Native-vs-native-app-development\" class=\"wp-image-11546\" srcset=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl1-1024x500.jpg 1024w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl1-360x176.jpg 360w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl1-768x375.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n<p>The answer to the question \u201cHow does React Native work\u201d reveals the main distinction from native mobile development. The framework uses platform-specific UI controls for native rendering. However, it&#8217;s orchestrated by a single-threaded JS code. Also, JS bridge executes the JS runtime and connects the app with its native parts. No hybrid\u2019s WebView implementation makes the app\u2019s functionality and view akin to a native product.<br><br>The most common architectural pattern to build a native app is MVC. It put the app\u2019s structure into three layers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>M &#8211; Model: a layer that manipulates data<\/li>\n\n\n\n<li>V &#8211; View: a presentation layer<\/li>\n\n\n\n<li>C &#8211; Controller: a binding layer between M and V<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl2-1024x563.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"563\" src=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl2-1024x563.jpg\" alt=\"MVC - react-Native-vs-native-app-development\" class=\"wp-image-11547\" srcset=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl2-1024x563.jpg 1024w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl2-360x198.jpg 360w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl2-768x422.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n<p>Schematically, MVC works as follows:<br><br>The MVC derivatives, MVP and MVVM, have similar architecture but replace the C-layer with P (Presenter) and VM (ViewModel) respectively.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl3-1024x563.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"563\" src=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl3-1024x563.jpg\" alt=\"VIPER - react-native-vs-native-app-development\" class=\"wp-image-11548\" srcset=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl3-1024x563.jpg 1024w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl3-360x198.jpg 360w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl3-768x422.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl4-1024x563.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"563\" src=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl4-1024x563.jpg\" alt=\"MVVM-react-native-vs-native-app-development\" class=\"wp-image-11549\" srcset=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl4-1024x563.jpg 1024w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl4-360x198.jpg 360w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-NativeVSNativeAppDevelopment-Tabl4-768x422.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n<p>These patterns are mostly used for making Android apps. iOS developers usually opt for another option that does not come from the MV family. It is called VIPER and consists of five layers: View, \u200aInteractor, Presenter, Entity, and \u200aRouter.<br><br>At the same time, it is a usual practice to encounter a mix of architectures in one native app. For example, MVVM works best when used with a binding framework ike <a href=\"https:\/\/github.com\/ReactiveCocoa\/ReactiveCocoa\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ReactiveCocoa<\/a> &#8211; a pure representative of the functional reactive programming paradigm.<br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Platform-specific components<\/h3>\n\n\n\n<p>For a native app, the user interface and experience is to be coined according to the requirements of one platform, be it iOS or Android. The essence of cross-platform development is to focus on design conventions of both platforms in one go. It is important not to affect the UX of different categories of users. React Native allows you to handle the separation of platform-specific components via:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Platform module\n<p>It detects the platform to implement platform-specific code. <em>Platform.OS<\/em> will differ as follows:<\/p>\n<\/li>\n<\/ul>\n\n\n\n<p><strong>iOS<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import {Platform, StyleSheet} from 'react-native';\n\nconst styles = StyleSheet.create({\n  height: Platform.OS === 'ios' ? 200 : 100,\n});\n<\/pre>\n\n\n\n<p><strong>Android<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import {Platform, StyleSheet} from 'react-native';\n\nconst styles = StyleSheet.create({\n  height: Platform.OS === 'android' ? 200 : 100,\n});\n<\/pre>\n\n\n\n<p>With <em>Platform.select<\/em> method, you can return the value for the running platform.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { Platform, StyleSheet } from 'react-native';\nconst styles = StyleSheet.create({\n  controlContainer: Platform.select({\n    android: {\n      backgroundColor: 'green',\n     },\n    ios: {\n      backgroundColor: 'yellow\u2019',\n    },\n  }),\n});\n<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Platform-specific file extensions\n<p>This way is suitable for complex and big parts of a platform-specific component. Therefore, the code is split into separate files, which will be loaded in accordance with the detected platform. For example, you can have two separate files for the <em>SelectListControl<\/em> component:<\/p>\n<ul style=\"margin: 1px;\">\n<li><em>SelectListControl.android.js<\/em><\/li>\n<li><em>SelectListControl.ios.js<\/em><\/li>\n<\/ul>\n<p>When requiring the component via <em>import SelectListControl from &#8216;.\/SelectListControl;<\/em>, the proper file will be loaded automatically.<\/p>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Navigation<\/h3>\n\n\n\n<p>Navigation in mobile app development is a tricky thing. It covers not only the ability to go back, skip, undo and other functional actions but also the consolidation of ceremonies required to render a new screen. Each platform has its peculiarities and as well as approaches to navigation UX. Examples of differences in navigation paradigms include a physical home button on iOS vs. navigation of three buttons on Android; or a swipe-back gesture to navigate back on iOS vs. a navigation drawer sliding from the left side on Android. You can opt for numerous solutions to implement navigation in React Native, but the framework itself provides two default modules:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>NavigatorIOS\n<p>It is the pioneer navigation stack meant for iOS since it was the first platform React Native started on. NavigatorIOS is a simpler solution, which rests on the native iOS navigation stack.<\/p>\n<\/li>\n\n\n\n<li>Navigator\n<p>Navigator is an attempt to make a match-all navigation codebase for both platforms. It is a React component to deal with mapping a route and rendering function. Navigator has a preset piece of UI, ToolbarAndroid (strongly tied to the view) and Navigator.NavigationBar (strongly tied to routes), that functions as the top navigation bar.<\/p>\n<\/li>\n<\/ul>\n\n\n\n<p>If the default solutions are not what you need, there are plenty of JS-based and native implementation modules as well:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>JavaScript-based modules:\n<ul class=\"wp-block-list\">\n<li>React Navigation<\/li>\n\n\n\n<li>React Native Router Flux<\/li>\n\n\n\n<li>React Native simple Router<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Native modules:\n<ul class=\"wp-block-list\">\n<li>Re-route-Native<\/li>\n\n\n\n<li>Native-navigation<\/li>\n\n\n\n<li>React-native-navigation<\/li>\n\n\n\n<li>React Router Navigation<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Bundle size<\/h3>\n\n\n\n<p>Native apps are devoid of any additional runtime and other adjoined elements. Therefore their bundle size is much smaller. React Native comes with a compiled WebKit engine (JS runtime + native components), which boosts app size by a few MB.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ecosystem<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-App-Ecosystem-1024x839.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"839\" src=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-App-Ecosystem-1024x839.jpg\" alt=\"Ecosystem-react-native-vs-native-app-development\" class=\"wp-image-11558\" srcset=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-App-Ecosystem-1024x839.jpg 1024w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-App-Ecosystem-360x295.jpg 360w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-App-Ecosystem-768x629.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Syntax<\/h3>\n\n\n\n<p>React Native uses JSX, an XML-like syntax extension to ECMAScript. You may have noticed it in our \u201cHello, world!\u201d code sample:<br><em>Hello, world!<\/em><br>Some frameworks have a special templating language to embed code inside markup language, and here is the reverse case: JSX allows you to embed XML within JS. However, it is not obligatory to use this syntax sugar, and you can do with plain JavaScript. Let\u2019s take a look at some basics.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Variables<\/h4>\n\n\n\n<p>You can define variables using <em>let, const<\/em> and <em>var<\/em>. The latter is the old way of defining variables, which now is considered unsafe to use. Let is used to define a mutable variable.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">let myVariable = 123<\/pre>\n\n\n\n<p>You cannot change a variable declared with <em>const<\/em>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const myVariable = 123<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Arrays<\/h4>\n\n\n\n<p>To declare array in JS, you can use <em>new Array<\/em> or simple square brackets (array literal).<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">new Array(1, 2, 3)\n[ 1, 2, 3 ]<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Objects<\/h4>\n\n\n\n<p>Objects are collections of key\/value pairs. &#8220;Object&#8221; type can be used in different ways compared to those in statically-typed languages. To create a new object, you can use:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const obj = new Object();<\/pre>\n\n\n\n<p>or the shorthand way<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const obj = {};<\/pre>\n\n\n\n<p>You can also initialize it with key\/value pairs as follows:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const obj = {\n  \u201ckey1\u201d: 1,\n2: \u201cvalue\"\n};\n<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Functions<\/h4>\n\n\n\n<p>JS treats functions as first-class citizens. To create a function declaration, you need to use a <em>function<\/em> keyword or a shorter arrow syntax<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">const foo = () => 44<\/pre>\n\n\n\n<p>The body of the function is contained in curly braces. Names created in the function definition are parameters. They define a function. The value the function receives from each parameter is an argument.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">function log(arg1, arg2) {\n};<\/pre>\n\n\n\n<p>Every function in JS returns implicitly unless stated otherwise explicitly with a return statement.<\/p>\n\n\n\n<p>And here is a small bonus &#8211; a short syntax comparison between JavaScript and two languages used in native app development.<\/p>\n\n\n\n<table id=\"tablepress-30\" class=\"tablepress tablepress-id-30 tbody-has-connected-cells\">\n<thead>\n<tr class=\"row-1\">\n\t<td class=\"column-1\"><\/td><th class=\"column-2\">JavaScript (ES6)<\/th><th class=\"column-3\">Kotlin<\/th><th class=\"column-4\">Swift<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\"><strong>Hello World<\/strong><\/td><td class=\"column-2\"><Text>Hello, world!<\/Text><\/td><td class=\"column-3\"><TextView<br \/>\nandroid:text=\"Hello World!\"\/><\/td><td class=\"column-4\">print(\"Hello, world!\")<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\"><strong>Variables<\/strong><\/td><td class=\"column-2\"><em>let<\/em><br \/>\n<em>var<\/em> (old way of defining variables)<\/td><td class=\"column-3\"><em>var<\/em><\/td><td class=\"column-4\"><em>var<\/em><\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\"><strong>Constants<\/strong><\/td><td class=\"column-2\"><em>const<\/em><\/td><td class=\"column-3\"><em>val<\/em><\/td><td class=\"column-4\"><em>let<\/em><\/td>\n<\/tr>\n<tr class=\"row-5\">\n\t<td class=\"column-1\"><strong>Functions<\/strong><\/td><td class=\"column-2\"><em>function<\/em><\/td><td class=\"column-3\"><em>fun<\/em><\/td><td class=\"column-4\"><em>func<\/em><\/td>\n<\/tr>\n<tr class=\"row-6\">\n\t<td class=\"column-1\"><strong>Arrays<\/strong><\/td><td class=\"column-2\"><em>New Array(1, 2, 3)<\/em><br \/>\n<em>[1, 2, 3]<\/em><\/td><td class=\"column-3\"><em>arrayOf(1, 2, 3)<\/em><br \/>\n<em>[1, 2, 3]<\/em><\/td><td class=\"column-4\"><em>[1, 2, 3]<\/em><\/td>\n<\/tr>\n<tr class=\"row-7\">\n\t<td class=\"column-1\"><strong>Null<\/strong><\/td><td class=\"column-2\"><em>null<\/em><\/td><td class=\"column-3\"><em>null<\/em><\/td><td class=\"column-4\"><em>nil<\/em><\/td>\n<\/tr>\n<tr class=\"row-8\">\n\t<td colspan=\"4\" class=\"column-1\"><strong>Handling of optionals<\/strong><br \/>\nThe essence of the Optional type is that there is a value, and it equals x, or there is no value at all. Let\u2019s find out how JS, Kotlin, and Swift handle them.<\/td>\n<\/tr>\n<tr class=\"row-9\">\n\t<td colspan=\"4\" class=\"column-1\"><strong>JavaScript<\/strong><br \/>\nOptionals are not supported in ES6. However, there is a Babel plugin that supports optional chaining<br \/>\n <br \/>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\">const name = Math.random() &gt; 0.5 ? \"Lucky guy\" : null<br \/>\nif (name) { <br \/>\n\/\/ with the plugin optional chaining looks like: <br \/>\nauthenticator.user?.name<br \/>\n  console.log(name) <br \/>\n}<br \/>\n<br \/>\nconst age = 21<br \/>\nconsole.log(age)<br \/>\nconst isAdult = (age || 0) &gt;= 18<br \/>\nconsole.log(isAdult)<br \/>\n<\/pre> <br \/>\n<br \/>\n<strong>TypeScript<\/strong><br><br \/>\nTypeScript is a common flavor these days and it helps with null safety:<br \/>\n <br \/>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">const name: string | null = Math.random() &gt; 0.5 ? \"Lucky guy\" : null;<br \/>\nif (name) { \/\/ <br \/>\n  console.log(name);<br \/>\n}<br \/>\nconst age: number | null = 21;<br \/>\nconsole.log(age!); <br \/>\n\/\/ if null, then no exception is thrown by default unless application code cannot handle null<br \/>\nconst isAdult: boolean = (age || 0) &gt;= 18;<br \/>\nconsole.log(isAdult);<br \/>\n\/\/ different syntax for defining nullable types (optionals)<br \/>\ninterface Options {<br \/>\n  location?: string<br \/>\n}<br \/>\nfunction foo(options?: Options) {<br \/>\n  return options?.location; \/\/ supports chaining with Babel plugin <br \/>\n}<\/pre><\/td>\n<\/tr>\n<tr class=\"row-10\">\n\t<td colspan=\"4\" class=\"column-1\"><strong>Kotlin<\/strong><br \/>\n <br \/>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\">val name : String? = if (Math.random() &gt; 0.5) \"Lucky guy\" else null <br \/>\n\/\/ define an optional value<br \/>\nname?.let { println(it) } <br \/>\n\/\/ call the block only if name is not null (?. supports optional chaining)<br \/>\nval age : Int? = 21<br \/>\nprintln(age!!) <br \/>\n\/\/ unwrapping - if age was null, then kotlin.KotlinNullPointerException would be thrown<br \/>\nval isAdult = (age ?: 0) &gt;= 18 <br \/>\n\/\/ elvis operator(the null-safe navigation operator) to unwrapping value while providing a fallback:<br \/>\nif age was null, then 0 would be used for comparison with 18<\/pre><\/td>\n<\/tr>\n<tr class=\"row-11\">\n\t<td colspan=\"4\" class=\"column-1\"><strong>Swift<\/strong><br \/>\n <br \/>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">import Foundation<br \/>\nlet optionalName : String? = Bool.random() ? \"Lucky guy\" : nil<br \/>\nif let name = optionalName { <br \/>\n\/\/ supports optional chaining like: let name = authenticator.user?.name<br \/>\n    print(name)<br \/>\n}<br \/>\nlet age : Int? = 21<br \/>\nprint(age!) <br \/>\n\/\/ if age was nil, then an exception would be thrown<br \/>\nlet isAdult = (age ?? 0) &gt;= 18<br \/>\nprint(isAdult)<br \/>\n<\/pre><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-30 from cache -->\n\n\n\n<h3 class=\"wp-block-heading\">Knowledge<\/h3>\n\n\n\n<p>To build a native app, you could confine yourself to expertise in specific language and integrated development environment according to the OS for the application. With React Native, your domain knowledge should include JS or its syntax sugar JSX, as well as supporting tools for testing, debugging, text editing, etc. A background of React and web development technologies will be a huge advantage for learners of React Native. Check out our <a href=\"https:\/\/railsware.com\/blog\/8-react-native-books-to-upgrade-your-skills-in-mobile-app-development\/\" target=\"_blank\" rel=\"noopener noreferrer\">picks of books<\/a> to master the framework.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Development time and cost<\/h3>\n\n\n\n<p>If you\u2019re making one mobile app for iOS or Android, the native approach is more productive despite all React Native\u2019s advantages. However, we are talking about cross-platform app development, which requires additional resources in terms of money and time. In that case, the framework is a super booster thank to code reusability. At <a href=\"https:\/\/developers.facebook.com\/videos\/f8-2018\/how-react-native-helps-companies-build-better-mobile-apps\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">F8 2018<\/a>, we\u2019ve learned the following code reuse rates in some famous applications &#8211; 93% for Facebook, 85% for Skype, and approximately 86% for TaskRabbit. In practice, this means that development time, as well as costs, will be much lower. Meanwhile, <a href=\"https:\/\/railsware.com\/blog\/debugging-react-native\/\" target=\"_blank\" rel=\"noopener noreferrer\">debugging React Native<\/a> might be a problem since errors go through many layers and different stacks &#8211; JS, bridge, native components. And that can tear off much of your development time.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Documentation<\/h3>\n\n\n\n<p>Comparing Swift vs. React Native or another technology in terms of documentation is a tough task. Every software producer be it Apple, Google or Facebook apply huge efforts to deliver exhaustive documentation. Along with regular docs, each tech stack is provided with helpful prompts and code samples. Moreover, they are not novice but mature technologies. So, we can state a draw here.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sophistication<\/h3>\n\n\n\n<p>React Native loses to native SDKs from the tech perspective. In other words, you opt for a cross-platform solution if some existing product needs to be improved or upgraded. Complex stuff including augmented\/virtual reality, Big Data Mining algorithms and other sophisticated things require the power and technical abilities of native technologies.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">React Native performance compared to native app development<\/h2>\n\n\n\n<p>React Native has an ace in the hole &#8211; it can use React.js for mobile apps performance increase. As a result, all the best of React like the increased app performance, simplified programming methods, and so on are at developers\u2019 fingertips. Moreover, there is no need to compile the app every time you tweak anything. You can just refresh it using Live Reload or enjoy Hot Reloading that automatically updates the changes. The native approach cannot provide that and lags behind in terms of productivity, time to deployment, and flexibility of app development.<\/p>\n\n\n\n<p>It would be awesome to take a simple app having authentication, list view, and other basic features and triplicate it using three different tech stacks: React Native, Swift\/Objective C, and Kotlin\/Java. Actually, John Calderaio, a self-driven engineer, has <a href=\"https:\/\/medium.com\/the-react-native-log\/comparing-the-performance-between-native-ios-swift-and-react-native-7b5490d363e2\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">put this idea into action<\/a>. He used Swift and React Native to build the same app with four tabs: Profile, To-Do list, Pageview controller, and Maps (<a href=\"https:\/\/railsware.com\/blog\/maps-with-react-native-rails-and-postgresql\/\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a> is more about how to embed a geolocation search feature into your React Native app). Measurements of usage of memory, CPU, and GPU of both apps are introduced below.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Memory usage in MiB<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"699\" src=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-Development-Gr-1-1024x699.jpg\" alt=\"Memory-usage-React-Native-vs-Native-Development\" class=\"wp-image-11550\" srcset=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-Development-Gr-1-1024x699.jpg 1024w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-Development-Gr-1-360x246.jpg 360w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-Development-Gr-1-768x524.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">CPU usage in %<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"699\" src=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-Development-Gr-2-1024x699.jpg\" alt=\"CPU-usage-React-Native-vs-Native-Development\" class=\"wp-image-11551\" srcset=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-Development-Gr-2-1024x699.jpg 1024w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-Development-Gr-2-360x246.jpg 360w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-Development-Gr-2-768x524.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">GPU usage in frames per second<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"699\" src=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-Development-Gr-3-1024x699.jpg\" alt=\"GPU-usage-React-Native-vs-Native-Development\" class=\"wp-image-11552\" srcset=\"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-Development-Gr-3-1024x699.jpg 1024w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-Development-Gr-3-360x246.jpg 360w, https:\/\/railsware.com\/blog\/wp-content\/uploads\/2019\/04\/React-Native-vs-Native-Development-Gr-3-768x524.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<p><br>This particular test allowed us to realize that React Native can be on a par with native technology in performance.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why should I choose React Native to build an app<\/h2>\n\n\n\n<p>Now, we come to the question \u201cIs React Native the right tool for my next project?\u201d Of course, a lot of details and criteria should be weighed to get a proper answer. However, you will hardly find a better solution for a cross-platform application. And here are some reasons why:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Code shareability across platforms<\/h3>\n\n\n\n<p>Native applications entail the burden of defining separate app logic depending on the OS. With React Native, you can forget about swinging from Android to iOS and vice versa. You write code for one operating system and share it on another one with some subtle adjustment. In other words, you accelerate your productivity almost twofold.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">No WebView<\/h3>\n\n\n\n<p>Hybrid apps rely mostly on WebView, which allows you to define a custom JavaScript-to-native bridge. React Native does the same but uses a bridge between JS and native modules. That means faster loading and reduced memory usage. Also, UI rendering uses native controls but HTML in the browser. Read more about this in our comparison of <a href=\"https:\/\/railsware.com\/blog\/ionic-vs-react-native-building-a-mobile-app\/\" target=\"_blank\" rel=\"noopener noreferrer\">Ionic vs. React Native<\/a> feat. Flutter.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Better UX requires great UI<\/h3>\n\n\n\n<p>By leveraging the best of React.js, mobile framework puts an emphasis on refining the user interface to make it seamlessly integrated into the entire app environment. Hybrid apps fall behind React Native in responsiveness which means approaching a better user experience.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Save money<\/h3>\n\n\n\n<p>Another attractive feature of React Native is the adequacy of human resources on the market. All your project will need is good JS developers with some React expertise &#8211; and you can start. Even a small team of engineers can handle a tough project with scarce resources.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Railsware\u2019s cross-platform development experience<\/h2>\n\n\n\n<p>Our software agency is known for its affection for Ruby and its framework Rails. Still, React Native holds an important place in our technology fleet. For example, at the Ruby Meditation #17 conference, one of our engineers introduced his ideas and vision of this cross-platform technology from a <a href=\"http:\/\/leopard.in.ua\/presentations\/rubymeditation_17_2017\/#ReactNativeDisadvantages\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Rubyist\u2019s perspective<\/a>. We go with the tides which means leveraging the best technologies for production. However, do not think that it is a matter of the comparison of React Native vs. Swift\/Java. We count on efficiency and productivity. And that is definitely the focus area of React Native. It prevents the differentiation of iOS or Android developers in the company; it is easy in employment and cost-efficient in support.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wrapping up<\/h2>\n\n\n\n<p>In short, React Native is an astonishing tool for <a href=\"https:\/\/railsware.com\/mobile\/\" target=\"_blank\" rel=\"noopener noreferrer\">mobile app building<\/a>. It can be a perfect choice for enthusiasts who are aimed at multi-platform app without much complexity. If you have a small budget or a web development team, those are also the appropriate conditions to leverage the framework for your project. You won&#8217;t have to learn to love React Native since it immediately impresses you with its ability to accelerate app development by reusing code for different operating systems without sacrificing user experience.<\/p>\n","protected":false},"excerpt":{"rendered":"<p> React Native allows you to build cross-platform mobile apps that look and feel like native ones. Read more about our hands-on experience of using the framework and what are the chances it will replace native app development in the future.<\/p>\n","protected":false},"author":69,"featured_media":10393,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[3],"tags":[],"coauthors":["Artur Hebda"],"class_list":["post-10339","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development"],"acf":[],"aioseo_notices":[],"categories_data":[{"name":"Engineering","link":"https:\/\/railsware.com\/blog?category=development"}],"post_thumbnails":"https:\/\/railsware.com\/blog\/wp-content\/uploads\/2021\/02\/react-native-vs-native-development.jpg","amp_enabled":true,"_links":{"self":[{"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/posts\/10339","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/users\/69"}],"replies":[{"embeddable":true,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/comments?post=10339"}],"version-history":[{"count":34,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/posts\/10339\/revisions"}],"predecessor-version":[{"id":18652,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/posts\/10339\/revisions\/18652"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/media\/10393"}],"wp:attachment":[{"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/media?parent=10339"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/categories?post=10339"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/tags?post=10339"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/railsware.com\/blog\/wp-json\/wp\/v2\/coauthors?post=10339"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}