Reagiere Native für die Kleinen. Mobile Entwicklungserfahrung

Einmal wollten sie in einem Produktteam eine mobile Anwendung entwickeln, um die Hypothese der Nachfrage nach dem Produkt und seiner Benutzerfreundlichkeit zu testen. Und die Tatsache, dass das Team keine mobilen Entwickler hatte, tat nicht weh. Zwei Front-End-Entwickler nahmen React Native und schrieben in drei Monaten eine Anwendung. Das Testen von Hypothesen war erfolgreich, die Anwendung entwickelt sich weiter und weckt das Interesse anderer Teams im Unternehmen.


Bild aus der Werkzeugbeschreibung: www.semrush.com/news/position-tracking-on-the-go .

Dies ist eine kurze Beschreibung der Geschichte des Teams von Artyom Lashevsky, die seit drei Monaten vom Front-End-Entwickler mobil geworden ist. Weitere Informationen dazu finden Sie in der Dekodierung des Artyom-Berichts auf FrontendConf 2019: Was ist React Native, warum ist es eine schrittweise Anleitung zum Erstellen einer Anwendung und zum Auswählen der richtigen Bibliotheken und Komponenten.

Artyom Lashevsky ist ein führender Front-End-Entwickler bei SEMrush und Spezialist auf dem Gebiet der Informationssicherheit automatisierter Systeme.


Warum brauchen wir eine Bewerbung?


SEMrush ist ein internationales IT-Unternehmen, das eine große Online-Plattform für Vermarkter entwickelt. In den TOP 3-Plattformen für Marketing und SEO enthalten. Das Unternehmen hat 5 Millionen Benutzer, 7 Büros auf zwei Kontinenten, 800 Mitarbeiter und 30 Entwicklungsteams.

Jedes Entwicklungsteam beschäftigt sich mit seinem eigenen Tool innerhalb der Plattform. Ich arbeite in einem dieser Teams von 8 Personen: zwei im Frontend, drei im Backend, QA, DevOps-Ingenieur und PO. Mit dem Tool, an dem unser Team arbeitet, können Nutzer die Position der Seiten ihrer Website für bestimmte Google-Suchanfragen überprüfen. Das Tool hilft dabei, die Position der Keywords nicht nur Ihrer Website, sondern auch der Konkurrenz zu überprüfen und zu analysieren und zu vergleichen.

Die Plattform arbeitet in einem Browser. Durch das Starten einer mobilen Anwendung erhalten SieWettbewerbsvorteil , da die Anwendung dazu beiträgt, alte Benutzer länger zu halten und die Umstellung von kostenlos auf kostenpflichtig zu erhöhen.

Für Benutzer verbessert die Anwendung die Benutzerfreundlichkeit der Plattform. Über das Telefon kann der Client SEMrush dort verwenden, wo zuvor ein Computer benötigt wurde. Gehen Sie in die Anwendung und prüfen Sie, ob seine Website in den SERP von Google gefallen oder gestiegen ist. Wichtige Messdaten sind immer verfügbar . Wenn sie eingetaucht sind, können Sie in der Webversion die Details sehen und verstehen, wie Sie die Situation beheben können.

Unser Team erkannte das Potenzial der mobilen Anwendung und beschloss, sie zu entwickeln, aber es gab keine mobilen Entwickler unter uns. Wir haben begonnen, Tools und Technologien für die Anwendungsentwicklung selbst zu studieren.

Native Apps- Das erste, was dir aufgefallen ist. Nach dem Studium haben wir festgestellt, dass es für uns lang, teuer und unpraktisch ist: Sie müssen zwei Technologie-Stacks studieren, die Funktionalität duplizieren und zweimal testen.



Wir sind von der nativen Entwicklung zum Studium von WebView (Apache Cordova) übergegangen . Ein Frontend-Kollege hatte Erfahrung in der Entwicklung von Cordova. Im ersten Sprint zum Studium von Technologien und Lösungen wurde einer der Prototypen auf Cordova entwickelt.



Aber wir wollten etwas Moderneres - „modische Jugend“, also gingen wir zu plattformübergreifenden Lösungen über.

Plattformübergreifende Entwicklung. Es wurden verschiedene Optionen in Betracht gezogen: Flutter, Xamarin, Native Script und React Native. Für uns hatte jede Option ihr eigenes Minus, weil wir so schnell wie möglich beginnen wollten:

  • Flattern erfordert Kenntnisse in Dart (eine Alternative zu JavaScript). Es war keine Zeit, verwandte Technologien zu studieren - ich wollte schnell „hochfliegen“, um die Hypothese zu testen.
  • Xamarin erfordert Kenntnisse in C #. Wir haben Backend-Entwickler, aber iOS und Android erfordern unterschiedliche Schnittstellen. Auf jeden Fall müssen Sie den Code und die Implementierungen duplizieren.
  • Native Script kann mit Angular gebündelt werden. Unser Projekt verwendet ReactJS und Redux, also nein.
  • React Native schien cool zu sein und sie wählten ihn. Außerdem wollten wir es nur versuchen, trotz der Nachteile und Vorteile anderer Lösungen.

Bei der Auswahl sind wir nicht auf Ionic gestoßen. Vielleicht hätten sie es auch in Betracht gezogen, aber sie hätten sich trotzdem für React Native entschieden.

Native reagieren


Dies ist ein Facebook-Framework für die Entwicklung plattformübergreifender nativer Anwendungen. Auf der Basis von ReactJS erstellt, verwendet unter der Haube kein WebView, daher gibt es keine DOM-API. React Native verfügt nicht über HTML und CSS, es gibt jedoch einige Plattformkomponenten in JSX- und CSS-ähnlichen Polydateien.

React Native enthält einige JavaScript-APIs über native Komponenten. Dies bedeutet, dass native Komponenten eine Art „Bindung“ an JavaScript-Komponenten in ReactJS aufweisen. Die Beziehung zwischen dem nativen und dem JavaScript-Bundle wird über die Bridge mithilfe der JavaScript-API hergestellt. Oberflächlich gesehen ist das alles Architektur.



Native Pros reagieren:

  • Plattformübergreifend . Wir wollten die Anwendung zunächst unter iOS schreiben, aber der zusätzliche Start unter Android ist ein großes Plus.
  • . , . React Native , 80% .
  • . Telegram React Native 3000 . , , , .
  • . — , . , ReactJS React Native.


Mit React Native gibt es zwei Möglichkeiten, eine Anwendung zu entwickeln: Verwenden Sie die Expo oder React Native CLI.

Messe Dies ist eine Abstraktionsschicht - eine Reihe von Tools, Bibliotheken und Diensten für den schnellen Start. Dies ist eine API, die sofort Zugriff auf die Funktionen des Geräts bietet : auf die Kamera, die Geolokalisierung und Push-Nachrichten.

Expo verfügt über Tools zum Debuggen und Testen von Anwendungen. Der Algorithmus ist einfach: Installieren Sie die Expo Client-Anwendung auf dem Telefon, verbinden Sie das Telefon mit dem Computer mit demselben lokalen Netzwerk, gehen Sie auf dem Telefon zur Expo und öffnen Sie die in der Entwicklung befindliche Anwendung. Alle Änderungen im Code werden sofort angezeigt. Dies hilft beim Testen und Teilen im Team.

Der Start auf der Expo ist schnell und schnell. Mit Expo werden Xcode und Android Studio nicht benötigt. Wir schreiben in unsere Entwicklungsumgebung, sammeln die Anwendung über den Expo-Service, signieren und aktualisieren sie im laufenden Betrieb.

Es gibt aber auch Nachteile.

  • Sie können keine benutzerdefinierten nativen Module hinzufügen.
  • Expo ist eine Abstraktionsschicht über React Native. Sie können erst dann auf eine neue Version des Frameworks aktualisieren, wenn Expo aktualisiert wurde.

Native CLI reagieren . Der Vorteil ist die Möglichkeit der Anpassung durch Hinzufügen nativer Module.

Zum Signieren und Erstellen der Anwendung (und zum Veröffentlichen) benötigen Sie jedoch Xcode oder Android Studio. Um die Anwendung zu testen, müssen Sie sie erstellen und auf Ihr Telefon herunterladen, z. B. mit TestFlight für iOS oder direkt von PC auf Telefon installieren. Standardschema, aber unpraktisch und lang.



Im Allgemeinen ist die Auswahl einfach: Wir möchten einen Prototyp entwickeln - wir wählen Expo, wir möchten eine Anwendung mit der Perspektive - React Native CLI.
Wir haben uns für die React Native CLI entschieden. In SEMrush werden wir wahrscheinlich unsere benutzerdefinierten nativen Teile schreiben wollen, daher wurde der Punkt mit nativen Modulen und Bibliotheken von Drittanbietern mit Modulen zu einem entscheidenden Faktor. Mit der React Native CLI ist der Start aufgrund vieler Schulungen langsamer, aber in Zukunft wird es mehr Möglichkeiten geben.

Viele Kollegen, die React Native verwendeten, mussten sich anpassen und mussten mit Expo auf der React Native-CLI spezielle Auswurfbefehle ausführen. Die Verzeichnisstruktur der Dateien einer einfachen Anwendung wird von den üblichen JavaScript-Dateien in Ordner für Android, iOS und JavaScript übertragen. Bei einer komplexen Anwendung treten jedoch Schwierigkeiten auf.

Wir schreiben eine Bewerbung


In keinem üblichen Reagieren india CSS, DOM und Web - Elemente: div, span, li, button. In React Native gibt es jedoch zwei Arten von Plattformkomponenten.

  • Cross Platform : View, Text, Imageund andere.
  • Zum Beispiel spezifisch für jede PlattformDatePickerIOS oder DatePickerAndroid.

Der Übergang von React zu React Native ist einfach: Er blockiert divihn View, blockiert spanihn Textund listet ihn auf lioder ul- FlatList. Für jedes Element gibt es eine Entsprechung.

Hinweis. Um vorgefertigte Webkomponenten auf Nicht-Webkomponenten zu übertragen, können Sie einen Transporter schreiben. In der Regel ist es jedoch einfacher, ihn erneut zu schreiben.

Sie können sehr schnell mit dem Schreiben von React Native beginnen.

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

Es gibt eine Klasse App(Anwendungscontainer). Es enthält eine Methode, rendermit der der visuelle Teil gezeichnet wird. Es enthält den Behälter, Viewin den Imageund geht Text.

Jedes der Elemente Viewenthält beispielsweise ein Attribut, styledessen Wert durch das Objekt angegeben wird styles.

Ein Objekt styleswird mit dem Modul StyleSheetder createReact Native- Methode erstellt . Dieses Objekt ist eine CSS-Objektnotation, ein vereinfachtes CSS-Modell, das ausreicht. Flexbox wird auch für das Layout der Benutzeroberfläche verwendet, ebenfalls vereinfacht, aber es reicht aus, sie horizontal und vertikal auszurichten.

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

Fertig - wir haben eine Anwendung für iOS geschrieben. Mit Blick auf die Zukunft werde ich klarstellen, dass es auch für Android funktioniert.


Die erste Anwendung ist "Hallo Welt!".

Plattformübergreifend


Wir wollten, dass unsere Anwendung sowohl auf Android als auch auf iOS funktioniert. Gleichzeitig wollten wir je nach Plattform verschiedene Implementierungen durchführen können. In React Native gibt es zwei Möglichkeiten, dies zu tun.

Der erste Weg ist die Verwendung des Plattformmoduls . Zum Beispiel erstellen wir eine Anwendung und legen die Höhe abhängig von der Plattform fest. Für iOS beträgt die Höhe 200, für Android 100. Mit der Methode Platform.OSbestimmen wir , welche Plattform der Benutzer verwendet.

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

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

Wenn wir 40 solcher Attribute haben, muss der Code nicht dupliziert werden. Hierfür gibt es eine Methode Platform.selectaus demselben Modul. Es gibt eine Reihe von Eigenschaften über den Plattformschlüssel zurück: Unter iOS backgroundColor = 'red'wird unter Android - zurückgegeben backgroundColor = 'blue'. Infolgedessen können wir unsere Attribute für iOS (es können mindestens 20, mindestens 40 davon sein) für Android zurückgeben - eine völlig andere Gruppe.

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

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

Mit dieser Methode Platform.selectkönnen Sie plattformübergreifende Komponenten schreiben.

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

<Component />;

Einige Komponenten verwenden eine Methode Platform.select, die je nach Plattformschlüssel die Implementierung zurückgibt. Alles ist in Ordnung, wir nehmen und schreiben eine plattformübergreifende Bibliothek.

Wenn es benutzerdefinierte Lösungen oder Einschränkungen für das Betriebssystem gibt, können wir die Betriebssystemversion ermitteln.

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

Die zweite Methode - Verwenden Sie die plattformspezifische Dateierweiterung ( *.android.jsund *.ios.js). Auf diese Weise können Sie plattformübergreifende Implementierungen für umfangreicheren Code und komplexe Logik entwickeln. Dann teilen wir zum Beispiel den gesamten Code in zwei Dateien BigButton.ios.jsund BigButton.android.js. In dem Code, in dem wir es verwenden möchten, verwenden wir die Schnittstelle und importieren sie BigButton. React Native kümmert sich je nach Plattform um die notwendigen Importe.

Komponenten


Wir können plattformübergreifende Lösungen implementieren, aber Geschwindigkeit ist wichtig. Deshalb sind wir zu vorgefertigten Lösungen übergegangen - Komponentenbibliotheken. Recherchierte, hob viele großartige Lösungen hervor (UI-Kit) und entschied sich für NativeBase . Dies ist eine riesige Bibliothek mit einem Dutzend Komponenten und 12.000 Sternen auf GitHub, mit der Sie die meisten Probleme lösen können.

   
Beispiel-Benutzeroberfläche für iOS links, für Android rechts.

In unserem Projekt verwenden wir diese Bibliothek teilweise, passen Elemente an und legen unsere eigenen Stile fest. Zum Beispiel haben wir Buttonoder Komponenten Header, die wir aus der NativeBase-Bibliothek importieren.



Wir schreiben den Code einmal, während er auf jeder Plattform anders aussieht.

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

Navigation


Für die Navigation haben wir auch mehrere mögliche Lösungen verglichen.

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

Wir haben die erste Lösung gewählt - React-Navigation . Es ist vollständig JavaScript, sodass wir uns nicht um native Dateien kümmern müssen. Andererseits ist die Leistung fraglich.

Wir haben mit Kollegen in der React Native-Community diskutiert, die Artikel studiert und festgestellt, dass die Leistung von React-Navigation und Wix / React-Native-Navigation ungefähr gleich ist. Daher entschieden sie sich für die erste Lösung, und die Erfahrung mit der Verwendung bestätigte nur die Richtigkeit der Wahl.

   

Vorteile der Reaktionsnavigation:

  • Flexible plattformübergreifende Lösung.
  • Native Benutzeroberfläche für jede Plattform und native Übergänge zwischen Bildschirmen. Wir wollten keine Anwendung erstellen, die unter Android wie unter iOS aussieht.
  • Es bietet alle grundlegenden Arten von Übergängen: die unteren Registerkarten, Wischen zwischen Bildschirmen, modale Fenster SwitchNavigator.

Eine beispielhafte Anwendungsstruktur mit React-Navigation. Der Code ist bequemer von unten nach oben zu lesen.

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

Einige createAppContainerenthalten createBottomTabNavigatorzwei Stapel. Jeder Stapel hat seine eigenen Bildschirme.


Wir haben zwei Knöpfe - Homeund Settings. Das sind zwei Stapel - HomeStackund SettingsStack. Innerhalb jedem Stapel sind zwei Bildschirme: HomeScreenund DetailsScreen, SettingsScreenund, DetailsScreenjeweils. Beide Stapel verwenden eine gemeinsame Komponente DetailsScreen. Wir schreiben eine Komponente (Bildschirm) und verwenden sie auf verschiedenen Stapeln wieder.

Der Code für die drei Bildschirme sieht so einfach wie möglich aus.

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

Dies ist das gleiche „Hallo Welt!“, Mit dem wir begonnen haben - nichts weiter.

Redux hinzufügen . Wir wickeln den Root-Navigator ein Providerund rollen ihn store. Als nächstes schreiben reducer, actions, actionTypesund der Rest - alles ist vertraut.

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

Benötigen Sie mehr Komponenten


Bei der Auswahl des endgültigen UI-Kits haben wir viele mögliche Lösungen in Betracht gezogen: 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. Daher verwenden wir einige Komponenten dieser Bibliotheken.



React Native verfügt auch über plattformorientierte Komponenten. Ein markantes Beispiel ist DatePickerAndroidund DatePickerIOS. Sie unterscheiden sich visuell und in der Benutzeroberfläche, sodass Sie den Code duplizieren müssen, um ein Problem für beide Plattformen zu lösen.

  
Links ist DatePickerAndroid, rechts ist DatePickerIOS.

In unserer Anwendung können Sie beispielsweise einen Bericht oder eine Grafik für einen bestimmten Zeitraum anfordern. Der Benutzer gibt zwei Daten an, um einen Zeitraum auszuwählen. Unter iOS ist die native Datumsauswahl jedoch unpraktisch, insbesondere im Vergleich zur Webversion unseres Tools.



Wir müssten zwei Felder machen: für das Start- und Enddatum. Es ist bequemer, Daten in einem Feld auszuwählen als unter Android, aber wir können nicht auch alles einrichten - die Anpassung ist minimal .

Wir haben eine Lösung gefunden - wix / react-native-Kalender .
     
Rechts sehen Sie ein Beispiel eines Kalenders aus unserer App mit Firmenfarben.

Es verfügt über horizontale und vertikale Kalender mit detaillierten Angaben zum Datum, der Möglichkeit, den Stil des Unternehmens anzuzeigen, einen Datumsbereich auszuwählen, die Auswahl bestimmter Daten zu blockieren und Android und iOS zu unterstützen. Es ist praktisch, dass die Lösung eine Oberfläche hat - wir schreiben den Code einmal, ohne ihn zu duplizieren und neu zu schreiben.

Lager


Irgendwann mussten wir Daten speichern, um sie offline oder bei Wiederaufnahme der Arbeit anzuzeigen. Verwenden Sie dazu die Async-Speicherbibliothek (Schlüsselwertspeicher). Es funktioniert mit Schlüsseln und Mehrfachschlüsseln (Schreiben, Lesen und Löschen) und bietet eine JavaScript-API für die Interaktion mit dem nativen Teil.

IOS-Daten werden in serialisierter Form gespeichert. Unter Android - zum Beispiel in SQLite. Als Entwickler brauchen wir uns darüber keine Sorgen zu machen: Es gibt eine API, wir speichern Daten, alles ist in Ordnung.

Animationen


React Native verwendet keine HTML-basierten WebView-Technologien, daher haben wir keine Animationen. Hier hilft uns die animierte Komponente . Es unterstützt einige Wrapper Grundelemente: View, Image, Text, ScrollView. Es geht in einen separaten Thread und verlangsamt die Anwendung nicht, aber es gibt ein Minus - die "unmenschliche" Art von Code.

Unten finden Sie ein Beispiel für den Bildschirm unserer Anwendung mit einer Liste von Benutzerprojekten.


Oben Headermit dem Namen "Projekte", der SearchBarProjekte filtern soll. Es sieht so aus, als wäre es SearchBarunter Header, aber in Wirklichkeit befindet es sich im allgemeinen Strom von Blöcken, die unten mit einer Liste von Projekten aufgeführt sind. Dank der animierten Komponente wird eine solche Animation implementiert, die SearchBar„verschwindet“.

Eine verkürzte Version der Implementierung.

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

Es sieht einfach aus, aber Sie müssen „krücken“: Verschieben Sie alle Inhalte unter iOS nach oben oder unten. Unter Android ist dies nicht erforderlich. Es gibt auch Interpolation und verschiedene Methoden aus dem animierten Modul.

Das Problem des "Flackerns" des Bildschirms beim ersten Start


Wir haben die Anwendung geschrieben und beschlossen, das Anwendungssymbol und den Begrüßungsbildschirm (oder Startbildschirm) hinzuzufügen - den Anwendungsbildschirm, der beim ersten Start angezeigt wird, wenn er aus dem Speicher entladen wird. Wir haben einen orangefarbenen Bildschirm mit dem SEMrush-Logo in der Mitte.



In der React Native-Architektur interagiert der native Teil mit einigen JavaScript-Bridge-Bundles. Wir haben ein Problem festgestellt, dass zum Zeitpunkt des Starts der native Teil funktioniert und das Skriptpaket noch nicht geladen wurde. Zwischen dem orangefarbenen Begrüßungsbildschirm und dem Erscheinungsbild der Projektliste leuchtete eine weiße Leere (Bruchteile einer Millisekunde) auf dem Bildschirm.

Das Flimmerproblem wurde mithilfe der React-Native-Splash-Screen- Bibliothek gelöst. Es bietet eine JavaScript-API zum programmgesteuerten Ein- oder Ausblenden des Anwendungsstartbildschirms. Über diese API haben wir den nativen Begrüßungsbildschirm in der Komponente mit der Liste der Projekte in der Methode entfernt componentDidMount(). Als Bonus setzen sie einen Spinner zwischen die beiden Bildschirme, damit sie hübscher aussehen.

Verbindungsverlust


Wir wollten eine freundliche und schöne Oberfläche entwickeln, uns um UX und UI kümmern. Als der Benutzer jedoch mit der U-Bahn fuhr, den Kontakt verlor und die Liste der Projekte aktualisierte, zeigte die Anwendung nur einen leeren Bildschirm an. Für den Benutzer ist es besser, bereits geladene Informationen und eine Meldung über ein Problem mit der Internetverbindung anzuzeigen.

Die Netinfo- Bibliothek half bei der Offline- Arbeit . Es ist jetzt in einem separaten Paket enthalten, da Facebook React Native entlädt, um es leichter zu machen.



Mit Netinfo können Sie:

  • Abonnieren Sie Ereignisse und zeigen Sie dem Benutzer beim Ändern der Internetverbindung Nachrichten an.
  • Überprüfen Sie die Qualität der Verbindung.
  • Überprüfen Sie die Art der Verbindung (LTE, WiFi, 3G) für komplexe Anwendungen.
  • Verwenden Sie eine Anfrage, um Ihre Internetverbindung zu überprüfen.

Anwendungs-Debugging


Um nach dem Hinzufügen neuer Abhängigkeiten, insbesondere derjenigen, die systemeigenen Code verwenden, keine Fehler zu erhalten, benötigen Sie einen Debugger. In React Native wird es im Bild des iPhone-Simulators angezeigt.


Für iOS haben wir einen Emulator von Xcode verwendet, in dem Sie die Version des Betriebssystems und des Geräts auswählen können. Simulator für Android - Android Studio.

Das Dialogmenü des Emulators verfügt über die Modi Debug JS Remotely und Live Reload. Ermöglicht das Anzeigen der Eigenschaften von Komponenten, z. B. CSS-ähnliche Stile und das Verschachteln von Ansichten.

In der nativen Entwicklung müssen Sie Code schreiben, an die Assembly senden und ausführen - es ist eine lange Zeit. Im Debugger ist alles das gleiche wie in ReactJS im Web: Wir aktivieren Live Reloading und sehen die Neuerstellung in Echtzeit im Simulator, ohne neu zu starten.

Darüber hinaus verwenden wir React Developer Tools, um Komponenten zu untersuchen, Hierarchien anzuzeigen und ihre Eigenschaften und Stile zu ändern.



Aber auch das reicht nicht aus, es gibt eine bessere Lösung - React Native Debugger .



Es verfügt über einen React Inspector, Redux DevTools, Internetinteraktion, Konsolenprotokollierung, Speicher- und Anwendungsprofile, mit denen alle Aktionen angezeigt werden. Im Gegensatz zu den ersten beiden Lösungen können Sie den Stil im React Native Debugger selbst ändern.

Native Module verbinden


Bis jetzt war alles einfach und transparent: Wir nehmen eine Lösung, verbinden, es funktioniert. Aber es gibt eine Nuance - eine Konsequenz der Architektur von React Native. Zusätzlich zum JavaScript-Teil verwenden alle Bibliotheken den nativen Teil, der mit React Native verknüpft sein muss. Zu diesem Zweck gibt es einen Befehl zum Reagieren eines nativen Links , der automatisch alle erforderlichen Änderungen und Verknüpfungen zum nativen Code im Projekt vornimmt.

Die automatische Verbindung funktioniert jedoch nicht immer. Daher müssen Sie native Dateien manchmal manuell ändern. Wenn die manuelle Installation nicht in den Anweisungen für die Bibliothek beschrieben ist, überlegen Sie, ob es sich lohnt, sie zu verwenden, und vermeiden Sie nach Möglichkeit die manuelle Verknüpfung - ein paar Mal sind wir auf einen solchen Rechen getreten.

Ergebnis


Ursprünglich wollten wir eine Anwendung für iOS schreiben, aber wir haben es für Android gemacht, und sie sehen anders aus, als jeder auf seiner Plattform sollte. Übergänge zwischen Bildschirmen sehen cool aus und wir haben ungefähr 30 Bildschirme (Übergänge und Zustände). Wir haben es geschafft, die Implementierung von benutzerdefinierten nativen Modulen zu vermeiden und Lösungen von Drittanbietern zu verwenden.

Timing: Die Entwicklung der Anwendung dauerte drei Monate bei zwei Personen. Seit April 2019 haben sie mehrere Updates mit neuen Funktionen veröffentlicht, die Anwendung wird entwickelt und Teams anderer Projekte möchten ihre Tools darin implementieren.

Die Leistung von React Native ist für uns völlig zufriedenstellend, da wir keine komplexe Logik benötigten und keine große Last haben.

Rückkopplung:Es ist schön, Benutzerfeedback für die App zu erhalten.

React Native eignet sich zum schnellen Entwickeln mobiler Anwendungen und zum Testen von Hypothesen , auch wenn Sie kein mobiler Entwickler sind. Es entwickelt sich ständig weiter, neue Funktionen und Bibliotheken erscheinen. Vor einem Jahr gab es beispielsweise keine Unterstützung für 32- und 64-Bit-Architekturen - jetzt gibt es keine Probleme damit.

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

, , , , , — - , 5900.

All Articles