React native

VS

Cordova

~20min

About me

Florian Rival

@florianrival

github.com/4ian

App developer @

Developer of

React Native

enables you to build world-class application on native platforms

based on JavaScript and React

Facebook uses React Native in multiple production apps and will continue investing in React Native

How react native works

iOS or Android

JavaScriptCore

React Native

provided by iOS, embedded on Android

your JavaScript app

Components

APIs

React Native JS components

Natif

JS

WebView

 JavaScript app

Chrome/

UIWebView

 JavaScript app

JSCore

App with native components

cordova

React native

an app organisation

export default class ClickableImage extends Component {
  render() {
    return (
      <TouchableHighlight onPress={this.props.onClick}>
        <Image style={styles.image} source={{ uri: this.props.imageUri }}/>
        <Text style={styles.text}>{this.props.text}</Text>
      </TouchableHighlight>
    );
  }
}

bootstrap is done in index.[os].js

use Components the react way

use APIs provided by RN

onClick() {
    fetch('http://my/api').then((response) => { 
        Alert.alert(response.json())
    });
}

Style your components 

No real css, real encapsulation

flexbox based layout

most properties are similar to the css you are used to

<Text style={this.myStyle} />
<Text style={{margin: 10, color: #BADA55}} />
<View style={{flexDirection: 'row'}}>
    <Text style={{flex:0}}>I fit</Text>
    <Text style={{flex:1}}>I'm taking all the spaaaaace</Text>
</View>

Animations 

componentDidMount() {
    InteractionManager.runAfterInteractions(() => {
        Animated.timing(this.state.progress, {
          toValue: 200,
        }).start();
    });
}

render() {
    return (<Animated.View style={{
      transform: [{
        translateX: this.state.progress.interpolate({
          inputRange: [0, 1],
          outputRange: [500, 0],
        }),
        opacity: this.state.progress
      }],
    }}>
        <Text>Hello world</Text>
    </Animated.View>);
}

transform css-like properties

animated.* components

Performance

in general, performance is really satisfying 

60fps, smooth transitions, smooth animations even on older devices

Beware of

Very large images on Android,

Run fetches/cpu intensive code after interactions

 

deactivate dev mode first

Digging into Native Code

CALLING  NATIVE CODE

Add Objective-C/Java code directly inside your project

INTEGRATE  EXISTING NATIVE COMPONENT

full control on the native projects  

Make it easier to integrate custom SDK (Facebook, Parse...) without having to rely on plugins

RN Ecosystem

react-native github

25000 stars, 500 contributors, a release each ~2weeks

react.parts

Lots of components (from icons to full messenger component) 

Can i haz...

camera?

Yup

Deep links?

Yup, yup

sharing menu?

Sure bro

facebook login?

Ok

maps?

Yuuuuuuuus

emoji in texts?

Yeeeaahh 😺

 DEVELOPER experience

Yellow box

Chrome debugging

No network requests monitoring, use V8 instead of JSC

developer menu

very simple inspector, debugger launchers,

FPS counter, options to connect to the remote packager

LIVE Reload in the emulators/devices

 caveats/pain points

the whole framework is very young

platform parity

Testing is hard

Jest is (was?) slow to start,

hard to test components

incomplete polyfills of browsers api

100% compatibility between OSes is not a goal 

we pushed a fix to RN and made rn-camera-roll/rn-image-resizer 

Regularly test on both OSes

a few incomplete/outdated documentation pages

navigation is a bit hard to start with

upgrading is not easy 

Navigator does a good job, but no easy-to-use router

Be cautious and follow the doc

adding plugins is done manually 

Solutions are being created

most pain points are addressed by the rn team

Thanks!

React Native vs Cordova

By Florian Rival

React Native vs Cordova

Introduction to React Native, explanations of key concepts of the framework & differences with Cordova, and review of some features of React Native - including the developer experience/pain points.

  • 3,041