React Native pour les plus petits. Expérience de développement mobile

Une fois, au sein d'une équipe produit, ils ont voulu développer une application mobile afin de tester l'hypothèse de la demande du produit et sa commodité pour les utilisateurs. Et le fait que l'équipe n'avait pas de développeurs mobiles n'a pas fait de mal. Deux développeurs front-end ont pris React Native et ont écrit une application en trois mois. Le test d'hypothèse a réussi, l'application continue d'évoluer et suscite l'intérêt des autres équipes de l'entreprise.


Image de la description de l'outil: www.semrush.com/news/position-tracking-on-the-go .

Ceci est une brève description de l'histoire de l'équipe d' Artyom Lashevsky, qui depuis trois mois du développeur front-end est devenu mobile. Pour plus de détails sur la façon dont cela s'est produit, lisez le décodage du rapport d'Artyom sur FrontendConf 2019: qu'est-ce que React Native, pourquoi, une instruction étape par étape pour créer une application et choisir les bonnes bibliothèques et composants.

Artyom Lashevsky est un développeur front-end de premier plan chez SEMrush et un spécialiste dans le domaine de la sécurité de l'information des systèmes automatisés.


Pourquoi avons-nous besoin d'une application


SEMrush est une société informatique internationale qui développe une grande plate-forme en ligne pour les spécialistes du marketing. Inclus dans le TOP 3 des plateformes de marketing et de référencement. L'entreprise compte 5 millions d'utilisateurs, 7 bureaux sur deux continents, 800 employés et 30 équipes de développement.

Chaque équipe de développement gère son propre outil au sein de la plateforme. Je travaille dans l'une de ces équipes de 8 personnes: deux sur le frontend, trois sur le backend, QA, DevOps engineer et PO. L'outil sur lequel notre équipe travaille permet aux utilisateurs de vérifier la position des pages de leur site pour des recherches Google spécifiques. L'outil permet de vérifier la position sur les mots clés non seulement de votre site, mais aussi de vos concurrents et d'analyser et de comparer.

La plateforme fonctionne dans un navigateur. Le lancement d'une application mobile vous permettra d'obteniravantage concurrentiel , car l'application permet de conserver les anciens utilisateurs plus longtemps et augmente la conversion du gratuit au payant.

Pour les utilisateurs, l'application améliore la convivialité de la plateforme. Par le biais du téléphone, le client peut utiliser SEMrush là où un ordinateur était auparavant nécessaire. Allez dans l'application, voyez si son site est tombé dans le SERP de Google ou a augmenté - les mesures clés sont toujours à portée de main . S'ils ont plongé, alors dans la version Web, vous pouvez voir les détails et comprendre comment résoudre la situation.

Notre équipe a vu le potentiel de l'application mobile et a décidé d'essayer de la développer, mais il n'y avait aucun développeur mobile parmi nous. Nous avons commencé à étudier nous-mêmes les outils et les technologies de développement d'applications.

Applications natives- la première chose que vous avez remarquée. Après avoir étudié, nous avons réalisé que pour nous, c'est long, cher et peu pratique: vous devez étudier deux piles technologiques, dupliquer les fonctionnalités et les tester deux fois.



Nous sommes passés du développement natif à l'étude de WebView (Apache Cordova). Un collègue frontend avait de l'expérience dans le développement sur Cordova, donc dans le premier sprint pour étudier les technologies et les solutions, l'un des prototypes a été développé sur Cordova.



Mais nous voulions quelque chose de plus moderne - une «jeunesse à la mode», alors nous sommes passés à des solutions multiplateformes.

Développement multiplateforme. Plusieurs options ont été envisagées: Flutter, Xamarin, Native Script et React Native. Pour nous, chacune des options avait son propre inconvénient, car nous voulions commencer le plus tôt possible:

  • Flutter nécessite une connaissance de Dart (une alternative à JavaScript). Je n'ai pas eu le temps d'étudier les technologies connexes - je voulais rapidement «voler» pour tester l'hypothèse.
  • Xamarin nécessite une connaissance de C #. Nous avons des développeurs backend, mais iOS et Android nécessitent des interfaces différentes. Quoi qu'il en soit, vous devez dupliquer le code et les implémentations.
  • Native Script est conçu pour être fourni avec Angular. Notre projet utilise ReactJS et Redux, donc non.
  • React Native semblait cool, et ils l'ont choisi. De plus, nous voulions juste l'essayer, malgré les inconvénients et les avantages des autres solutions.

Lors de la sélection, nous n'avons pas rencontré Ionic. Peut-être qu'ils l'auraient considéré aussi, mais ils auraient quand même choisi React Native.

React native


Il s'agit d'un framework Facebook pour développer des applications natives multiplateformes. Construit sur la base de ReactJS, sous le capot n'utilise pas WebView, il n'y a donc pas d'API DOM. React Native n'a pas de code HTML et CSS, mais il existe des composants de plate-forme dans les fichiers JSX et les fichiers de type CSS.

React Native contient une API JavaScript sur les composants natifs. Cela signifie que les composants natifs ont une sorte de «liaison» aux composants JavaScript sur ReactJS. La relation entre les bundles natifs et JavaScript se fait via le pont à l'aide de l'API JavaScript. Superficiellement, ce n'est que de l'architecture.



React Native Pros:

  • Multiplateforme . Nous voulions d'abord écrire l'application sous iOS, mais le lancement supplémentaire sous Android est un énorme plus.
  • . , . React Native , 80% .
  • . Telegram React Native 3000 . , , , .
  • . — , . , ReactJS React Native.


Avec React Native, il existe deux façons de développer une application: utilisez l'Expo ou React Native CLI.

Expo Il s'agit d'une couche d'abstraction - un ensemble d'outils, de bibliothèques et de services pour un lancement rapide. Il s'agit d'une API qui, prête à l'emploi, donne accès aux capacités de l'appareil: à la caméra, à la géolocalisation, aux messages push.

Expo propose des outils de débogage et de test des applications. L'algorithme est simple: nous installons l'application Expo Client sur le téléphone, connectons le téléphone avec l'ordinateur au même réseau local, allons sur Expo sur le téléphone, ouvrons l'application en cours de développement. Toutes les modifications du code sont affichées instantanément. Cela permet de tester et de partager sur l'équipe.

Le décollage à l'Expo est rapide et rapide. Avec Expo, Xcode et Android Studio ne sont pas nécessaires. Nous écrivons dans notre environnement de développement, collectons l'application à l'aide du service Expo, signons et mettons à jour à la volée.

Mais il y a aussi des inconvénients.

  • Vous ne pouvez pas ajouter de modules natifs personnalisés.
  • Expo est une couche d'abstraction sur React Native. Vous ne pouvez pas effectuer de mise à niveau vers une nouvelle version du framework avant la mise à jour d'Expo.

React Native CLI . Son avantage est la possibilité de personnalisation , en ajoutant des modules natifs.

Mais pour signer et construire l'application (et la publier), vous avez besoin de Xcode ou d'Android Studio. Pour tester l'application, vous devez la créer et la télécharger sur votre téléphone, par exemple en utilisant TestFlight pour iOS ou une installation directe du PC au téléphone. Schéma standard, mais peu pratique et long.



En général, le choix est simple: nous voulons développer un prototype - nous sélectionnons Expo, nous voulons une application avec le prospect - React Native CLI.
Nous avons choisi la CLI React Native. Dans SEMrush, nous voudrons probablement écrire nos parties natives personnalisées, donc le point avec les modules natifs et les bibliothèques tierces avec les modules est devenu un facteur décisif. Avec React Native CLI, le démarrage est plus lent en raison de beaucoup de formation, mais à l'avenir, il y aura plus d'opportunités.

De nombreux collègues, utilisant React Native, ont dû faire face à un besoin de personnalisation, et ils ont dû effectuer des commandes d'éjection spéciales avec Expo sur la React Native CLI. La structure de répertoires des fichiers d'une application simple est transférée de l'ensemble habituel de fichiers JavaScript vers des dossiers pour Android, iOS et JavaScript. Mais avec une application complexe, il y aura des difficultés.

Nous rédigeons une candidature


En aucun d' habitude CSS React autochtones, des éléments DOM et Web: div, span, li, button. Mais il existe deux types de composants de plate-forme dans React Native.

  • Cross Platform : View, Text, Imageet d' autres.
  • Spécifique à chaque plateforme , par exemple, DatePickerIOSou DatePickerAndroid.

Le passage de React réagisse natif est simple: il bloque divelle View, il bloque spanelle Textet le liste liou ul- FlatList. Pour chaque élément il y a une correspondance.

Remarque. Pour transférer des composants Web prêts à l'emploi vers des sites non Web, vous pouvez écrire un transporteur, mais il est généralement plus facile de le réécrire.

Vous pouvez commencer à écrire React Native assez rapidement.

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>
        );
    }
}

Il y a une classe App(conteneur d'application). Il contient une méthode renderdans laquelle la partie visuelle est dessinée. Il contient le conteneur à l' Viewintérieur qui va Imageet Text.

Chacun des éléments, par exemple, Viewcontient un attribut styledont la valeur est spécifiée via l'objet styles.

Un objet stylesest créé à l'aide du module de StyleSheetla méthode createReact Native. Cet objet est une notation d'objet CSS, un modèle CSS simplifié qui suffit. Flexbox est également utilisé pour la mise en page de l'interface, également simplifiée, mais il suffit de l'aligner horizontalement et verticalement.

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

Terminé - nous avons écrit une application pour iOS. À l'avenir, je préciserai que cela fonctionne également pour Android.


La première application est "Hello, World!".

Multiplateforme


Nous voulions que notre application fonctionne sur Android et iOS. Dans le même temps, nous voulions pouvoir réaliser différentes implémentations en fonction de la plateforme. Il existe deux façons de procéder dans React Native.

La première consiste à utiliser le module Platform . Par exemple, nous créons une application et définissons la hauteur en fonction de la plateforme. Pour iOS, la hauteur est de 200, pour Android, elle est de 100. En utilisant la méthode, nous Platform.OSdéterminons quelle plateforme l'utilisateur utilise.

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

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

Si nous avons 40 de ces attributs, il n'est pas nécessaire de dupliquer le code. Il existe une méthode Platform.selectdu même module pour cela. Il renvoie un ensemble de propriétés par la clé de plate-forme: sous retours iOS backgroundColor = 'red', sous Android - backgroundColor = 'blue'. En conséquence, nous pouvons renvoyer notre ensemble d'attributs pour iOS (il peut y en avoir au moins 20, au moins 40 d'entre eux), pour Android - un ensemble complètement différent.

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

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

La méthode Platform.selectvous permet d'écrire des composants multiplateformes.

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

<Component />;

Certains composants utilisent une méthode Platform.selectqui, selon la clé de plate-forme, renvoie son implémentation. Tout va bien, nous prenons et écrivons une bibliothèque multi-plateforme.

S'il existe des solutions ou des restrictions personnalisées sur le système d'exploitation, nous pouvons déterminer la version du système d'exploitation.

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');
}

La deuxième méthode - utilisez l' extension de fichier spécifique à la plate-forme ( *.android.jset *.ios.js). Cela vous permet de développer des implémentations multiplateformes pour un code plus volumineux et une logique complexe. Ensuite, nous divisons tout le code en deux fichiers, par exemple, BigButton.ios.jset BigButton.android.js. Dans le code où nous voulons l'utiliser, nous utilisons l'interface et l'importons BigButton. React Native se chargera des importations nécessaires en fonction de la plateforme.

Composants


Nous pouvons implémenter des solutions multiplateformes, mais la vitesse est importante. Par conséquent, nous nous sommes tournés vers des solutions prêtes à l'emploi - des bibliothèques de composants. Recherche, a mis en évidence de nombreuses excellentes solutions (kit d'interface utilisateur) et a choisi NativeBase . Il s'agit d'une immense bibliothèque avec une douzaine de composants, 12 000 étoiles sur GitHub, qui vous permet de résoudre la plupart des problèmes.

   
Exemple d'interface utilisateur pour iOS à gauche, pour Android à droite.

Dans notre projet, nous utilisons partiellement cette bibliothèque, personnalisons des éléments et définissons nos propres styles. Par exemple, nous avons Buttonou des composants Headerque nous importons de la bibliothèque NativeBase.



Nous écrivons le code une fois, tandis que sur chaque plate-forme, il semble différent.

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>
        );
    }
}

La navigation


Pour la navigation, nous avons également comparé plusieurs solutions possibles.

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

Nous avons choisi la première solution - react-navigation . Il est entièrement JavaScript, nous n'avons donc pas à nous soucier des fichiers natifs. Mais d'un autre côté, la performance est en cause.

Nous avons discuté avec des collègues de la communauté React Native, étudié les articles et réalisé que les performances de React-Navigation et de Wix / React-Native-Navigation sont à peu près les mêmes. Par conséquent, ils ont choisi la première solution, et l'expérience d'utilisation n'a fait que confirmer l'exactitude du choix.

   

Avantages de React-Navigation:

  • Solution flexible multiplateforme.
  • Interface utilisateur native pour chaque plateforme et transitions natives entre les écrans. Nous ne voulions pas créer une application qui sur Android ressemble à iOS.
  • Il fournit tous les types de transitions de base: les onglets inférieurs, glisser entre les écrans, les fenêtres modales SwitchNavigator.

Un exemple de structure d'application utilisant react-navigation. Le code est plus pratique à lire de bas en haut.

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);

Certains createAppContainercontiennent createBottomTabNavigatordeux piles. Chaque pile possède son propre ensemble d'écrans.


Nous avons deux boutons - Homeet Settings. Ce sont deux piles - HomeStacket SettingsStack. A l' intérieur de chaque pile sont deux écrans: HomeScreenet DetailsScreen, SettingsScreenet, DetailsScreenrespectivement. Les deux piles utilisent un composant commun DetailsScreen. Nous écrivons un composant (écran) et le réutilisons sur différentes piles.

Le code des trois écrans semble aussi simple que possible.

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>
        );
    }
}

C'est le même «Bonjour tout le monde!» Avec lequel nous avons commencé - rien de plus.

Ajoutez Redux . Nous enveloppons le navigateur racine Provider, le roulons store. Ensuite, écrire reducer, actions, actionTypeset le reste - tout est familier.

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>
        );
    }
}

Besoin de plus de composants


En choisissant le kit d'interface utilisateur final, nous avons envisagé de nombreuses solutions possibles: 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. Par conséquent, nous utilisons certains composants de ces bibliothèques.



React Native possède également des composants orientés plateforme. Un exemple frappant est DatePickerAndroidet DatePickerIOS. Ils diffèrent visuellement et dans l'interface, vous devez donc dupliquer le code pour résoudre un problème pour les deux plates-formes.

  
À gauche se trouve DatePickerAndroid, à droite se trouve DatePickerIOS.

Par exemple, dans notre application, vous pouvez demander un rapport ou un graphique pour une certaine période de temps. L'utilisateur fournit deux dates pour sélectionner une période. Mais sur iOS, la sélection de date native n'est pas pratique, surtout par rapport à la version Web de notre outil.



Il faudrait faire deux champs: pour les dates de début et de fin. Il est plus pratique de sélectionner des dates dans un champ que sur Android, mais nous ne pourrons pas tout configurer également - la personnalisation est minime .

Nous avons trouvé une solution - wix / react-native-calendars .
     
À droite, un exemple de calendrier de notre application avec les couleurs de l'entreprise.

Il a des calendriers horizontaux et verticaux, détaillant par date, la possibilité d'afficher le style de l'entreprise, de choisir une plage de dates, de bloquer la sélection de certaines dates et de prendre en charge Android et iOS. Il est pratique que la solution ait une interface - nous écrivons le code une fois, sans duplication ni réécriture.

Espace de rangement


À un moment donné, nous avons dû stocker des données afin de les afficher hors ligne ou lors de la reprise du travail. Pour ce faire, utilisez la bibliothèque de stockage Async (stockage de valeurs-clés). Il fonctionne avec des clés et des touches multiples (écriture, lecture et suppression) et fournit une API JavaScript pour interagir avec la partie native.

Les données IOS sont stockées sous forme sérialisée. Sous Android - par exemple, dans SQLite. En tant que développeurs, nous n'avons pas à nous en préoccuper: il y a une API, nous stockons des données, tout va bien.

Des animations


React Native n'utilise pas les technologies WebView HTML, nous n'avons donc pas d'animations. Ici, le composant animé nous aide . Il prend en charge certains éléments de base wrappers: View, Image, Text, ScrollView. Il va dans un thread séparé et ne ralentit pas l'application, mais il y a un inconvénient - le type de code "inhumain".

Ci-dessous un exemple de l'écran de notre application avec une liste de projets utilisateurs.


Ci-dessus Headeravec le nom "Projets", qui est SearchBarde filtrer les projets. On dirait que c'est en SearchBardessous Header, mais en réalité c'est dans le flux général de blocs qui vont ci-dessous avec une liste de projets. Grâce au composant Animé, une telle animation est implémentée qu'elle SearchBar«disparaît».

Une version abrégée de l'implémentation.

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>
        );
    }
}    

Cela semble facile, mais vous devez «béquiller»: déplacer tout le contenu vers le haut ou vers le bas sur iOS. Sur Android, ce n'est pas nécessaire. Il existe également une interpolation et différentes méthodes du module Animé.

Le problème du "scintillement" de l'écran au premier démarrage


Nous avons écrit l'application et décidé d'ajouter l'icône de l'application et l'écran de démarrage (ou l'écran de lancement) - l'écran de l'application qui apparaît lorsque vous le démarrez pour la première fois s'il est déchargé de la mémoire. Nous avons un écran en orange et avec le logo SEMrush au centre.



Dans l'architecture React Native, la partie native interagit avec certains faisceaux de ponts JavaScript. Nous avons rencontré un problème au moment du lancement, la partie native fonctionnait et le paquet de scripts n'était pas encore chargé. Entre le Splash Screen orange et l'apparition de la liste des projets, un vide blanc (fractions de milliseconde) brillait à l'écran.

Le problème de scintillement a été résolu à l'aide de la bibliothèque react-native-splash-screen. Il fournit une API JavaScript pour afficher ou masquer par programmation l'écran de lancement de l'application. Grâce à cette API, nous avons supprimé le Splash Screen natif du composant avec la liste des projets de la méthode componentDidMount(). Ils ont mis un spinner entre les deux écrans en bonus pour les rendre plus jolis.

Perte de connexion


Nous voulions développer une interface conviviale et belle, prendre en charge UX et UI. Mais lorsque l'utilisateur est monté dans le métro, a perdu le contact et a mis à jour la liste des projets, l'application n'a montré qu'un écran vierge. Il est préférable pour l'utilisateur de voir les informations déjà chargées et un message sur un problème de connexion Internet.

La bibliothèque Netinfo a aidé au travail hors ligne . Il est maintenant dans un package séparé, car Facebook décharge React Native pour le rendre plus léger.



Netinfo vous permet de:

  • Abonnez-vous aux événements et, lorsque vous modifiez la connexion Internet, affichez des messages à l'utilisateur;
  • vérifier la qualité de la connexion;
  • Vérifiez le type de connexion (LTE, WiFi, 3G) pour les applications complexes;
  • Utilisez une demande pour vérifier votre connexion Internet.

Débogage d'application


Afin de ne pas obtenir d'erreurs après l'ajout de nouvelles dépendances, en particulier celles qui utilisent du code natif, vous avez besoin d'un débogueur. Dans React Native, il est - montré dans l'image du simulateur iPhone.


Pour iOS, nous avons utilisé un émulateur de Xcode, dans lequel vous pouvez choisir la version du système d'exploitation et de l'appareil. Simulateur pour Android - Android Studio.

Le menu de la boîte de dialogue de l'émulateur comprend les modes Debug JS à distance et Live Reload. Vous permet de voir les propriétés des composants, par exemple, les styles de type CSS et l'imbrication des vues.

Dans le développement natif, vous devez écrire du code, l'envoyer à l'assembly, exécuter - c'est long. Dans le débogueur, tout est le même que dans ReactJS sur le Web: nous activons Live Reloading et voyons la reconstruction en temps réel dans le simulateur sans redémarrer.

De plus, nous utilisons également React Developer Tools pour inspecter les composants, afficher les hiérarchies et modifier leurs propriétés et styles.



Mais même cela ne suffit pas, il existe une meilleure solution - React Native Debugger .



Il dispose d'un inspecteur React, de Redux DevTools, d'une interaction Internet, de la journalisation de la console, du profilage de la mémoire et des applications, affichant toutes les actions. Contrairement aux deux deux premières solutions, vous pouvez modifier le style dans le débogueur natif React lui-même.

Connexion de modules natifs


Jusqu'à présent, tout était simple et transparent: on prend une sorte de solution, on se connecte, ça fonctionne. Mais il y a une nuance - une conséquence de l'architecture de React Native. En plus de la partie JavaScript, toutes les bibliothèques utilisent la native, qui doit être associée à React Native. Pour ce faire, il existe une commande de lien natif réactif qui effectue automatiquement toutes les modifications et les liens nécessaires vers le code natif dans le projet.

Mais la connexion automatique ne fonctionne pas toujours, vous devez donc parfois modifier manuellement les fichiers natifs. Si l'installation manuelle n'est pas décrite dans les instructions de la bibliothèque, alors réfléchissez à la pertinence de l'utiliser et évitez si possible la liaison manuelle - à plusieurs reprises, nous avons marché sur un tel râteau.

Résultat


Au départ, nous voulions écrire une application pour iOS, mais nous l'avons fait pour Android, et ils regardent différemment, comme tout le monde devrait sur leur plate-forme. Les transitions entre les écrans ont l'air cool, et nous avons environ 30 écrans (transitions et états). Nous avons réussi à éviter l'implémentation de modules natifs personnalisés et à utiliser des solutions tierces.

Calendrier: le développement de l'application a pris trois mois pour deux personnes. Depuis avril 2019, ils ont publié plusieurs mises à jour avec de nouvelles fonctionnalités, l'application se développe et des équipes d'autres projets souhaitent y implémenter leurs outils.

Les performances de React Native nous sont totalement satisfaisantes, car nous n'avions pas besoin de logique complexe et nous n'avons pas une charge importante.

Retour d'information:C'est agréable de recevoir les commentaires des utilisateurs sur l'application.

React Native convient pour développer rapidement des applications mobiles et tester des hypothèses , même si vous n'êtes pas un développeur mobile. Il évolue constamment, de nouvelles fonctions et bibliothèques apparaissent. Par exemple, il y a un an, il n'y avait pas de support pour les architectures 32 et 64 bits - maintenant il n'y a plus de problème avec cela.

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

, , , , , — - , 5900.

All Articles