Reacciona nativo para los pequeños. Experiencia de desarrollo móvil

Una vez, en un equipo de producto, querían desarrollar una aplicación móvil para probar la hipótesis de la demanda del producto y su conveniencia para los usuarios. Y el hecho de que el equipo no tuviera desarrolladores móviles no hizo daño. Dos desarrolladores front-end tomaron React Native y escribieron una aplicación en tres meses. La prueba de hipótesis fue exitosa, la aplicación continúa evolucionando y despierta el interés de otros equipos en la empresa.


Imagen de la descripción de la herramienta: www.semrush.com/news/position-tracking-on-the-go .

Esta es una breve descripción de la historia del equipo de Artyom Lashevsky, que durante tres meses desde el desarrollador front-end se ha convertido en móvil. Para obtener más detalles sobre cómo sucedió esto, lea la decodificación del informe de Artyom en FrontendConf 2019: qué es React Native, por qué es, una instrucción paso a paso para crear una aplicación y elegir las bibliotecas y componentes correctos.

Artyom Lashevsky es un desarrollador front-end líder en SEMrush y especialista en el campo de la seguridad de la información de sistemas automatizados.


¿Por qué necesitamos una aplicación?


SEMrush es una compañía internacional de TI que desarrolla una gran plataforma en línea para vendedores. Incluido en las plataformas TOP 3 para marketing y SEO. La compañía tiene 5 millones de usuarios, 7 oficinas en dos continentes, 800 empleados y 30 equipos de desarrollo.

Cada equipo de desarrollo maneja su propia herramienta dentro de la plataforma. Trabajo en uno de estos equipos de 8 personas: dos en la interfaz, tres en el backend, control de calidad, ingeniero de DevOps y PO. La herramienta en la que nuestro equipo está trabajando permite a los usuarios verificar la posición de las páginas de su sitio para búsquedas específicas de Google. La herramienta ayuda a verificar la posición en las palabras clave no solo de su sitio, sino también de sus competidores, y a analizar y comparar.

La plataforma funciona en un navegador. El lanzamiento de una aplicación móvil le permitirá obtenerventaja competitiva , porque la aplicación ayuda a retener a los usuarios antiguos por más tiempo y aumenta la conversión de gratis a pago.

Para los usuarios, la aplicación mejora la usabilidad de la plataforma. A través del teléfono, el cliente puede usar SEMrush donde antes se necesitaba una computadora. Ingrese a la aplicación, vea si su sitio ha caído en el SERP de Google o ha aumentado: las métricas clave siempre están a la mano . Si se sumergieron, entonces en la versión web puede ver los detalles y comprender cómo solucionar la situación.

Nuestro equipo vio el potencial de la aplicación móvil y decidió intentar desarrollarla, pero no había desarrolladores móviles entre nosotros. Comenzamos a estudiar herramientas y tecnologías para el desarrollo de aplicaciones nosotros mismos.

Aplicaciones nativas- Lo primero que notaste. Después de estudiar, nos dimos cuenta de que para nosotros es largo, costoso e inconveniente: debe estudiar dos pilas de tecnología, duplicar la funcionalidad y probarla dos veces.



Pasamos del desarrollo nativo al estudio de WebView (Apache Cordova). Un colega frontend tenía experiencia en el desarrollo de Cordova, por lo que en el primer sprint para estudiar tecnologías y soluciones, uno de los prototipos se desarrolló en Cordova.



Pero queríamos algo más moderno: "juventud de moda", así que pasamos a soluciones multiplataforma.

Desarrollo multiplataforma. Se consideraron varias opciones: Flutter, Xamarin, Native Script y React Native. Para nosotros, cada una de las opciones tenía su propio signo negativo, porque queríamos comenzar lo antes posible:

  • Flutter requiere conocimiento de Dart (una alternativa a JavaScript). No había tiempo para estudiar tecnologías relacionadas: quería "volar" rápidamente para probar la hipótesis.
  • Xamarin requiere conocimiento de C #. Tenemos desarrolladores de back-end, pero iOS y Android requieren interfaces diferentes. De todos modos, tienes que duplicar el código y las implementaciones.
  • Native Script está diseñado para combinarse con Angular. Nuestro proyecto utiliza ReactJS y Redux, por lo que no.
  • React Native parecía genial, y lo eligieron a él. Además, solo queríamos probarlo, a pesar de las desventajas y ventajas de otras soluciones.

Durante la selección, no encontramos a Ionic. Quizás lo habrían considerado también, pero habrían elegido React Native de todos modos.

Reaccionar nativo


Este es un marco de Facebook para desarrollar aplicaciones nativas multiplataforma. Construido sobre la base de ReactJS, bajo el capó no utiliza WebView, por lo que no hay DOM API. React Native no tiene HTML y CSS, pero hay algunos componentes de plataforma en JSX y polyfiles similares a CSS.

React Native contiene algunas API de JavaScript sobre componentes nativos. Esto significa que los componentes nativos tienen algún tipo de "enlace" a los componentes de JavaScript en ReactJS. La relación entre los paquetes nativos y JavaScript se realiza a través del puente utilizando la API de JavaScript. Superficialmente, esto es toda arquitectura.



Reaccionar profesionales nativos:

  • Multiplataforma . Queríamos escribir la aplicación inicialmente en iOS, pero el lanzamiento adicional en Android es una gran ventaja.
  • . , . React Native , 80% .
  • . Telegram React Native 3000 . , , , .
  • . — , . , ReactJS React Native.


Con React Native, hay dos formas de desarrollar una aplicación: use la CLI de Expo o React Native.

Expo Esta es una capa de abstracción: un conjunto de herramientas, bibliotecas y servicios para un inicio rápido. Esta es una API que, de forma inmediata, brinda acceso a las capacidades del dispositivo : a la cámara, la geolocalización, los mensajes push.

Expo tiene herramientas de depuración y prueba de aplicaciones. El algoritmo es simple: instale la aplicación Expo Client en el teléfono, conecte el teléfono con la computadora a la misma red local, vaya a Expo en el teléfono, abra la aplicación en desarrollo. Todos los cambios en el código se muestran al instante. Esto ayuda a probar y compartir en el equipo.

Despegar en la Expo es rápido y rápido. Con Expo, Xcode y Android Studio no son necesarios. Escribimos en nuestro entorno de desarrollo, recopilamos la aplicación utilizando el servicio Expo, firmamos y actualizamos sobre la marcha.

Pero también hay desventajas.

  • No puede agregar módulos nativos personalizados.
  • Expo es una capa de abstracción sobre React Native. No puede actualizar a una nueva versión del marco hasta que se actualice Expo.

Reaccionar CLI nativo . Su ventaja es la posibilidad de personalización , agregando módulos nativos.

Pero para firmar y construir la aplicación (y publicar) necesita Xcode o Android Studio. Para probar la aplicación, debe compilarla y descargarla a su teléfono, por ejemplo, usando TestFlight para iOS o la instalación directa desde la PC al teléfono. Esquema estándar, pero inconveniente y largo.



En general, la elección es simple: queremos desarrollar un prototipo: seleccionamos Expo, queremos una aplicación con el cliente potencial: React Native CLI.
Elegimos React Native CLI. En SEMrush, probablemente querremos escribir nuestras partes nativas personalizadas, por lo que el punto con módulos nativos y bibliotecas de terceros con módulos se convirtió en un factor decisivo. Con React Native CLI, el inicio es más lento debido a una gran cantidad de capacitación, pero en el futuro habrá más oportunidades.

Muchos colegas, usando React Native, enfrentaron la necesidad de personalización, y tuvieron que hacer comandos de expulsión especiales con Expo en la CLI de React Native. La estructura de directorios de los archivos de una aplicación simple se transfiere del conjunto habitual de archivos JavaScript a carpetas para Android, iOS y JavaScript. Pero con una aplicación compleja habrá dificultades.

Estamos escribiendo una solicitud


En ningún habitual Reaccionar elementos de CSS, DOM y nativos web: div, span, li, button. Pero hay dos tipos de componentes de plataforma en React Native.

  • Multiplataforma : View, Text, Imagey otros.
  • Específico para cada plataforma , por ejemplo, DatePickerIOSo DatePickerAndroid.

La transición de React reaccionar nativo es simple: bloquea divTI View, TI bloques spande TI Text, y la muestra lio ul- FlatList. Para cada elemento hay una correspondencia.

Nota. Para transferir componentes web ya preparados a otros que no sean web, puede escribir un transportador, pero generalmente es más fácil volver a escribirlo.

Puede comenzar a escribir React Native con bastante rapidez.

import React, {Component} from 'react';
import {Text, View, StyleSheet} from 'react-native';

export default class App extends Component {
    render() {
        return (
            <View style={styles.container}>
                <Image style={styles.image} source={require('./img/main.png')}/>
                <Text style={styles.welcome}>Hello, SEMrush!</Text>
            </View>
        );
    }
}

Hay alguna clase App(contenedor de aplicaciones). Contiene un método renderen el que se dibuja la parte visual. Contiene el contenedor Viewdentro del cual va Imagey Text.

Cada uno de los elementos, por ejemplo, Viewcontiene un atributo stylecuyo valor se especifica a través del objeto styles.

Se stylescrea un objeto utilizando el módulo del StyleSheetmétodo createReact Native. Este objeto es una notación de objeto CSS, un modelo CSS simplificado que es suficiente. Flexbox también se usa para el diseño de la interfaz, también simplificado, pero es suficiente para alinearlo horizontal y verticalmente.

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
    welcome: {
        fontSize: 20,
        textAlign: 'center',
        margin: 10,
    },
    image: {
        marginBottom: 20,
    },
});

Hecho: escribimos una aplicación para iOS. Mirando hacia el futuro, aclararé que también funciona para Android.


La primera aplicación es "¡Hola, mundo!".

Multiplataforma


Queríamos que nuestra aplicación funcionara tanto en Android como en iOS. Al mismo tiempo, queríamos poder hacer varias implementaciones dependiendo de la plataforma. Hay dos formas de hacer esto en React Native.

La primera forma es usar el módulo de plataforma . Por ejemplo, creamos una aplicación y establecemos la altura según la plataforma. Para iOS, la altura es 200, para Android, es 100. Usando el método, Platform.OSdeterminamos qué plataforma está usando el usuario.

import {Platform, StyleSheet} from 'react-native';

const styles = StyleSheet.create({
    height: Platform.OS === 'ios' & 200 : 100,
});

Si tenemos 40 de estos atributos, no hay necesidad de duplicar el código. Hay un método Platform.selectdel mismo módulo para esto. Devuelve un conjunto de propiedades por la clave de la plataforma: en iOS devuelve backgroundColor = 'red', en Android - backgroundColor = 'blue'. Como resultado, podemos devolver nuestro conjunto de atributos para iOS (puede haber al menos 20, al menos 40 de ellos), para Android, un conjunto completamente diferente.

import {Platform, StyleSheet} from 'react-native';

const styles = StyleSheet.create({
    container: {
        flex: 1,
        ...Platform.select({
            ios: {
                backgroundColor: 'red',
            },
            android: {
                backgroundColor: 'blue',
            },
        }),
    },
});

El método le Platform.selectpermite escribir componentes multiplataforma.

const Component = Platform.select({
    ios: () => require('ComponentIOS'),
    android: () => require('ComponentAndroid'),
})();

<Component />;

Algunos componentes usan un método Platform.selectque, dependiendo de la clave de la plataforma, devuelve su implementación. Todo está bien, tomamos y escribimos una biblioteca multiplataforma.

Si hay soluciones personalizadas o restricciones en el sistema operativo, podemos determinar la versión del sistema operativo.

import {Platform} from 'react-native';

if (Platform.Version ===25) {
    console.log('Running on Nougat!');
}

import {Platform} from 'react-native';

const majorVersionIOS = parceInt(platform.Version, 10);
if (majorVersionIOS <= 9) {
    console.log('Work around a change in behavior');
}

El segundo método: use la extensión de archivo específica de la plataforma ( *.android.jsy *.ios.js). Esto le permite desarrollar implementaciones multiplataforma para un código más voluminoso y una lógica compleja. Luego dividimos todo el código en dos archivos, por ejemplo, BigButton.ios.jsy BigButton.android.js. En el código donde queremos usarlo, usamos la interfaz e importamos BigButton. React Native se encargará de las importaciones necesarias según la plataforma.

Componentes


Podemos implementar soluciones multiplataforma, pero la velocidad es importante. Por lo tanto, pasamos a soluciones ya preparadas: bibliotecas de componentes. Investigué, destaqué muchas soluciones excelentes (kit de interfaz de usuario) y elegí NativeBase . Esta es una gran biblioteca con una docena de componentes, 12,000 estrellas en GitHub, que le permite resolver la mayoría de los problemas.

   
Ejemplo de IU para iOS a la izquierda, para Android a la derecha.

En nuestro proyecto, utilizamos parcialmente esta biblioteca, personalizamos elementos y establecemos nuestros propios estilos. Por ejemplo, tenemos Buttono componentes Headerque importamos de la biblioteca NativeBase.



Escribimos el código una vez, mientras que en cada plataforma se ve diferente.

import React, { Component } from 'react';
import { Container, Header, Content, Button, Text } from 'native-base';
export default class ButtonThemeExample extends Component {
    render() {
        return (
            <Container>
                <Header />
                <Content>
                    <Button light><Text> Light </Text></Button>
                    <Button primary><Text> Primary </Text></Button>
                    <Button success><Text> Success </Text></Button>
                    <Button info><Text> Info </Text></Button>
                    <Button warning><Text> Warning </Text></Button>
                    <Button danger><Text> Danger </Text></Button>
                    <Button dark><Text> Dark </Text></Button>
                </Content>
            </Container>
        );
    }
}

Navegación


Para la navegación, también comparamos varias posibles soluciones.

  • react-navigation Facebook React Native.
  • wix/react-native-navigation — Wix. , , -, — .
  • react-router — react-router ReactJS . , .
  • airbnb/native-navigation — - Airbnb. , .

Elegimos la primera solución: reaccionar-navegación . Es completamente JavaScript, por lo que no tenemos que preocuparnos por los archivos nativos. Pero, por otro lado, el rendimiento está en cuestión.

Discutimos con colegas de la comunidad React Native, estudiamos los artículos y nos dimos cuenta de que el rendimiento de react-navigation y wix / react-native-navigation es casi el mismo. Por lo tanto, eligieron la primera solución, y la experiencia de uso solo confirmó la exactitud de la elección.

   

Pros de react-navigation:

  • Solución flexible multiplataforma.
  • Interfaz de usuario nativa para cada plataforma y transiciones nativas entre pantallas. No queríamos crear una aplicación que en Android se parezca a iOS.
  • Proporciona todos los tipos básicos de transiciones: las pestañas inferiores, deslizar entre pantallas, ventanas modales SwitchNavigator.

Un ejemplo de estructura de aplicación usando react-navigation. Es más conveniente leer el código de abajo hacia arriba.

const HomeStack = createStackNavigator({
    Home: { screen: HomeScreen },
    Details: {screen: DetailsScreen },
});

const SettingsStack = createStackNavigator({
    Settings: { screen: SettingsScreen },
    Details: { screen: DetailsScreen },
});

const TabNavigator = createBottomTabNavigator({
    Home: { screen: HomeStack },
    Settings: { screen: SettingsStack },
});

export default createAppContainer(TabNavigator);

Algunos createAppContainercontienen createBottomTabNavigatordos pilas. Cada pila tiene su propio conjunto de pantallas.


Tenemos dos botones - Homey Settings. Estas son dos pilas, HomeStacky SettingsStack. Dentro de cada pila hay dos pantallas: HomeScreeny DetailsScreen, SettingsScreeny, DetailsScreenrespectivamente. Ambas pilas usan un componente común DetailsScreen. Escribimos un componente (pantalla) y lo reutilizamos en diferentes pilas.

El código para las tres pantallas parece lo más simple posible.

class HomeScreen extends React.Component {
    static navigationOptions = { title: 'Home' };

    render() {
        return (
            <View style={styles.container}>
                <Text>Home!</Text>
                <Button title="Go to Details" onPress={() => this.props.navigate('Details')}/>
            </View>
        );
    }
}

class SettingsScreen extends React.Component {
    static navigationOptions = { title: 'Settings' };

    render() {
        return (
            <View style={styles.container}>
                <Text>Settings!</Text>
                <Button title="Go to Details" onPress={() => this.props.navigate('Details')}/>
            </View>
        );
    }
}

class DetailsScreen extends React.Component {
    static navigationOptions = { title: 'Details' };

    render() {
        return (
            <View style={styles.container}>
                <Text>Details!</Text>
                <Button title="Go to Details" onPress={() => this.props.navigate('Details')}/>
            </View>
        );
    }
}

Este es el mismo "¡Hola, Mundo!" Con el que comenzamos, nada más.

Añadir Redux . Envolvemos el navegador raíz Provider, lo enrollamos store. A continuación, escritura reducer, actions, actionTypesy el resto - todo lo que es familiar.

const Navigation = createAppContainer(TabNavigator);

//Render the app container component with the provider around it
export default class App extends React.Component {
    render() {
        return (
            <Provider store={store}>
                <Navigation />
            </Provider>
        );
    }
}

Necesita mas componentes


Al elegir el kit de interfaz de usuario final, consideramos muchas soluciones posibles: React Native Elements, UI Kitten, React Native Material UI, React Native Material Kit, React Native UI Library, React Native Paper, Shoutem UI Toolkit, Nachos UI, Teaset. Como resultado, usamos algunos componentes de estas bibliotecas.



React Native también tiene componentes orientados a la plataforma. Un ejemplo sorprendente es DatePickerAndroidy DatePickerIOS. Difieren visualmente y en la interfaz, por lo que debe duplicar el código para resolver un problema para ambas plataformas.

  
A la izquierda está DatePickerAndroid, a la derecha está DatePickerIOS.

Por ejemplo, en nuestra aplicación, puede solicitar un informe o gráfico durante un cierto período de tiempo. El usuario proporciona dos fechas para seleccionar un período. Pero en iOS, la selección de fecha nativa es inconveniente, especialmente en comparación con la versión web de nuestra herramienta.



Tendríamos que hacer dos campos: para las fechas de inicio y finalización. Es más conveniente seleccionar fechas en un campo como en Android, pero tampoco podremos configurar todo: la personalización es mínima .

Encontramos una solución: wix / react-native-calendars .
     
A la derecha hay un ejemplo de un calendario de nuestra aplicación con colores de la compañía.

Tiene calendarios horizontales y verticales, que detallan por fecha, la capacidad de mostrar el estilo de la compañía, elegir un rango de fechas, bloquear la selección de ciertas fechas y admitir Android e iOS. Es conveniente que la solución tenga una interfaz: escribimos el código una vez, sin duplicación y reescritura.

Almacenamiento


En algún momento, necesitábamos almacenar datos para mostrarlos sin conexión o al reanudar el trabajo. Para hacer esto, use la biblioteca de almacenamiento asíncrono (almacenamiento de valor-clave). Funciona con claves y claves múltiples (escribir, leer y eliminar), y proporciona una API de JavaScript para interactuar con la parte nativa.

Los datos del IOS se almacenan en forma serializada. En Android, por ejemplo, en SQLite. Como desarrolladores, no debemos preocuparnos por esto: hay una API, almacenamos datos, todo está bien.

Animaciones


React Native no utiliza tecnologías WebView basadas en HTML, por lo que no tenemos animaciones. Aquí el componente animado nos ayuda . Es compatible con algunas envolturas elementos básicos: View, Image, Text, ScrollView. Va en un hilo separado y no ralentiza la aplicación, pero hay un signo negativo: el tipo de código "inhumano".

A continuación se muestra un ejemplo de la pantalla de nuestra aplicación con una lista de proyectos de usuarios.


Arriba Headercon el nombre "Proyectos", que es SearchBarpara filtrar proyectos. Parece que SearchBarestá debajo Header, pero en realidad está en la secuencia general de bloques que van debajo con una lista de proyectos. Gracias al componente animado, se implementa tal animación que SearchBar"desaparece".

Una versión abreviada de la implementación.

export default class ProjectsScreen extends Component {

    state = {
        scrollY: new Animated.Value(
            Platform.OS === 'ios' ? -HEADER_MAX_HEIGHT : 0,
        ),
    };

    render() {
        const scrollY = Animated.add(
            this.state.scrollY,
            Platform.OS === 'ios' & HEADER_MAX_HEIGHT : 0,
        );
        const headerTranslate = scrollY.interpolate({
            inputRange: [0, HEADER_SCROLL_DISTANCE],
            outputRange: [0, -HEADER_SCROLL_DISTANCE],
            extrapolate: 'clamp',
        });

        return (
            <View>
                <Animated.View style={{ translform: [{ translatY: headerTranslate }] }}>
                    <SearchBar/>
                </Animated.View>
                <Animated.ScrollView
                    onScroll={Animated.event(
                        [{ nativeEvent: { contentOffset: { y: this.state.scrollY } } }],
                        { useNativeDriver: true },
                    )} contentInset={{
                        top: HEADER_MAX_HEIGHT,
                    }}
                    contentOffset={{
                        y: -HEADER_MAX_HEIGHT,
                    }}
                >
                    {this._renderScrollViewContent()}
                </Animated.ScrollView>
            </View>
        );
    }
}    

Parece fácil, pero hay que "muletarse": mover todo el contenido hacia arriba o hacia abajo en iOS. En Android, esto no es necesario. También hay interpolación y diferentes métodos del módulo animado.

El problema de "parpadeo" de la pantalla al principio


Escribimos la aplicación y decidimos agregar el ícono de la aplicación y la Pantalla de inicio (o Pantalla de inicio), la pantalla de la aplicación que aparece en el primer inicio si se descarga de la memoria. Tenemos una pantalla en naranja y con el logotipo de SEMrush en el centro.



En la arquitectura React Native, la parte nativa interactúa con algunos paquetes de puentes de JavaScript. Encontramos un problema que al momento del lanzamiento, la parte nativa está funcionando, y el paquete de secuencias de comandos aún no se ha cargado. Entre la pantalla de bienvenida naranja y la aparición de la lista de proyectos, un vacío blanco (fracciones de milisegundos) brilló en la pantalla.

El problema de parpadeo se resolvió utilizando la biblioteca react-native-splash-screen. Proporciona una API de JavaScript para mostrar u ocultar mediante programación la pantalla de inicio de la aplicación. A través de esta API, eliminamos la pantalla de bienvenida nativa en el componente con la lista de proyectos en el método componentDidMount(). Pusieron una rueda giratoria entre las dos pantallas como un bono para que se vean más bonitas.

Pérdida de conexión


Queríamos desarrollar una interfaz amigable y hermosa, cuidar de UX y UI. Pero cuando el usuario tomó el metro, perdió contacto y actualizó la lista de proyectos, la aplicación solo mostró una pantalla en blanco. Es mejor que el usuario vea la información que ya se ha cargado y un mensaje sobre un problema con la conexión a Internet.

La biblioteca de Netinfo ayudó con el trabajo fuera de línea . Ahora está en un paquete separado, ya que Facebook descarga React Native para hacerlo más ligero.



Netinfo le permite:

  • Suscríbase a eventos y, cuando cambie la conexión a Internet, muestre mensajes al usuario;
  • verificar la calidad de la conexión;
  • Verifique el tipo de conexión (LTE, WiFi, 3G) para aplicaciones complejas;
  • Use una solicitud para verificar su conexión a Internet.

Depuración de aplicaciones


Para no obtener errores después de agregar nuevas dependencias, especialmente aquellas que usan código nativo, necesita un depurador. En React Native lo es: se muestra en la imagen del simulador de iPhone.


Para iOS, utilizamos un emulador de Xcode, en el que puede elegir la versión del sistema operativo y el dispositivo. Simulador para Android - Android Studio.

El menú de diálogo del emulador tiene los modos Debug JS Remote y Live Reload. Le permite ver las propiedades de los componentes, por ejemplo, estilos similares a CSS y ver anidamiento.

En el desarrollo nativo, debe escribir código, enviarlo al ensamblado, ejecutarlo, es mucho tiempo. En el depurador, todo es igual que en ReactJS en la web: activamos Live Reloading y vemos la reconstrucción en tiempo real en el simulador sin reiniciar.

Además, también usamos React Developer Tools para inspeccionar componentes, ver jerarquías y cambiar sus propiedades y estilos.



Pero incluso esto no es suficiente, hay una mejor solución: React Native Debugger .



Tiene un React Inspector, Redux DevTools, interacción a través de Internet, registro de la consola, creación de perfiles desde la memoria y la aplicación, visualización de todas las acciones. A diferencia de las dos primeras dos soluciones, puede cambiar el estilo en el propio React Native Debugger.

Conectar módulos nativos


Hasta ahora, todo era fácil y transparente: tomamos algún tipo de solución, nos conectamos, funciona. Pero hay un matiz, una consecuencia de la arquitectura de React Native. Además de la parte de JavaScript, todas las bibliotecas usan la nativa, que debe estar asociada con React Native. Para hacer esto, hay un comando de enlace react-native que realiza automáticamente todos los cambios necesarios y enlaces al código nativo en el proyecto.

Pero la conexión automática no siempre funciona, por lo que a veces debe modificar manualmente los archivos nativos. Si la instalación manual no se describe en las instrucciones de la biblioteca, piense si vale la pena usarla y, si es posible, evite la vinculación manual, un par de veces pisamos un rastrillo de este tipo.

Resultado


Inicialmente, queríamos escribir una aplicación para iOS, pero lo hicimos para Android, y se ven de manera diferente, como todos deberían en su plataforma. Las transiciones entre pantallas se ven geniales, y tenemos alrededor de 30 pantallas (transiciones y estados). Logramos evitar la implementación de módulos nativos personalizados y usar soluciones de terceros.

Tiempo: el desarrollo de la aplicación tomó tres meses de dos personas. Desde abril de 2019, han lanzado varias actualizaciones con nuevas funcionalidades, la aplicación se está desarrollando y los equipos de otros proyectos desean implementar sus herramientas en ella.

El rendimiento de React Native es completamente satisfactorio para nosotros, porque no necesitábamos una lógica compleja y no tenemos una gran carga.

Retroalimentación:Es bueno recibir comentarios de los usuarios sobre la aplicación.

React Native es adecuado para desarrollar rápidamente aplicaciones móviles y probar hipótesis , incluso si no eres un desarrollador móvil. Está en constante evolución, aparecen nuevas funciones y bibliotecas. Por ejemplo, hace un año no había soporte para arquitecturas de 32 y 64 bits, ahora no hay problemas con esto.

, , -, . , , « », . ++ 2020 — .

, , , , , — - , 5900.

All Articles