Panorama geral do desenvolvimento de aplicativos para dispositivos móveis e uma introdução a React Native
Software Engineer
Mobile Chapter Leader
https://www.meetup.com/pt-BR/sanartech
https://twitter.com/sanartech
https://sanar.link/carreiratech
https://www.linkedin.com/company/sanar
https://www.youtube.com/c/SanarTech
Sanar Tech Talks Host
lucianomlima
@lucianomlima
https://reactssa.slack.com
https://www.meetup.com/pt-BR/reactssa/
https://react.salvador.br
https://sanar.link/carreiratech
Qual caminho percorremos até chegar onde estamos?
Primeiro telefone celular (1983)
Motorola DynaTAC 8000X
Primeiro telefone celular (1983)
Motorola DynaTAC 8000X
Pesava quase 800g
30 minutos de conversação
10 horas para recarregar a bateria
Agenda com capacidade para 30 números
1992 - Primeiro SMS enviado
1994 - Primeiro aparelho com touch screen
1996 - Primeiro celular dobrável (flip)
1996 - Primeiro celular com acesso a internet
2001 - Dispositivos com Bluetooth e câmera
2002 - BlackBerry 5810 com suporte a rede GSM e envio de e-mail
2007 - Apple lança o iPhone
2008 - Primeiro celular com Android
2009 - Primeiro celular Android no Brasil
2010 - Lançamento do iPad
2011 - Android 3.0 Honeycomb
Motorola Xoom
2010 - Android supera iPhone em participação de mercado
Dias atuais...
E como foi a evolução do desenvolvimento mobile?
Aplicativos híbridos
Web App
HTML
CSS
JS
Mobile Framework
Mobile OS
WebView
Web App
Aplicativo Híbrido
WebView
Web App
HTML
CSS
JS
Web App
Câmera
Contatos
Microfone
FileSystem
Plugins
Aplicativos multiplataforma
App Code
Compiler
Native Code
Native Libraries
App Libraries
Aplicativos multiplataforma
Apache Cordova
(amazon-fireos, android, blackberry, firefox os, iOS, ubuntu e windows phone)
Características
- Suporte multi-plataforma
- Comunidade grande e ativa
- Extensa lista de plugins
- Documentação, artigos, vídeos...
- Baixa performance
- Ferramentas limitadas
- Debug limitado ao browser
- Não acompanha as atualizações das plataformas
Ionic
Características
- Baseado do Cordova (mesmas vantagens)
- Vários componentes built-in
- IDE própria
- Testes remotos
- Atualização automática durante desenvolvimento
- Performance baixa em apps complexos
- Ferramentas limitadas
- Debug limitado ao browser
- Não acompanha as atualizações das plataformas
Xamarin
Características
- OpenSource
- Componentes de interface nativos
- Documentação – Xamarin University
- Apoio da comunidade de desenvolvedores C#
- Visual Studio – IDE robusta
- Curva de aprendizado – C#, Xamarin e plataformas nativas
- Aplicativos maiores
NativeScript
Características
- Opensource
- JavaScript/TypeScript compilado para Native Code
- Componentes de interface nativos
- NativeScript XML para template
- Estilização com CSS
- Boa performance
- Pode-se usar Angular, Vue, JS ou TS (Svelte*)
- Comunidade pequena
- Boa documentação mas com tutoriais e casos de uso escassos
Flutter
Características
- Performance próximo a aplicações nativas
- Skia rendering engine
- Widget Catalog
- Developer Experience
- Dart como linguagem de programação
- Suportado pelo Google*
- Comunidade em crescimento rápido
- Documentação
React Native
Características
- Multi-plataforma*
- React e JavaScript
- Flow, TypeScript e Reason
- Comunidade grande e ativa
- Milhares de pacotes do NPM disponíveis
- Lançado em 2015 – usado por grandes empresas
- Conhecimento de ambiente de desenvolvimento mobile
- Atualização complicada e problemática
- Aplicativos maiores
React Native
-
React
- JSX
- Props
- State
- StyleSheet
- Platform
- TypeScript
React Native
React
import React from 'react';
import { Text, View } from 'react-native';
function App() {
return (
<View>
<Text>Tô renderizado pae!</Text>
</View>
);
}
export default App;
React Native
JSX
import React from 'react';
import { Text, View } from 'react-native';
function Greetings() {
const name = 'Teobaldo';
return (
<View>
<Text>E aí {name}!</Text>
</View>
);
}
export default Greetings;
React Native
Props
import React from 'react';
import { Text, View } from 'react-native';
function Greetings(props) {
return (
<View>
<Text>E aí {props.name}!</Text>
</View>
);
}
export default Greetings;
// Em outro componente
<Greetings name="Teobaldo" />
React Native
State
import React, { useState } from 'react';
import { Button, Text, View } from 'react-native';
function Clicker() {
const [clicks, addClick] = useState(0);
return (
<View>
<Text>Você clicou {clicks} vezes!</Text>
<Button
title="Clicar"
onPress={() => addClick(state => state + 1)}
/>
</View>
);
}
export default Clicker;
React Native
StyleSheet
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
function Message() {
return (
<View style={styles.container}>
<Text style={styles.message}>Tô todo estilizado!</Text>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
message: {
color: 'red',
backgroundColor: '#fff',
}
})
export default Message;
React Native
Platform
import React from 'react';
import { Platform, Text, View } from 'react-native';
function CurrentPlatform() {
const color = Platform.select({
android: 'green',
ios: 'red',
});
return (
<View>
<Text>Sistema identificado:</Text>
<Text style={{ color }}>{Platform.OS}</Text>
</View>
);
}
export default CurrentPlatform;
React Native
TypeScript
import React from 'react';
import { Text, View } from 'react-native';
type GreetingsProps = {
name: string;
};
function Greetings(props: GreetingsProps) {
return (
<View>
<Text>E aí {props.name}!</Text>
</View>
);
}
export default Greetings;
//Type 'number' is not assignable to type 'string'
<Greetings name={5} />
React Native
Fast refresh
React Native
Debugging
- Chrome developer tools
- Safari developer tools
- React devtools
- React Native Debugger
- Reactotron
- Flipper
React Native
Testes
- Testes unitários com Jest
- Mocking
- React Test Renderer
- React Native Testing Library
- Detox
- Appium
React Native
Core Components e Native Api's
React Native
Core Components e Native Api's
React Native
Core Components e Native Api's
React Native
Core Components e Native Api's
React Native
Core Components e Native Api's
React Native
Core Components e Native Api's
React Native
Core Components e Native Api's
ReactJS
Biblioteca criada pelo Instagram para viabilizar o uso de componentes na interface de aplicações web.
Virtual DOM
Componentes HTML
JSX + JavaScript/TypeScript
Interface reativa
Arquitetura Flux
ReactJS ➔ React Native
Framework para criação de aplicativos para dispositivos móveis (celulares, tablets, TVs) que usa o JavaScript como linguagem de programação.
Virtual DOM ➔ Bridge
Componentes HTML ➔ Componentes Mobile
JSX + JavaScript/TypeScript
Interface reativa
Arquitetura Flux
ReactJS ➔ React Native
<div></div>
<p></p>, <span></span>
<img />
<ul><li></li></ul>
<form></form>
<input />
<button></button>
ReactJS ➔ React Native
<View></View>
<Text></Text>
<Image />
<FlatList />, <SectionList />, <ScrollView></ScrollView>
<TextInput />
<Button />
<TouchableHighlight></TouchableHighlight>
<TouchableOpacity></TouchableOpacity>
<TouchableNativeFeedback></TouchableNativeFeedback> * Android
<TouchableWithoutFeedback></TouchableWithoutFeedback>
React Native - Vantagens
- JavaScript como linguagem de programação
- CSS para estilização
- NPM / Yarn para gerenciamento de dependências
- Simplifica a busca por desenvolvedores
- Curva de aprendizado reduzida
- Produtividade em multiplataforma
- Performance próxima a de aplicativo nativo
- Desenvolvimento baseado em componentes
- Possibilita reutilização de código entre clientes
- Eventos, podcasts, artigos, vídeos, conferências...
- Criada pelo Facebook, mas Community driven
React Native - Desvantagens
- Ainda está em desenvolvimento (break changes)
- Aprender o React way
- Aplicativos maiores
- Necessidade de desenvolver código nativo
- Necessidade de dominar o ambiente mobile
- Uso de muitas dependências externas
- Dificuldade para atualizar para versões mais novas
- Liberdade para estruturar aplicações
- Não há ferramenta oficial para deploy
- Não há ferramenta oficial para testes E2E
Ecossistema React
React Native Architecture
React Native Architecture
fonte: https://formidable.com/blog/2019/react-codegen-part-1/
RN Fabric Architecture
By using the typed JavaScript (Flow or TypeScript) as the source of truth, this generator can define the interface files needed by Fabric and TurboModules to send messages across the realms with confidence.
fonte: https://formidable.com/blog/2019/react-codegen-part-1/
RN Fabric Architecture
With JSI (JavaScript Interface), JavaScript can hold reference to C++ Host Objects and invoke methods on them. This means that the two realms of JavaScript and Native will be really aware of each other, and there won’t be any need to serialize to JSON the messages to pass across, removing all congestion on the bridge.
fonte: https://formidable.com/blog/2019/jsi-jsc-part-2/
RN Fabric Architecture
This group of elements is basically responsible for two different behaviours: defining how the UI should look and behave (via the Shadow Tree) and managing the native side (via Native Modules). These communications happen via asynchronous JSON messages that get batched and sent, back and forth, over one communication channel, which can get congested and lead to suboptimal experiences.
RN Fabric Architecture
Fabric, which is the re-architecture of the UI manager, and the TurboModules, which is the “new gen” implementation of the interaction with native side.
fonte: https://formidable.com/blog/2019/fabric-turbomodules-part-3/
(React -> Native -> Shadow Tree -> Native UI)
RN Fabric Architecture
fonte: https://formidable.com/blog/2019/lean-core-part-4/
React Native - no Brasil
React Native - no Brasil
React Native - no mundo
Tesla Motors
Uber Eats
Shopify
Discord
Wix
React Native - no mundo
Skype
Uber
Walmart
Coinbase
Bloomberg
Salesforce
Referências
https://www.reinaldocirilo.com.br/post/2019/04/21/dispositivos-móveis-história-e-evolução
https://canaltech.com.br/inovacao/primeira-ligacao-feita-com-um-celular-completa-45-anos-relembre-a-historia-111152/
https://olhardigital.com.br/2019/09/23/noticias/android-faz-11-anos-relembre-alguns-de-seus-momentos-importantes/
https://www.tecmundo.com.br/dispositivos-moveis/146087-dynatac-iphone-conheca-historia-celulares.htm
Obrigado!
LoveBits 2020 - React Native
By Luciano Lima
LoveBits 2020 - React Native
Por que o React Native pode ser uma boa escolha como ferramenta de criação de apps para dispositivos móveis.
- 775