react native learn once, write anywherephonegap xamarin nativescript webview c# -> objc / java...

66
React Native Learn once, write anywhere Дмитрий Пацура https://github.com/ovr

Upload: others

Post on 05-Jun-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

React Native Learn once, write anywhere

Дмитрий Пацура

https://github.com/ovr

Page 2: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

SPA

Mobile

PHP GO

Page 3: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

XML XIB

Android iOS

Java Kotlin

ObjC Swift

UI

Language

Build Gradle XCode

Page 4: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

PhoneGap Xamarin NativeScript

WebView C# -> ObjC / Java

JS/CSS XML/JS/CSS

?

Page 5: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

React-Native

ES6+ JSX FlexBox -> Yoga

Babel

Polyfills

Page 6: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

ES 2015

Common JS

Async / Await

JSX

Page 7: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 8: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

JavaScriptCore

Android iOS Debug

Chrome / V8

WebSocket

Page 9: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Packer HTTP: 8081

Babel

Page 10: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

MainActivity

Page 11: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

MainActivity

Page 12: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Android

Page 13: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

ReactActivityDelegate

Page 14: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

mActivity это Activity пришла в Delegate

Page 15: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Application

JSC

Activity

Delegate

BaseView

Page 16: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

MAIN / UI

JSC (JS)

Shadow

Native Modules

X

X

X

X

———————————————————>

———————————————————>

———————————————————>

—————————————————>

—————————————————>

—————————————————>

—————————————————>

Page 17: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Вызов нативного кода из JS.

Page 18: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Wrapper JS NativeModules Module

BatchedBridge(MessageQueue)

Native EventDispatcher MessageQueue

processJS Call

Page 19: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

MessageQueue Timers

Page 20: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Вызов JS из нативного кода?

Page 21: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Пример на AppState

Page 22: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 23: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Native -> JavaScript

Page 24: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 25: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 26: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Приложение начинается с навигации

Page 27: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Какой у нас выбор?

• react-comunity/react-navigation

• aksonov/react-native-router-flux

• jmurzy/react-router-native

• wix/react-native-navigation • airbnb/native-navigation

JS Native

Page 28: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Ну JS ведь однопоточный… Пошалим?)

Page 29: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 30: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Реальная проблема

• Большой этап Render

Navigator transition delays :(

Page 31: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

setTimeout не вариант

Page 32: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

setTimeout не вариант

Page 33: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

• Больше сообщество • Легко настраиваемые

• Анимация в JS Thread • Беда с фрагментами

• Плавные Анимации всегда • SharedComponents

• Маленькое сообщество • Сложнее в поддержке

JS Native

И что выбрать?

Page 34: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Mobile vs Tablet 1

Page 35: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Mobile vs Tablet 1

Page 36: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 37: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

LI-FI - это как WiFi

• Ушел запрос, не вернулся • Шел слишком долго (timeout) • Интернета вообще нет =)

Page 38: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

REST API + WS, но зачем?

Mobile REST API

WS Server

Page 39: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

WS + REST, но зачем?

• Синхронизация между устройствами • Нотификации • Обновление данных

Page 40: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Let’s imagine

Диалоги Диалог

Page 41: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 42: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Какая проблема?

• Денормализованные данные (повторы) • Много кода для обновления во всех местах • Нормализованные данные нужны для БД

Page 43: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Как решать проблему?

• Normalizer - (normalize by Schema) • Reselect (Memoized Selector)

Page 44: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Как мерить производительность?• На глаз на реальном устройстве • Performance overlay • Systrace • CPU Profiler via Remote JS • CPU Profiler

Page 45: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 46: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 47: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 48: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 49: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Есть 2 profiler

• Performance • JavaScript Profiler

Page 50: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 51: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 52: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 53: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

————>

Page 54: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 55: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Production подготовка

Page 56: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Если ошибка может быть допущена, она обязательно будет допущена.

• Native ошибки (dsym for ios) • Ошибки в JS (source map/bundle.js) • Сервер в open source • Остальные проекты? • Server inside Docker?)

Page 57: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 58: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 59: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 60: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 61: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Правильный deploy приложения, экономит нам время.

• Сборка приложения под iOS/Android • Обновление статичной информации в iTunes/

Play Market • Создание скриншотов • Доставка в beta/alpha/prod

Page 62: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common
Page 63: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Как тестировать приложение?• Flow • Unit - смотри Jest • Интеграционное тестирование

Page 64: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Плюсы RN• Инкрементальная сборка • Быстрое развивается • Мультиплатформенность (iOS + Android) • React/JS для Frontend программиста • Native look

Page 65: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

Минусы RN• Где же идеальный компоненты навигации!? • Android (верстка) бывает грустно :( • Качество open-source компонентов из сообщества • Не всегда можно просто и легко перейти на

новый релиз • Молодая технология?

Page 66: React Native Learn once, write anywherePhoneGap Xamarin NativeScript WebView C# -> ObjC / Java JS/CSS XML/JS/ CSS? React-Native ES6+ JSX FlexBox -> Yoga Babel Polyfills ES 2015 Common

https://github.com/ovr

https://github.com/ovr/ghubber

[email protected]

https://telegram.me/ovrweb