1. Ionic vs React NativeIonic vs React Native
Un confronto pratico tra due mondi diversiUn confronto pratico tra due mondi diversi
Antonio GalloAntonio Gallo
1 . 1
2. Mi presentoMi presento
Antonio Gallo -
Programmo dai tempi dei computer Commodore
Mi occupo di Linux e Web dal 1996 -
Da qualche anno mi occupo anche di Angular e React
Sviluppo App e Corsi per Aziende
Do una mano a gestire alcuni gruppi FB tra cui "
" e " "
https://www.antoniogallo.it/
https://www.badpenguin.org/
Angular Developer
Italiani React Developer Italiani
1 . 2
4. Di cosa vi parlo oggiDi cosa vi parlo oggi
Delle di erenze dal punto di vista pratico tra due mondi molto
diversi: Ionic e React Native
Senza scatenare ame o guerre ideologiche
E' mio parere che bisogna conoscerli entrambi
Ciascuno giudica bene ciò che conosce, e solo di
questo è buon giudice. -- Aristotele
1 . 4
5. Cosa sono Ionic e ReactCosa sono Ionic e React
Native?Native?
Sono “framework” per sviluppare applicazioni mobile usando
JavaScript (TypeScript)
Ionic: realizzato da Drifty Co., utilizza Angular (Google)
React Native: realizzato da Facebook, utilizza React (Facebook)
Angular e React sono due diversi framework JS per sviluppare
WebApp
1 . 5
6. Come funzionano?Come funzionano?
Ionic usa "Apache Cordova"
Cordova permette far girare una WebApp all'interno di una
WebView
in pratica c'è un index.html che Cordova apre a schermo pieno
al lancio dell'App mobile
Cordova fornisce una serie di plugin per consentire da JS di
accedere a funzioni native
React Native è un unico bundle
all'avvio viene lanciato index.js che consente di usare React per
e ettuare il render() di funzioni native
1 . 6
7. In parole povereIn parole povere
In Ionic si programma come se fosse un sito web responsive
(HTML5, CSS, etc.) e abbiamo delle funzioni JS che consento
l'accesso all'hardware
In React Native si programma in React ma senza usare HTML
(non esiste il DOM) con componenti nativi già pronti all'uso e
funzioni JS per l'accesso all'hardware
1 . 7
8. I limiti della WebViewI limiti della WebView
Compatibilità HTML e CSS (Android 4: stock browser senza
exbox; Android 5+: chrome; IOS: Safari)
Feeling della UI: 300ms delay sul click (si ovvia usando "tap")
Flickering durante le transizioni CSS
Performance: utilizza un solo "core" (o almeno era così)
Con Ionic v2 ho avuto spesso problemi di performance quando
l'app era troppo grande con alcuni telefoni di fascia bassa.
Parzialmente risolto con la v3 che implementa il lazy loading e
la compilazione AOT.
1 . 8
9. I vantaggi della WebViewI vantaggi della WebView
Possibilità di riutilizzare un in nità di codice sviluppato per DOM
Tempi e costi di sviluppo ridotti
Possibilità di creare PWA - Progressive Web Application
In React Native esiste un progetto sperimentale:
https://github.com/necolas/react-native-web
1 . 9
10. Chi ha già usato questiChi ha già usato questi
framework?framework?
Ionic:
SworKit -
RN:
Instagram, AirBnB, Pinterest, Skype, Uber
https://showcase.ionicframework.com/apps/top
https://play.google.com/store/apps/details?
id=sworkitapp.sworkit.com
https://facebook.github.io/react-native/showcase.html
1 . 10
11. App di esempioApp di esempio
Per confrontare le performance e il feeling ( uidità, tocco, scroll,
swipe, etc.) dell'interfaccia ho realizzato appositamente due app con
funzionalità identiche che potete installare e comparare
direttamente sul Vs dispositivo.
O in alternativa, trovate i video su
https://goo.gl/4YndQmhttps://goo.gl/4YndQm
https://www.youtube.com/user/antoniogallo73/videos
1 . 11
17. Load moreLoad more
In RN potrebbe non comparire: è con gurabile per caricare prima che si arrivi in
fondo alla lista
1 . 17
18. "Out of the box""Out of the box"
Feature Ionic React Native
Tema Material per Android
(SASS/SCSS)
Neutrale (Stylesheet)
Grid/List HTML (UL,LI) Nativa
Aspect Ratio CSS Nativo
Icone Ionicons (wo ) Nessuno
(Fontawesome)
Font Roboto, Noto Sistema (TTF)
Animazioni CSS Transitions Native (Animate)
1 . 18
24. Temi e UI kit già pronti per RNTemi e UI kit già pronti per RN
Per ovviare al gap iniziale con Ionic:
Native Base
demo:
Elements
Material Design
https://docs.nativebase.io/Components.html#Form
https://play.google.com/store/apps/details?
id=io.market.nativebase.geekyants.nativebasekitchensink
https://react-native-training.github.io/react-native-elements/
https://github.com/react-native-material-design/react-native-
material-design
1 . 24
27. Sporchiamoci le maniSporchiamoci le mani
Vediamo velocemente le principali di erenze a riguardo di:
1. installazione
2. struttura del sorgente
3. programmazione e debugging
4. compilazione
5. aggiunta di componenti nativi aggiuntivi
1 . 27
28. 1. Installazione e creazione di1. Installazione e creazione di
un progettoun progetto
Ovviamente dovete avere una serie di pre-requisiti (per Android
ovviamente l'SDK, Java, etc.; npm)
IonicIonic
React NativeReact Native
npm install -g ionic cordova
ionic start helloWorld blank
ionic cordova platform add android
ionic cordova platform add ios
npm install -g react-native-cli
react-native init helloWorld2
1 . 28
32. Ionic: bootstrap e ion-appIonic: bootstrap e ion-app
Directory: src/app/
main.ts e app.module.ts sono i le principali di Angular
app.component.ts, app.html e app.scss è il componente MyApp
-rw-r--r-- 1 681 giu 1 13:54 app.component.ts
-rw-r--r-- 1 38 mag 8 23:52 app.html
-rw-r--r-- 1 1335 mag 28 14:48 app.module.ts
-rw-r--r-- 1 677 mag 21 21:41 app.scss
-rw-r--r-- 1 169 mag 12 22:28 main.ts
1 . 32
33. Ionic: MyAppIonic: MyApp
app.component.ts
platform.ready() promise
seleziona pagina principale TabsPage
import {TabsPage} from '../pages/tabs/tabs';
@Component({
templateUrl: 'app.html'
})
export class MyApp {
rootPage: any = TabsPage;
constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) {
platform.ready().then(() => {
statusBar.styleBlackOpaque();
splashScreen.hide();
});
}
}
1 . 33
34. Ionic: MyApp - NavControllerIonic: MyApp - NavController
app.html
contiene solo il navigatore
Il valore della proprietà root è TabsPage per cui viene caricato il
componente da src/pages/tabs/
tabs.html
Ogni tab ha un suo stack di navigazione separato
<ion-nav [root]="rootPage"></ion-nav>
<ion-tabs>
<ion-tab [root]="tabUsers" tabTitle="Utenti" tabIcon="logo-octocat"></ion-tab>
<ion-tab [root]="tabBike" tabTitle="Bike" tabIcon="bicycle"></ion-tab>
<ion-tab [root]="tabPhoto" tabTitle="Foto" tabIcon="camera"></ion-tab>
<ion-tab [root]="tabForm" tabTitle="Form" tabIcon="clipboard"></ion-tab>
<ion-tab [root]="tabAbourMe" tabTitle="About" tabIcon="person"></ion-tab>
</ion-tabs>
1 . 34
44. React Native: unione di StyleSheetReact Native: unione di StyleSheet
export const FullScreenContainer = (props) => <View style={
{
...StyleSheet.absoluteFillObject,
justifyContent: 'center',
alignItems: 'center',
...props.style
}
}>{props.children}</View>;
1 . 44
45. Icona e SplashScreenIcona e SplashScreen
IonicIonic
Creare icon.png e splash.png in resources/ e lanciare:
React NativeReact Native
icona: da impostare manualmente nel progetto Android
splash: installare plugin di terze parti e creare immagini
manualmente
ionic cordova resources
1 . 45
47. 3. programmazione e debugging3. programmazione e debugging
Ionic: nel browserIonic: nel browser
lancia automaticamente una nestra Chrome
ad ogni salvataggio ci sarà il live-reload automatico
si debugga HTML, JS e CSS come una normale SPA per browser
i plugin Cordova non saranno utilizzabili (warning)
ionic serve
1 . 47
48. Ionic: su emulatore/device ma con livereloadIonic: su emulatore/device ma con livereload
ad ogni salvataggio ci sarà il live-reload automatico
i plugin Cordova non saranno utilizzabili (warning)
i console.log compariranno anche sulla command line (-c)
si usa chrome://inspect per connettersi all'app per il debugging
remoto
Per rendere funzionanti i plugin, togliere i parametri -l e -c
si debugga come una app nativa Android
ionic emulate -l -c
1 . 48
49. 3.2. sviluppo e debugging con React3.2. sviluppo e debugging con React
NativeNative
l'app parte in modalità debug e sarà dipendente dal PC di sviluppo
metro bundler
ovviamente non c'è il DOM per cui dobbiamo usare altri tool!
react-native run-android
1 . 49
50. Il menù di debuggingIl menù di debugging
Emulatore: CTRL + M
Shake del telefono
52. Il menù - le opzioni di reload automaticoIl menù - le opzioni di reload automatico
live reload aggiorna l'intera app quando c'è una modi ca e
riparte dalla route principale
hot reload prova a mantenere lo stato inalterato e ad aggiornare
solo i le modi cati
stili
reload manuale occorre premere CTRL+R (o R) sull'emulatore
1 . 51
53. Il menù - la funzione "inspect"Il menù - la funzione "inspect"
read-only 1 . 52
54. Il menù - la funzione "network"Il menù - la funzione "network"
1 . 53
55. Il menù - l'opzione di debug remotoIl menù - l'opzione di debug remoto
Attivando l'opzione Debug JS Remotely:
aprire in Chrome l'URL
console logs
breakpoint nel sorgente ( ag "Pause on caught exception")
il tab network purtroppo non si può utilizzare senza applicare
degli Hack
ovviamente non è possibile vedere gli elementi nativi
react-devtools
si può installare react-devtools per ispezionare e modi care gli
elementi nativi
http://localhost:8081/debugger-ui/
1 . 54
56. React Native DebuggerReact Native Debugger
Installare da:
debug JS, breakpoint
inspect componenti
network
Nel dev menu oltre a "Enable Debug JS Remotely"
cliccare "Dev Settings"
disabilitare "Use JS Deltas" per far funzionare i breakpoint
https://github.com/jhen0409/react-native-
debugger/releases
1 . 55
65. 4. compilazione (per deploy)4. compilazione (per deploy)
IonicIonic
la rma si applica con gurando build.json o rmando con
jarsigner+zipalign l'apk
React NativeReact Native
procedura un pò lunga, da automatizzare/con gurare
manualmente la prima volta
ionic cordova build android --prod --release
ionic cordova run android --prod --release
https://facebook.github.io/react-native/docs/signed-apk-
android.html
1 . 60
66. Deploy con IonicDeploy con Ionic
copiare il keystore in android/app
patchare android/gradle.properties
patchare android/app/build.gradle
build
testing
cd android && ./gradlew assembleRelease
react-native run-android --variant=release
1 . 61
68. 5.2. plugin per React Native5.2. plugin per React Native
R.N. è più giovane e questa parte e ancora non completamente
matura
non c'è un repository centrale
AggiuntaAggiunta
patchare android/app/src/main/AndroidManifest.xml
RimozioneRimozione
npm install react-native-camera --save
react-native link react-native-camera
react-native unlink react-native-camera
npm uninstall react-native-camera --save
1 . 63
69. Se qualcosa va storto ...Se qualcosa va storto ...
... bisogna capirci del nativo ...... bisogna capirci del nativo ...
android/settings.gradle
android/app/build.gradle
android/app/src/main/AndroidManifest.xml
android/app/src/main/java/[...]/MainApplication.java
1 . 64
72. ConclusioniConclusioni
Ionic R.N.
Velocità di sviluppo e prototipizzazione
Costi di sviluppo
Performance
Feeling UI
Breaking Changes Riuso componenti
(personale)
Semplice accesso alle funzioni native
principali
1 . 67