Reagir nativo para os mais pequenos. Experiência em desenvolvimento móvel

Uma vez, em uma equipe de produto, eles queriam desenvolver um aplicativo móvel, a fim de testar a hipótese da demanda pelo produto e sua conveniência para os usuários. E o fato de a equipe não ter desenvolvedores móveis não prejudicou. Dois desenvolvedores de front-end pegaram o React Native e escreveram um aplicativo em três meses. O teste de hipótese foi bem-sucedido, o aplicativo continua a evoluir e desperta o interesse de outras equipes da empresa.


Imagem da descrição da ferramenta: www.semrush.com/news/position-tracking-on-the-go .

Esta é uma breve descrição da história da equipe de Artyom Lashevsky, que por três meses a partir do desenvolvedor front-end se tornou móvel. Para obter mais detalhes sobre como isso aconteceu, leia a decodificação do relatório da Artyom no FrontendConf 2019: o que é o React Native, por que é uma instrução passo a passo para criar um aplicativo e escolher as bibliotecas e componentes certos.

Artyom Lashevsky é desenvolvedor líder de front-end da SEMrush e especialista no campo da segurança da informação de sistemas automatizados.


Por que precisamos de um aplicativo


A SEMrush é uma empresa internacional de TI que desenvolve uma grande plataforma online para profissionais de marketing. Incluído nas 3 principais plataformas de marketing e SEO. A empresa possui 5 milhões de usuários, 7 escritórios em dois continentes, 800 funcionários e 30 equipes de desenvolvimento.

Cada equipe de desenvolvimento lida com sua própria ferramenta dentro da plataforma. Trabalho em uma dessas equipes de 8 pessoas: duas no front-end, três no back-end, QA, engenheiro de DevOps e PO. A ferramenta em que nossa equipe está trabalhando permite que os usuários verifiquem a posição das páginas do site em busca de pesquisas específicas do Google. A ferramenta ajuda a verificar a posição nas palavras-chave não apenas do seu site, mas também dos concorrentes, além de analisar e comparar.

A plataforma funciona em um navegador. A execução de um aplicativo móvel permitirá que você obtenhavantagem competitiva , porque o aplicativo ajuda a reter usuários antigos por mais tempo e aumenta a conversão de gratuito para pago.

Para os usuários, o aplicativo melhora a usabilidade da plataforma. Através do telefone, o cliente pode usar o SEMrush onde um computador era anteriormente necessário. Acesse o aplicativo e veja se o site caiu no SERP do Google ou aumentou - as principais métricas estão sempre à mão . Se eles afundaram, na versão da Web você pode ver os detalhes e entender como corrigir a situação.

Nossa equipe viu o potencial do aplicativo móvel e decidiu tentar desenvolvê-lo, mas não havia desenvolvedores móveis entre nós. Começamos a estudar ferramentas e tecnologias para o desenvolvimento de aplicativos.

Aplicativos nativos- a primeira coisa que você notou. Depois de estudar, percebemos que é longo, caro e inconveniente: você precisa estudar duas pilhas de tecnologia, duplicar a funcionalidade e testá-la duas vezes.



Passamos do desenvolvimento nativo para o estudo do WebView (Apache Cordova). Um colega de front-end tinha experiência no desenvolvimento do Cordova. Portanto, no primeiro sprint para o estudo de tecnologias e soluções, um dos protótipos foi desenvolvido no Cordova.



Mas queríamos algo mais moderno - "juventude na moda", então passamos a soluções de plataforma cruzada.

Desenvolvimento multiplataforma. Várias opções foram consideradas: Flutter, Xamarin, Native Script e React Native. Para nós, cada uma das opções tinha seu próprio menos, porque queríamos começar o mais rápido possível:

  • Flutter requer conhecimento de Dart (uma alternativa ao JavaScript). Não havia tempo para estudar tecnologias relacionadas - eu queria voar rapidamente para testar a hipótese.
  • O Xamarin requer conhecimento de C #. Temos desenvolvedores de back-end, mas o iOS e o Android exigem interfaces diferentes. De qualquer forma, você deve duplicar o código e as implementações.
  • Script nativo é projetado para ser empacotado com Angular. Nosso projeto usa ReactJS e Redux, então não.
  • Reagir Native parecia legal, e eles o escolheram. Além disso, queríamos apenas experimentá-lo, apesar dos inconvenientes e vantagens de outras soluções.

Durante a seleção, não encontramos Ionic. Talvez eles tivessem considerado isso também, mas teriam escolhido React Native de qualquer maneira.

Reagir nativo


Essa é uma estrutura do Facebook para o desenvolvimento de aplicativos nativos entre plataformas. Construído com base no ReactJS, sob o capô não usa o WebView, portanto, não há API DOM. O React Native não possui HTML e CSS, mas existem alguns componentes da plataforma em polifiles JSX e CSS.

O React Native contém alguma API JavaScript sobre componentes nativos. Isso significa que os componentes nativos têm algum tipo de "ligação" aos componentes JavaScript no ReactJS. O relacionamento entre os pacotes nativos e JavaScript é feito através da ponte usando a API JavaScript. Superficialmente, isso é tudo arquitetura.



Reagir profissionais nativos:

  • Plataforma cruzada . Queríamos escrever o aplicativo inicialmente no iOS, mas o lançamento adicional no Android é uma grande vantagem.
  • . , . React Native , 80% .
  • . Telegram React Native 3000 . , , , .
  • . — , . , ReactJS React Native.


Com o React Native, há duas maneiras de desenvolver um aplicativo: use a Expo ou React Native CLI.

Expo Esta é uma camada de abstração - um conjunto de ferramentas, bibliotecas e serviços para inicialização rápida. Essa é uma API que, pronta para uso, fornece acesso aos recursos do dispositivo : câmera, geolocalização, mensagens push.

A Expo possui ferramentas de depuração e teste de aplicativos. O algoritmo é simples: instalamos o aplicativo Expo Client no telefone, conectamos o telefone ao computador na mesma rede local, acessamos a Expo no telefone, abrimos o aplicativo em desenvolvimento. Todas as alterações no código são exibidas instantaneamente. Isso ajuda a testar e compartilhar na equipe.

A decolagem na Expo é rápida e rápida. Com a Expo, o Xcode e o Android Studio não são necessários. Escrevemos em nosso ambiente de desenvolvimento, coletamos o aplicativo usando o serviço Expo, assinamos e atualizamos em tempo real.

Mas também há desvantagens.

  • Você não pode adicionar módulos nativos personalizados.
  • Expo é uma camada de abstração sobre React Native. Você não pode atualizar para uma nova versão da estrutura até que o Expo seja atualizado.

Reaja à CLI nativa . Sua vantagem é a possibilidade de personalização , adicionando módulos nativos.

Mas para assinar e criar o aplicativo (e publicar), você precisa do Xcode ou do Android Studio. Para testar o aplicativo, você precisa compilá-lo e transferi-lo para o seu telefone, por exemplo, usando o TestFlight para iOS ou a instalação direta do PC para o telefone. Esquema padrão, mas inconveniente e longo.



Em geral, a escolha é simples: queremos desenvolver um protótipo - selecionamos Expo, queremos um aplicativo com o possível cliente - React Native CLI.
Escolhemos o React Native CLI. No SEMrush, provavelmente queremos escrever nossas partes nativas personalizadas, portanto o ponto com módulos nativos e bibliotecas de terceiros com módulos se tornou um fator decisivo. Com o React Native CLI, o início é mais lento devido a muito treinamento, mas no futuro haverá mais oportunidades.

Muitos colegas, usando o React Native, enfrentaram a necessidade de personalização e tinham equipes especiais para fazer a Ejeção com a Expo na CLI do React Native. A estrutura de diretórios dos arquivos de um aplicativo simples é transferida do conjunto usual de arquivos JavaScript para pastas para Android, iOS e JavaScript. Mas com uma aplicação complexa, haverá dificuldades.

Estamos escrevendo um aplicativo


Em nenhum costume Reagir CSS, DOM e web elementos nativos: div, span, li, button. Mas existem dois tipos de componentes de plataforma no React Native.

  • Cross Platform : View, Text, Imagee outros.
  • Específico para cada plataforma , por exemplo, DatePickerIOSou DatePickerAndroid.

A transição de Reagir a reagir Native é simples: ele bloqueia div-lo View, ele bloqueia span-lo Text, e listas de TI liou ul- FlatList. Para cada elemento, há uma correspondência.

Nota. Para transferir componentes da Web prontos para fora da Web, você pode escrever um transportador, mas geralmente é mais fácil reescrevê-lo novamente.

Você pode começar a escrever o React Native rapidamente.

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

Há alguma classe App(contêiner de aplicativo). Ele contém um método renderno qual a parte visual é desenhada. Ele contém o recipiente Viewdentro do qual vai Imagee Text.

Cada um dos elementos, por exemplo, Viewcontém um atributo stylecujo valor é especificado por meio do objeto styles.

Um objeto stylesé criado usando o módulo do StyleSheetmétodo createReact Native. Este objeto é uma notação de objeto CSS, um modelo CSS simplificado que é suficiente. O Flexbox também é usado para o layout da interface, também simplificado, mas é suficiente para alinhá-lo horizontal e verticalmente.

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

Concluído - criamos um aplicativo para iOS. No futuro, vou esclarecer que também funciona para o Android.


A primeira aplicação é "Olá, mundo!".

Plataforma cruzada


Queríamos que nosso aplicativo funcionasse no Android e no iOS. Ao mesmo tempo, queríamos fazer várias implementações, dependendo da plataforma. Há duas maneiras de fazer isso no React Native.

A primeira maneira é usar o módulo Platform . Por exemplo, criamos um aplicativo e definimos a altura dependendo da plataforma. Para iOS, a altura é 200; para Android, é 100. Usando o método, Platform.OSdeterminamos qual plataforma o usuário está usando.

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

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

Se tivermos 40 desses atributos, não há necessidade de duplicar o código. Existe um método Platform.selectdo mesmo módulo para isso. Ele retorna um conjunto de propriedades pela chave da plataforma: em iOS retorna backgroundColor = 'red', em Android - backgroundColor = 'blue'. Como resultado, podemos retornar nosso conjunto de atributos para iOS (pode haver pelo menos 20, pelo menos 40 deles), para Android - um conjunto completamente diferente.

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

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

O método Platform.selectpermite que você escreva componentes de plataforma cruzada.

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

<Component />;

Alguns componentes usam um método Platform.selectque, dependendo da chave da plataforma, retorna sua implementação. Está tudo bem, pegamos e escrevemos uma biblioteca multiplataforma.

Se houver soluções ou restrições personalizadas no sistema operacional, podemos determinar a versão do sistema operacional.

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

O segundo método - use a extensão de arquivo específica da plataforma ( *.android.jse *.ios.js). Isso permite desenvolver implementações de plataforma cruzada para código mais volumoso e lógica complexa. Em seguida, dividimos todo o código em dois arquivos, por exemplo, BigButton.ios.jse BigButton.android.js. No código em que queremos usá-lo, usamos a interface e importamos BigButton. O React Native cuidará das importações necessárias, dependendo da plataforma.

Componentes


Podemos implementar soluções multiplataforma, mas a velocidade é importante. Portanto, passamos para soluções prontas - bibliotecas de componentes. Pesquisou , destacou muitas ótimas soluções (kit de interface do usuário) e escolheu o NativeBase . Esta é uma enorme biblioteca com uma dúzia de componentes, 12.000 estrelas no GitHub, que permite resolver a maioria dos problemas.

   
Exemplo de interface do usuário para iOS à esquerda, para Android à direita.

Em nosso projeto, usamos parcialmente essa biblioteca, personalizamos elementos e definimos nossos próprios estilos. Por exemplo, temos Buttonou componentes Headerque importamos da biblioteca NativeBase.



Escrevemos o código uma vez, enquanto em cada plataforma parece 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>
        );
    }
}

Navegação


Para a navegação, também comparamos várias soluções possíveis.

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

Escolhemos a primeira solução - reagir navegação . Como é totalmente JavaScript, não precisamos nos preocupar com arquivos nativos. Mas, por outro lado, o desempenho está em questão.

Discutimos com colegas da comunidade React Native, estudamos os artigos e percebemos que o desempenho da navegação de reação e da navegação nativa wix / reage é o mesmo. Portanto, eles escolheram a primeira solução, e a experiência de uso apenas confirmou a exatidão da escolha.

   

Prós da navegação de reação:

  • Solução flexível de plataforma cruzada.
  • UI nativa para cada plataforma e transições nativas entre telas. Não queríamos criar um aplicativo parecido com o Android.
  • Ele fornece todos os tipos básicos de transições: as guias inferiores, deslize entre telas, janelas modais SwitchNavigator.

Um exemplo de estrutura de aplicativo usando reag-navigation. O código é mais conveniente para ler de baixo para cima.

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

Alguns createAppContainercontém createBottomTabNavigatorduas pilhas. Cada pilha possui seu próprio conjunto de telas.


Temos dois botões - Homee Settings. Estas são duas pilhas - HomeStacke SettingsStack. Dentro de cada pilha há duas telas: HomeScreene DetailsScreen, SettingsScreene, DetailsScreenrespectivamente. Ambas as pilhas usam um componente comum DetailsScreen. Nós escrevemos um componente (tela) e o reutilizamos em pilhas diferentes.

O código para as três telas parece o mais simples possível.

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

É o mesmo "Olá, mundo!" Com o qual começamos - nada mais.

Adicione Redux . Nós envolvemos o navegador raiz em Provider, roll-lo store. Em seguida, escreva reducer, actions, actionTypeseo resto - tudo é 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>
        );
    }
}

Precisa de mais componentes


Escolhendo o kit de interface do usuário final, consideramos muitas soluções possíveis: Reagir elementos nativos, UI Kitten, React Native Material UI, React Native Material UI, React Native Native Library, React Native UI Library, React Native Paper, Shoutem UI Toolkit, Nachos UI, Teaset. Como resultado, usamos alguns componentes dessas bibliotecas.



O React Native também possui componentes orientados à plataforma. Um exemplo impressionante é DatePickerAndroide DatePickerIOS. Eles diferem visualmente e na interface, portanto, você deve duplicar o código para resolver um problema nas duas plataformas.

  
À esquerda está DatePickerAndroid, à direita está DatePickerIOS.

Por exemplo, em nosso aplicativo, você pode solicitar um relatório ou gráfico por um determinado período de tempo. O usuário fornece duas datas para selecionar um período. Porém, no iOS, a escolha da data nativa é inconveniente, especialmente se comparada à versão da Web de nossa ferramenta.



Teríamos que fazer dois campos: para as datas de início e término. É mais conveniente selecionar datas em um campo como no Android, mas não poderemos configurar tudo também - a personalização é mínima .

Encontramos uma solução - wix / react-native-calendars .
     
À direita, está um exemplo de calendário de nosso aplicativo com cores da empresa.

Possui calendários horizontais e verticais, detalhando por data, a capacidade de exibir o estilo da empresa, escolhendo um período, bloqueando a seleção de determinadas datas e oferecendo suporte para Android e iOS. É conveniente que a solução tenha uma interface - escrevemos o código uma vez, sem duplicação e reescrita.

Armazenamento


Em algum momento, precisávamos armazenar dados para exibi-los offline ou ao retomar o trabalho. Para fazer isso, use a biblioteca Async Storage (armazenamento de valor-chave). Ele funciona com chaves e multi-chaves (gravação, leitura e exclusão) e fornece uma API JavaScript para interagir com a parte nativa.

Os dados do IOS são armazenados no formato serializado. No Android - por exemplo, no SQLite. Como desenvolvedores, não precisamos nos preocupar com isso: existe uma API, armazenamos dados, está tudo bem.

Animações


O React Native não usa tecnologias WebView baseadas em HTML; portanto, não temos animações. Aqui o componente Animado nos ajuda . Ele suporta alguns wrappers elementos básicos: View, Image, Text, ScrollView. Ele entra em um thread separado e não diminui a velocidade do aplicativo, mas há um sinal de menos - o tipo "desumano" de código.

Abaixo está um exemplo da tela do nosso aplicativo com uma lista de projetos de usuários.


Acima Headercom o nome "Projetos", que é SearchBarpara filtrar projetos. Parece que SearchBarestá abaixo Header, mas na realidade está no fluxo geral de blocos que aparecem abaixo com uma lista de projetos. Graças ao componente Animated, essa animação é implementada e SearchBar"desaparece".

Uma versão abreviada da implementação.

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, mas você precisa se concentrar: mova todo o conteúdo para cima ou para baixo no iOS. No Android, isso não é necessário. Também há interpolação e métodos diferentes no módulo Animated.

O problema de "tremulação" da tela no primeiro início


Escrevemos o aplicativo e decidimos adicionar o ícone do aplicativo e a Tela inicial (ou Tela inicial) - a tela do aplicativo que aparece quando você o inicia pela primeira vez, se estiver descarregada da memória. Temos uma tela em laranja e com o logotipo SEMrush no centro.



Na arquitetura React Native, a parte nativa interage com alguns pacotes configuráveis ​​de ponte JavaScript. Encontramos um problema que, no momento do lançamento, a parte nativa estava funcionando e o pacote de scripts ainda não foi carregado. Entre a tela inicial laranja e a aparência da lista de projetos, um vazio branco (frações de milissegundos) brilhava na tela.

O problema do flicker foi resolvido usando a biblioteca react-native-splash-screen. Ele fornece uma API JavaScript para mostrar ou ocultar programaticamente a tela de inicialização do aplicativo. Através desta API, nós removemos a tela nativa do respingo no componente com a lista de projectos no método componentDidMount(). Eles colocam um botão giratório entre as duas telas como um bônus para torná-las mais bonitas.

Perda de conexão


Queríamos desenvolver uma interface amigável e bonita, cuidar de UX e UI. Mas quando o usuário pegou o metrô, perdeu o contato e atualizou a lista de projetos, o aplicativo mostrou apenas uma tela em branco. É melhor para o usuário ver informações que já foram carregadas e uma mensagem sobre um problema com a conexão com a Internet.

A biblioteca Netinfo ajudou no trabalho offline . Agora ele está em um pacote separado, pois o Facebook descarrega o React Native para torná-lo mais leve.



O Netinfo permite:

  • Assine eventos e, ao alterar a conexão com a Internet, exiba mensagens para o usuário;
  • verifique a qualidade da conexão;
  • Verifique o tipo de conexão (LTE, WiFi, 3G) para aplicações complexas;
  • Use uma solicitação para verificar sua conexão com a Internet.

Depuração de aplicativo


Para não obter erros após adicionar novas dependências, especialmente aquelas que usam código nativo, você precisa de um depurador. No React Native, é mostrado na imagem do simulador do iPhone.


Para iOS, usamos um emulador do Xcode, no qual você pode escolher a versão do sistema operacional e do dispositivo. Simulador para Android - Android Studio.

O menu de diálogo do emulador possui os modos Debug JS Remotamente e Recarga ao Vivo. Permite ver as propriedades dos componentes, por exemplo, estilos semelhantes ao CSS e visualizar o aninhamento.

No desenvolvimento nativo, você precisa escrever o código, enviá-lo para o assembly, executar - é muito tempo. No depurador, tudo é igual ao ReactJS na Web: ativamos o Live Reloading e vemos a reconstrução em tempo real no simulador sem reiniciar.

Além disso, também usamos o React Developer Tools para inspecionar componentes, exibir hierarquias e alterar suas propriedades e estilos.



Mas mesmo isso não basta, há uma solução melhor - Reagir o Native Debugger .



Possui um React Inspector, Redux DevTools, interação via Internet, log do console, criação de perfil da memória e aplicativo, visualizando todas as ações. Diferente das duas primeiras duas soluções, você pode alterar o estilo no próprio React Native Debugger.

Conectando Módulos Nativos


Até agora, tudo era fácil e transparente: pegamos algum tipo de solução, conectamos, funciona. Mas há uma nuance - uma conseqüência da arquitetura do React Native. Além da parte do JavaScript, todas as bibliotecas usam a nativa, que deve estar associada ao React Native. Para fazer isso, existe um comando de link react-native que faz automaticamente todas as alterações e links necessários para o código nativo no projeto.

Mas a conexão automática nem sempre funciona, portanto, às vezes, você precisa modificar manualmente os arquivos nativos. Se a instalação manual não estiver descrita nas instruções da biblioteca, pense se vale a pena usá-la e, se possível, evite a vinculação manual - algumas vezes nós entramos nesse rake.

Resultado


Inicialmente, queríamos escrever um aplicativo para iOS, mas o fizemos para Android, e eles têm uma aparência diferente, como todos deveriam em sua plataforma. As transições entre telas parecem legais, e temos cerca de 30 telas (transições e estados). Conseguimos evitar a implementação de módulos nativos personalizados e usar soluções de terceiros.

Tempo: o desenvolvimento do aplicativo levou três meses de duas pessoas. Desde abril de 2019, eles lançaram várias atualizações com novas funcionalidades, o aplicativo está em desenvolvimento e as equipes de outros projetos desejam implementar suas ferramentas nele.

O desempenho do React Native é completamente satisfatório para nós, porque não precisamos de lógica complexa e não temos uma carga grande.

Comentários:É bom receber feedback do usuário sobre o aplicativo.

O React Native é adequado para desenvolver rapidamente aplicativos móveis e testar hipóteses , mesmo que você não seja um desenvolvedor móvel. Está em constante evolução, novas funções e bibliotecas aparecem. Por exemplo, há um ano, não havia suporte para arquiteturas de 32 e 64 bits - agora não há problemas com isso.

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

, , , , , — - , 5900.

All Articles