28
Rails +React + React Native A common codebase across web and mobile

Railsconf 2017 - React & React Native a common codebase across native and web

Embed Size (px)

Citation preview

Page 1: Railsconf 2017 - React & React Native a common codebase across native and web

Rails +React + React NativeA common codebase across web and mobile

Page 2: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Rails = Productivity

Page 3: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Mobile = Not Productivity

Page 4: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

React (+Native) = Productivity

Page 5: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

I’m Ben

Page 6: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Aim of this talk

• General Architecture

• Considerations for a shared codebase

• Practicalities & Pitfalls

Page 7: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

React != Framework

Page 8: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

But this is“Built In React” !?

Page 9: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Typical React Stack

State

React

Side Effects

Router

Page 10: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Typical React Stack

State

Side Effects

Router

React

Page 11: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Typical React Stack

Router

State

Side Effects

React

Page 12: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

State

Typical React Stack

Router

React

Side Effects

Page 13: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Oversimplifying Flux / Reduxfunction counterReducer(initialState = {}, action) { switch (action.type) { case 'INCREMENT': return Object.assign({}, initialState, { count: initialState.count + action.incrementBy }) case 'DECREMENT': return Object.assign({}, state, { count: initialState.count - action.decrementBy }) default: return initialState }}

{ count: 1, name: ‘Jim’, rank: 4}

initialState

{ type: 'INCREMENT', incrementBy: 1}

action

{ count: 2, name: ‘Jim’, rank: 4}

New State

Page 14: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Side Effects

Typical React Stack

Router

React

State

Page 15: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Side Effects Asynchronous Stuff

{ type: 'INCREMENT', incrementBy: 5}

action

{ count: 6, name: ‘Jim’, rank: 4}

New State

API Call

“Side Effect” (Saga)

Page 16: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Router

State

React

Side Effects

What should be shared

Page 17: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

What should be shared

Router

State

Side Effects

React

Page 18: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

In Practice: Login Flow

Show the login screen (Component)

Click Login (dispatch an action)

Go To Login (Router)

Update flag that we’re logging in (Store)

Make login API request (Side effect)

Page 19: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

In Practice: Login Flow

Handle successful response (dispatch an

action)

Update flag that we’re now logged in (Store)

Send user to dashboard (side effect)

Make login API request (Side effect)

Page 20: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

In Practice: Login Flow

Issue Redirect

Send user to dashboard (side effect)

Router

Page 21: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

In Practice: Login Flow

Issue Redirect

Send user to dashboard (side effect)

Router

Send user to dashboard (side effect)

Router

Invoke Callback

Redirect (Component)

Page 22: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Business Logic is Shared

Show the login screen (Component)

Click Login (dispatch an action)

Go To Login (Router)

Update flag that we’re logging in (Store)

Make login API request (Side effect)

Page 23: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Business Logic is Shared

Components

Actions

Router

Reducers

Side Effects

Side Effects

Page 24: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Start with Native

• Ignite Generator (!)

• https://github.com/infinitered/ignite

Page 25: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Restructure• App/

• Shared/

• Sagas

• Redux

• …etc

• Native/

• Web/

Page 26: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Restructure• App/

• Shared/

• Sagas

• Redux

• …etc

• Native/

• Web/

NPM Package

Page 27: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Watch out for .babelrc

—resetCache

Page 28: Railsconf 2017 - React & React Native a common codebase across native and web

@TalkingQuickly

Example Project

www.talkingquickly.co.uk/railsconf2017

[email protected]