SlideShare a Scribd company logo
Где к ончается r eact nat i ve?
05. 06. 2017Кондратенко Павел
i am@kondratenko.me t wi t t er : @mrgustarus
RAMBLER&Co
RAMBLER&Co
Где к ончается r eact nat i ve?
05. 06. 2017Кондратенко Павел
i am@kondratenko.me t wi t t er : @mrgustarus
- Познак омлю с r eact nat i ve тех, к то не
знак ом.
RAMBLER&Co
Где к ончается r eact nat i ve?
05. 06. 2017Кондратенко Павел
i am@kondratenko.me t wi t t er : @mrgustarus
- Познак омлю с r eact nat i ve тех, к то не
знак ом.
- Поделюсь своим опытом разработк и на r eact
nat i ve.
RAMBLER&Co
Где к ончается r eact nat i ve?
05. 06. 2017Кондратенко Павел
i am@kondratenko.me t wi t t er : @mrgustarus
- Познак омлю с r eact nat i ve тех, к то не
знак ом.
- Поделюсь своим опытом разработк и на r eact
nat i ve.
- Пока жу, г де конча ют с я воз можнос т и r e a c t
na t i ve .
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
1621
Книг а
1
5
Стеллажей
2331
Книг а
1
IГлава
!П ра оптимизировать
12
Цикл жизни книги
13
Архитектура экосистемы
14
Архитектура экосистемы
15
16
IIГлава
Начинаем делать
мобильное приложение
17
Что должно уметь мобильное приложение?
18
• Авторизация через l dap.
• Профиль и связанные данные ( к ниг и) .
• Манипуляции с к ниг ами.
• Поиск к ниг по библиотек е.
• Распознавание qr и bar code через к амеру.
Как можно сделать мобильное приложение?
19
Как можно сделать мобильное приложение?
20
• Са мому на пис а т ь на яз ыке
• Andr oi d: J a va , C/ C++, Kot l i n, LUA;
• i OS: Obj e c t i ve - C, C/ C++ ( C++ - Xc ode 4+) , Swi f t ;
• Мультиплатформенные: Haxe.
Как можно сделать мобильное приложение?
21
• Са мому на пис а т ь на яз ыке
• Andr oi d: J a va , C/ C++, Kot l i n, LUA;
• i OS: Obj e c t i ve - C, C/ C++ ( C++ - Xc ode 4+) , Swi f t ;
• Мультиплатформенные: Haxe.
• Ис польз уя библиот е ки и фре ймворки
• Web vi ew: Cor dova/ PhoneGAP ( I oni c, Monaca) .
• С использованием нативных к омпонентов: React Nat i ve,
Xamar i n.
• Платформы: Met eor , Expo.
Как можно сделать мобильное приложение?
22
• Са мому на пис а т ь на яз ыке
• Andr oi d: J a va , C/ C++, Kot l i n, LUA;
• i OS: Obj e c t i ve - C, C/ C++ ( C++ - Xc ode 4+) , Swi f t ;
• Мультиплатформенные: Haxe.
• Ис польз уя библиот е ки и фре ймворки
• Web vi ew: Cor dova/ PhoneGAP ( I oni c, Monaca) .
• С использованием нативных к омпонентов: React Nat i ve,
Xamar i n.
• Платформы: Met eor , Expo.
• Собра т ь из блоков
• Иг ровые движк и: Uni t y, Unr eal Engi ne, Mar mal ade.
• Редак торы: I oni c Cr eat or , Xcode.
23
Если бы вы выбирали инструмент для мобильног о
приложения, к ак ую версию r e a c t na t i ve вы бы выбрали?
Если бы вы выбирали инструмент для мобильног о
приложения, к ак ую версию r eact nat i ve вы бы выбрали?
24
2
2
2
→
Что такое react native?
28
// . . .
class SplashScene extends Component {
// . . .
componentWillMount() {/* fe tch */данных }
render() {
return (
<View style={style.loader}>
<ActivityIndicator color="#222222"/>
</View>
);
}
onLocked(e) { /* . . . */ }
onAllowed(e) { /* . . . */ }
}
const style = styles({/* . . . */});
export default SplashScene;
→
Что такое react native?
29
// . . .
class SplashScene extends Component {/* . . .
*/}
const style = styles({
loader: {
width,
height,
flex: 1,
justifyContent: 'center',
alignItems: 'center',
position: 'absolute',
top: 0,
left: 0,
backgroundColor:
'rgba(255,255,255,0.5)'
}
});
export default SplashScene;
IIIГлава
Погружение в архитектуру
30
Что такое react native?
31
→
// . . .
class SplashScene extends Component {
// . . .
componentWillMount() {/* fe tch */данных }
render() {
return (
<View style={style.loader}>
<ActivityIndicator color="#222222"/>
</View>
);
}
onLocked(e) { /* . . . */ }
onAllowed() { /* . . . */ }
}
const style = styles({/* . . . */});
export default SplashScene;
32
// . . .
// re act-native /Librarie s/Co m po ne nts/ActivityIndicato r/ActivityIndicato r. js
const ActivityIndicator = React.createClass({
// . . .
render() {
// . . .
return (
<View /* . . . */>
<RCTActivityIndicator /* . . . *//>
</View>
);
}
});
// . . .
if (Platform.OS === 'ios') {
var RCTActivityIndicator = requireNativeComponent(‘RCTActivityIndicatorView',
ActivityIndicator, {nativeOnly: {/* . . . */}});
} else if (Platform.OS === 'android') {
var RCTActivityIndicator = requireNativeComponent(‘AndroidProgressBar',
ActivityIndicator, {nativeOnly: {/* . . . */}});
}
33
// ...
class LoginScene extends Component {
// ...
render() {
if (this.state.waiting) {
return (
<View style={style.button}>
<ActivityIndicator color={style.indicatorColor}/>
</View>
);
}
return (
<TouchableHighlight onPress={e => this.onPress(e)} /* ...
*/>
<Text style={{color: this.state.color}}>
{this.state.text}
</Text>
</TouchableHighlight>
);
}
onPress(e) {
this.setState({waiting: true});
}
}
// ...
→
// ...
class LoginScene extends Component {
// ...
render() {
if (this.state.waiting) {
return (
<View style={style.button}>
<ActivityIndicator color={style.indicatorColor}/>
</View>
);
}
return (
<TouchableHighlight onPress={e => this.onPress(e)} /* ...
*/>
<Text style={{color: this.state.color}}>
{this.state.text}
</Text>
</TouchableHighlight>
);
}
onPress(e) {
this.setState({waiting: true});
}
}
// ...
→
34
3
36
37
38
39
40
41
// ...
class LoginScene extends Component {
// ...
render() {
if (this.state.waiting) {
return (
<View style={style.button}>
<ActivityIndicator color={style.indicatorColor}/>
</View>
);
}
return (
<TouchableHighlight onPress={e => this.onPress(e)} /* ...
*/>
<Text style={{color: this.state.color}}>
{this.state.text}
</Text>
</TouchableHighlight>
);
}
onPress(e) {
this.setState({waiting: true});
}
}
// ...
→
// ...
class LoginScene extends Component {
// ...
renderContent() {
if (this.state.waiting) {
return (
<View style={style.button}>
<ActivityIndicator color={style.indicatorColor}/>
</View>
);
}
return (
<TouchableHighlight onPress={e => this.onPress(e)} /* ...
*/>
<Text style={{color: this.state.color}}>
{this.state.text}
</Text>
</TouchableHighlight>
);
}
onPress(e) {
this.setState({waiting: true});
}
}
// ...
42
'use strict';
import {AppRegistry} from 'react-native';
const Library = require('./library');
import MessageQueue from 'react-native/Libraries/BatchedBridge/MessageQueue';
MessageQueue.spy(info => console.log(info));
AppRegistry.registerComponent('library', () => Library);
4
Консоль react-native log-ios
{ type: 0,
module: 'RCTEventEmitter',
method: 'receiveTouches',
args: [
'topTouchEnd',
[{ target: 8, pageY: 289.5, locationX: 227, locationY: 23.5,
identifier: 1, pageX: 247, timestamp: 41049808.447223 }]
]
}
44
{ type: 0,
module: 'RCTEventEmitter',
method: 'receiveTouches',
args: [
'topTouchStart',
[{ target: 8, pageY: 289.5, locationX: 227, locationY: 23.5,
identifier: 1, pageX: 247, timestamp: 41048150.324917 }]
]
}
...
...
45
{ type: 0,
module: 'RCTEventEmitter',
method: 'receiveTouches',
args: [
'topTouchEnd',
[{ target: 8, pageY: 289.5, locationX: 227, locationY: 23.5,
identifier: 1, pageX: 247, timestamp: 41049808.447223 }]
]
}
{ type: 0,
module: 'RCTEventEmitter',
method: 'receiveTouches',
args: [
'topTouchStart',
[{ target: 8, pageY: 289.5, locationX: 227, locationY: 23.5,
identifier: 1, pageX: 247, timestamp: 41048150.324917 }]
]
}
...
...
{ type: 0,
module: 'RCTEventEmitter',
method: 'receiveTouches',
args: [
'topTouchEnd',
[{ target: 8, pageY: 289.5, locationX: 227, locationY: 23.5,
identifier: 1, pageX: 247, timestamp: 41049808.447223 }]
]
}
{ type: 0,
module: 'RCTEventEmitter',
method: 'receiveTouches',
args: [
'topTouchStart',
[{ target: 8, pageY: 289.5, locationX: 227, locationY: 23.5,
identifier: 1, pageX: 247, timestamp: 41048150.324917 }]
]
}
...
46
...
{ type: 1,
module: 'UIManager',
method: 'createView',
args:
[ [Getter/Setter],
[Getter/Setter],
[Getter/Setter],
[Getter/Setter] ] }
--- last message repeated 2 times ---
...
...
Stack trace обработки события touch
47
1. Перехват события платформой.
2. Создание обертк и для события t ouch: RCTTouchEvent ,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 91be5bf c861f 96175b73f e956b580a550f a0f 31a/ React / Base/ RCTTouchHandl er . m#L221 .
3. Отправк а события дальше через event Di spat cher ,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 91be5bf c861f 96175b73f e956b580a550f a0f 31a/ React / Base/ RCTTouchHandl er . m#L231 .
4. Коллек ция события и последующая отправк а события в блок е событий через br i dge в очередь поток а j s t hr ead ( RCTJSThr ead) . Ког да очередь освободится,
будет вызван f l ushEvent sQueue,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 8016d838beddc59f 698b2004b573115f e82c1408/ React / Base/ RCTEvent Di spat cher . m#L180 .
1. Ставим выполнение к ода внутри _j avaScr i pt Execut or в очередь в j s t hr ead или вызываем сразу,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 9dc7654a6c6a32649f f 57e2c8845c1cf 02434672/ React / Base/ RCTBat chedBr i dge. mm#L654 .
5. Ког да доходит очередь, вызывается cal l back f l ushEvent sQueue,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 8016d838beddc59f 698b2004b573115f e82c1408/ React / Base/ RCTEvent Di spat cher . m#L211 .
6. Все события в блок е диспатчатся через di spat chEvent ,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 8016d838beddc59f 698b2004b573115f e82c1408/ React / Base/ RCTEvent Di spat cher . m#L222 .
7. Вызывается метод RCTBr i dge br i dge. enqueuJSCal l , в к оторый передается название cal l back, к оторый будет вызван в j s t hr ead и ег о арг ументы,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 8016d838beddc59f 698b2004b573115f e82c1408/ React / Base/ RCTEvent Di spat cher . m#L202 .
8. Получение метода для cal l back, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ c68a70862168cd3df 751c5110a0062493397dc9d/ React / Base/ RCTTouchEvent . m#L75 .
1. Вызывается метод с друг ой сиг натурой, но тем же именем. В к ачестве арг ументов этот метод принимает имя модуля и метода в j s t hr ead к оторый нужно
вызвать. Эти данные получаются разбивая на две части имя метода из предыдущег о шаг а: RCTEvent Emi t t er . r ecei veTouches => modul e: RCTEvent Emi t t er ,
met hod: r ecei veTouches, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ b2f 3a65eab1b6cad5d287c4546bc1cc6b741ea9f / React / Base/ RCTBr i dge. m#L361.
9. Вызывается метод bat chedBr i dge. enqueueJSCal l ,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ b2f 3a65eab1b6cad5d287c4546bc1cc6b741ea9f / React / Base/ RCTBr i dge. m#L366.
10. Вызыввается метод r eact I nst ance- >cal l JSFunct i on к уда передается имя модуля RCTEvent Emi t t er , название метода r ecei veTouches и арг ументы метода,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ f 46eaa30cf e987cf a61d4580335bd4364d5b5707/ React / CxxBr i dge/ RCTCxxBr i dge. mm#L1002 .
11. Вызывается метод nat i veToJsBr i dge_- >cal l Funct i on( ) к уда передаются параметры cal l back,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ f 46eaa30cf e987cf a61d4580335bd4364d5b5707/ React Common/ cxxr eact / I nst ance. cpp#L123 .
12. Запрос встает в очередь и вызывается метод execut or >cal l Funct i on( ) . Здесь уже execut or напрямую зависит от платформы и используется необходимый раннер
j s, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 62210531792f d3f 07ebc0aeef a19d37ebc7da707/ React Common/ cxxr eact / Nat i veToJsBr i dge. cpp#L145 . Интерфейс
execut or имеет базовое описание этог о метода,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 34bc6bd2aec77f 730c43403c0625c74cec945e57/ React Common/ cxxr eact / Execut or . h#L75 .
13. Потом через br i dge событие попадает в RCTEvent Emi t t er . r ecei veTouches,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 6be550d85c29a6ded32dcf e1330577c202da9073/ Li br ar i es/ Render er / React Nat i veSt ack- pr od. j s#L699 .
48
IVГлава
framesПредел
49
50
51
52
5
Кирпичная стена #1
54
Ск орость и плавность работы приложения мог ут зависеть
от ск орости выполнения к ода в j s t hr ead
Кирпичная стена #1
55
Решение #1
r e que s t Ani ma t i onFr a me
→
5
// ...
class LockedScene extends Component {
// render() {}, ...
componentDidMount() {
const {colors} = this.props;
setInterval(() => {
const index = this.state.index + 1 >= colors.length
? 0 : this.state.index + 1;
this.setState({index, color: colors[index]});
}, 100);
}
onPress(e) {
let sum = 0;
for (let i = 0; i < 1000000000; i++) {
sum += 1;
}
this.setState({text: ' !'Спасибо });
}
}
// ...
5
→
// ...
class LockedScene extends Component {
// render() {}, componentDidMount(){}, ...
onPress(e) {
const limit = 1000000000;
this.process(limit, limit / 100, 0, 0, () => {
this.setState({text: ' !'Спасибо });
});
}
process(limit, batch, step, sum, callback) {
for (let i = 0; i < batch; i++) {
sum += 1;
}
if (limit - batch * (step + 1) > 0) {
return requestAnimationFrame(() =>
this.process(limit, batch, step + 1, sum, callback));
}
return callback();
}
}
// ...
Кирпичная стена #1
58
Решение #2
Конце пция We b Wor ke r
59
60
// . . .
import { Worker } from 'rn-workers';
class LockedScene extends
Component {
// re nde r() {}, . . .
componentDidMount() {
this.worker = new Worker();
this.worker.onmessage = (text) => {
this.setState({text});
};
// 1 0 0смена цвета каждые мс
// se tInte rval(() = > {. . . }, 1 0 0 );
}
onPress(e) {
this.worker.po stMe ssag e ('execute');
}
}
// . . .
import { WorkerService } from 'rn-workers'
const message = ' web worker!'Спасибо от ;
const worker = new WorkerService();
worker.onmessage = message => {
if (message === 'execute') {
let sum = 0;
for (let i = 0; i < 1000000000; i++) {
sum += 1;
}
worker.po stMe ssag e (message);
}
};
i ndex. wor ker . j sndex. i os. j s
6
6
VГлава
bridgeПредел
63
64
65
Кирпичная стена #2
66
Недостаточная ск орость общения поток ов через br i dge
Кирпичная стена #2
67
import React, { Component } from 'react';
import { requireNativeComponent } from 'react-native';
const RNSwipeable = requireNativeComponent('RNSwipeable', null);
export default class Swipeable extends Component {
render() {
return (
<RNSwipeable>
{this.props.children}
</RNSwipeable>
);
}
}
VIГлава
Предел реализации
68
69
Кирпичная стена #3
70
Отсутсвие необходимых к омпонентов
Кирпичная стена #3
71
Решение
На йт и или с де ла т ь опт има льное для ва с ре ше ние
ndex. andr oi d. j s
72
// ...
const monthNames = [“ "Января , /* ... */ " "Декабря ];
export default class extends Component {
// render() {}
async showPicker() {
try {
const {value, minimum, onPick} = this.props;
const {action, year, month, day} =
await DatePickerAndroid.open({/* ... */});
action !== DatePickerAndroid.dismissedAction
&& onPick(new Date(year, month, day));
} catch (error) {
app.reporter.trace(error);
}
}
onButtonPress() {
this.showPicker();
}
}
// ...
export default class extends Component {
render() {
const {value, minimum, onPick}
= this.props;
return (
<DatePickerIOS
mode="date"
date={value}
minimumDate={minimum}
onDateChange={onPick}/>
);
}
}
i ndex. i os. j s
VIIГлава
Заключение
73
74
- Познак омить с r eact nat i ve тех, к то не знак ом.
- Поделиться своим опытом разработк и на r eact nat i ve.
- Дать представление, г де к ончаются возможности r eact nat i ve.
75
Примечания к слайдам - #1
76
#6 - Rambl er &Co, интернет- холинг , ht t ps: / / r ambl er - co. r u.
#7 - Lent a. r u, медийный портал, ht t ps: / / l ent a. r u.
#19 - 9 Top JavaScr i pt Fr amewor ks For Mobi l e App Devel opment ,
ht t ps: / / dzone. com/ ar t i cl es/ 9- t op- j avascr i pt - f r amewor ks- f or - mobi l e- app- devel op.
- 5 Most Popul ar Fr amewor ks f or MD,
ht t ps: / / medi um. com/ @eduoshaun/ 5- most - popul ar - f r amewor ks- f or - mobi l e- devel opment - 4089f f bf 536f .
#20 - Kot l i n, st at i cal l y t yped pr ogr ammi ng l anguage, ht t p: / / kot l i nl ang. or g/ .
- Haxe, t he cr oss- pl at f or m t ool ki t , ht t p: / / haxe. or g/ .
- LUA, a l i ght wei ght mul t i - par adi gm pr ogr ammi ng l anguage, ht t p: / / www. l ua. or g/ about . ht ml .
#21 - Cor dova, mobi l e devel opment f r amewor k, ht t ps: / / cor dova. apache. or g/ docs/ en/ l at est / gui de/ over vi ew/ i ndex. ht ml .
- PhoneGAP, f r amewor k based on Cor dova, ht t p: / / phonegap. com/ .
- I oni c, sdk f or devel opi ng nat i ve and pr ogr essi ve web apps, ht t p: / / i oni cf r amewor k. com/ .
- Monaca, cr oss- pl at f or m hybr i d mobi l e app devel opment pl at f or m, ht t ps: / / monaca. i o/
- React Nat i ve, mobi l e apps wi t h r eact , ht t ps: / / f acebook. gi t hub. i o/ r eact - nat i ve/ .
- Xamar i n, cr oss- pl at f or m devel opment sof t war e, ht t ps: //www. xamari n. com/.
- Met eor , devel opment pl at f or m, a col l ect i on of l i br ar i es and packages, ht t p: / / j oshowens. me/ what - i s- met eor - j s/ .
- React nat i ve + Met eor ,
ht t ps: / / medi um. com/ handl ebar - l abs/ r eact - nat i ve- met eor - r eact - nat i ve- met eor - vs- met eor - cl i ent - bundl er - f 7597442ed0.
- Expo, pl at f or m whi ch uses React Nat i ve, expo. i o.
#22 - Uni t y 3D, мног оплатформенный иг ровой движок , ht t ps: / / uni t y3d. com/ r u/ uni t y/ .
- Unr eal Engi ne, power f ul cr eat i on engi ne, ht t ps: / / www. unr eal engi ne. com/ what - i s- unr eal - engi ne- 4.
- Mar mel ade, cr oss- pl at f or m sol ut i on f or game devel oper s, ht t p: / / docs. madewi t hmar mal ade. com/ di spl ay/ MD/ Home.
- I oni c Cr eat or , a si mpl e dr ag- &- dr op t ool f or goi ng f r om i dea t o App St or e, ht t p: / / i oni c. i o/ pr oduct s/ cr eat or .
- Xcode, I nt er f ace Bui l der , ht t ps: / / devel oper . appl e. com/ xcode/ .
#28 - Act i vi t yI ndi cat or , к омпонент индик атора ак тивности,
ht t ps: / / f acebook. gi t hub. i o/ r eact - nat i ve/ docs/ act i vi t yi ndi cat or . ht ml .
Примечания к слайдам - #2
77
#32 - Act i vi t yI ndi cat or , к омпонент индик атора ак тивности,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 0. 45- st abl e/ Li br ar i es/ Component s/ Act i vi t yI ndi cat or / Act i vi t yI ndi cat or . j s .
- r equi r eNat i veComponent , возвращает обертк у для нативног о к омпонента,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 0. 45- st abl e/ Li br ar i es/ React Nat i ve/ r equi r eNat i veComponent . j s .
- cr eat eReact Nat i veComponent Cl ass, создает обертк у для нативног о к омпонента,
ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 0. 45- st abl e/ Li br ar i es/ Render er / sr c/ r ender er s/ nat i ve/ cr eat eReact Nat i veComponent Cl
.
#36 - Cr eat e nat i ve UI component i n React Nat i ve,
ht t ps: / / medi um. com/ i bm- wat son- devel oper - cl oud/ cr eat e- nat i ve- ui - component - i n- r eact - nat i ve- 6f 4b7f e4cc95.
- React Nat i ve: I nt o a new wor l d of r api d i OS devel opment ,
ht t ps: / / www. i bm. com/ devel oper wor ks/ l i br ar y/ mo- bl uemi x- r eact - nat i ve- i os8/ i ndex. ht ml .
#38 - JavaScr i pt Cor e, ht t ps: / / devel oper . appl e. com/ r ef er ence/ j avascr i pt cor e.
#40 - Br i dgi ng i n React Nat i ve, ht t ps: / / t adeuzagal l o. com/ bl og/ r eact - nat i ve- br i dge/ .
#57 - Br eaki ng up Heavy Pr ocessi ng i n React Nat i ve,
ht t ps: / / cor bt . com/ post s/ 2015/ 12/ 22/ br eaki ng- up- heavy- pr ocessi ng- i n- r eact - nat i ve. ht ml .
#59 - Bar bar i c basi cs: web wor ker s, ht t ps: / / www. bar bar i anmeet scodi ng. com/ bl og/ 2015/ 02/ 13/ bar bar i c- basi cs- web- wor ker s/ .
#60 - Package r eact - nat i ve- wor ker s ( r eact nat i ve > v0. 41) , ht t ps: / / gi t hub. com/ f abr i ci over gal / r eact - nat i ve- wor ker s .
#65 - Per f or mance Li mi t at i ons of React Nat i ve and How t o Over come Them,
ht t ps: / / medi um. com/ @t al kol / per f or mance- l i mi t at i ons- of - r eact - nat i ve- and- how- t o- over come- t hem- 947630d7f 440.
- React Nat i ve Per f or mance — An Updat ed Exampl e,
ht t ps: / / hacker noon. com/ r eact - nat i ve- per f or mance- an- updat ed- exampl e- 6516bf de9c5c .
Используемое media
78
#1 - Fr ame by Yu l uck, ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=f r ame&i =687953.
#12 - Ti me by Ki di l adon, ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=i t %27s%20t i me&i =1015010.
#13 - Li br ar y by Cr eat i ve St al l , ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=l i br ar y&i =132522.
- Cl oud by Fl or ent , ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=Obscur i t y&i =134694.
- Super her o by Juan Pabl o Br avo, ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=good%20man&i =23556.
#17 - St ar t up Launch by Anat ol i i Babi i , ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=begi n&i =325893.
#30 - Submar i ne by H Al ber t o Gongor a, ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=submar i ne&i =747771.
#35 - Видеопроек тор, ht t p: / / nat al ex84. l i vej our nal . com/ 352356. ht ml .
#49 - Movi e by Ant on Gaj dosi k, ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=negat i ve&i =568434.
#63 - Br i dge by Cr eat i ve Mani a, ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=br i dge&i =1033647.
79
Контак ты, ссылк и по теме
и сама презентация
Адрес для любых вопросов
и предложений
i am@kondr at enko. me
Кондратенк о Павел
http://kondratenko.me/speeches/frontendconf
react native?Где кончается

More Related Content

PDF
Превышаем скоростные лимиты с Angular 2
PDF
Превышаем скоросные лимиты с Angular 2
PDF
Angular 2: Всех переиграл
PDF
Пользователь точно оценит! Повышение производительности мобильных приложений ...
PDF
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
PDF
Андрей Юткин. Media Picker — to infinity and beyond
PPT
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...
PDF
«Как перестать отлаживать асинхронные вызовы и начать жить»​
Превышаем скоростные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
Angular 2: Всех переиграл
Пользователь точно оценит! Повышение производительности мобильных приложений ...
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
Андрей Юткин. Media Picker — to infinity and beyond
JS Fest 2018. Лилия Карпенко. Особенности создания IOS / Android Mobile Apps ...
«Как перестать отлаживать асинхронные вызовы и начать жить»​

What's hot (20)

PPTX
XPath локаторы в Selenium WebDriver
PDF
Контроль качества верстки или как начать делать Makeup
PDF
Антон Веретенников и Илья Семаков. Презентация
PDF
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
PDF
Что нового в Android O (Grodno HTP)
PDF
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
PPTX
Selenium: начало работы
PDF
FPUG Dzyga presentation
PDF
Vuejs composition API
PPTX
Angular 2 vs Angular 1
PDF
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
PPTX
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
PPT
Модульное тестирование iOS-приложений.
PPTX
Владимир Тагаков. Dagger2: dependency injection in Android
PDF
Java 9: what is there beyond modularization
PPTX
Selenium vs AJAX
PPTX
MVP, Moxy. Как правильно пользоваться
PPTX
Legacy: как победить в гонке (Joker)
PDF
Toolbar (Lecture 16 – toolbar)
PDF
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
XPath локаторы в Selenium WebDriver
Контроль качества верстки или как начать делать Makeup
Антон Веретенников и Илья Семаков. Презентация
Анджей Гужовский "Riot.JS, или как приготовить современные Web Components"
Что нового в Android O (Grodno HTP)
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Selenium: начало работы
FPUG Dzyga presentation
Vuejs composition API
Angular 2 vs Angular 1
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)
Модульное тестирование iOS-приложений.
Владимир Тагаков. Dagger2: dependency injection in Android
Java 9: what is there beyond modularization
Selenium vs AJAX
MVP, Moxy. Как правильно пользоваться
Legacy: как победить в гонке (Joker)
Toolbar (Lecture 16 – toolbar)
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
Ad

Similar to Где кончается react native? / Павел Кондратенко (Rambler&Co) (20)

PPT
Sencha Complete: Kharkiv JS #1
PDF
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
PDF
Инструментируй это
PDF
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
PPTX
Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...
PDF
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
PDF
Оптимизация производительности Python
PPT
трасировка Mpi приложений
PPTX
Convert this: peculiarities of cross-platform mobile game development at Vizor
PPTX
Применение фреймворка GStreamer в системе видеонаблюдения
PPTX
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
PDF
"Как перестать отлаживать асинхронный код и начать жить", Андрей Саломатин, F...
PDF
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
PPT
Всеволод Шмыров, Яндекс
PPT
Net 3.0 & Linq
PDF
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
PPTX
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PPTX
Адаптивный веб-дизайн на практике (Антон Епрев)
PPTX
Как приручить реактивное программирование в XAML приложениях
PPTX
Node.js введение в технологию, КПИ #ITmeetingKPI
Sencha Complete: Kharkiv JS #1
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
Инструментируй это
'The best practices' by KONSTANTIN KULAKSYZ at OdessaJS'2020
Транзакционный фреймворк для сингловых игр и игр с асинхронным мультиплеером ...
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Оптимизация производительности Python
трасировка Mpi приложений
Convert this: peculiarities of cross-platform mobile game development at Vizor
Применение фреймворка GStreamer в системе видеонаблюдения
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
"Как перестать отлаживать асинхронный код и начать жить", Андрей Саломатин, F...
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Всеволод Шмыров, Яндекс
Net 3.0 & Linq
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
Адаптивный веб-дизайн на практике (Антон Епрев)
Как приручить реактивное программирование в XAML приложениях
Node.js введение в технологию, КПИ #ITmeetingKPI
Ad

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...

Где кончается react native? / Павел Кондратенко (Rambler&Co)

  • 1. Где к ончается r eact nat i ve? 05. 06. 2017Кондратенко Павел i am@kondratenko.me t wi t t er : @mrgustarus RAMBLER&Co
  • 2. RAMBLER&Co Где к ончается r eact nat i ve? 05. 06. 2017Кондратенко Павел i am@kondratenko.me t wi t t er : @mrgustarus - Познак омлю с r eact nat i ve тех, к то не знак ом.
  • 3. RAMBLER&Co Где к ончается r eact nat i ve? 05. 06. 2017Кондратенко Павел i am@kondratenko.me t wi t t er : @mrgustarus - Познак омлю с r eact nat i ve тех, к то не знак ом. - Поделюсь своим опытом разработк и на r eact nat i ve.
  • 4. RAMBLER&Co Где к ончается r eact nat i ve? 05. 06. 2017Кондратенко Павел i am@kondratenko.me t wi t t er : @mrgustarus - Познак омлю с r eact nat i ve тех, к то не знак ом. - Поделюсь своим опытом разработк и на r eact nat i ve. - Пока жу, г де конча ют с я воз можнос т и r e a c t na t i ve .
  • 11. 1
  • 16. 16
  • 18. Что должно уметь мобильное приложение? 18 • Авторизация через l dap. • Профиль и связанные данные ( к ниг и) . • Манипуляции с к ниг ами. • Поиск к ниг по библиотек е. • Распознавание qr и bar code через к амеру.
  • 19. Как можно сделать мобильное приложение? 19
  • 20. Как можно сделать мобильное приложение? 20 • Са мому на пис а т ь на яз ыке • Andr oi d: J a va , C/ C++, Kot l i n, LUA; • i OS: Obj e c t i ve - C, C/ C++ ( C++ - Xc ode 4+) , Swi f t ; • Мультиплатформенные: Haxe.
  • 21. Как можно сделать мобильное приложение? 21 • Са мому на пис а т ь на яз ыке • Andr oi d: J a va , C/ C++, Kot l i n, LUA; • i OS: Obj e c t i ve - C, C/ C++ ( C++ - Xc ode 4+) , Swi f t ; • Мультиплатформенные: Haxe. • Ис польз уя библиот е ки и фре ймворки • Web vi ew: Cor dova/ PhoneGAP ( I oni c, Monaca) . • С использованием нативных к омпонентов: React Nat i ve, Xamar i n. • Платформы: Met eor , Expo.
  • 22. Как можно сделать мобильное приложение? 22 • Са мому на пис а т ь на яз ыке • Andr oi d: J a va , C/ C++, Kot l i n, LUA; • i OS: Obj e c t i ve - C, C/ C++ ( C++ - Xc ode 4+) , Swi f t ; • Мультиплатформенные: Haxe. • Ис польз уя библиот е ки и фре ймворки • Web vi ew: Cor dova/ PhoneGAP ( I oni c, Monaca) . • С использованием нативных к омпонентов: React Nat i ve, Xamar i n. • Платформы: Met eor , Expo. • Собра т ь из блоков • Иг ровые движк и: Uni t y, Unr eal Engi ne, Mar mal ade. • Редак торы: I oni c Cr eat or , Xcode.
  • 23. 23 Если бы вы выбирали инструмент для мобильног о приложения, к ак ую версию r e a c t na t i ve вы бы выбрали?
  • 24. Если бы вы выбирали инструмент для мобильног о приложения, к ак ую версию r eact nat i ve вы бы выбрали? 24
  • 25. 2
  • 26. 2
  • 27. 2
  • 28. → Что такое react native? 28 // . . . class SplashScene extends Component { // . . . componentWillMount() {/* fe tch */данных } render() { return ( <View style={style.loader}> <ActivityIndicator color="#222222"/> </View> ); } onLocked(e) { /* . . . */ } onAllowed(e) { /* . . . */ } } const style = styles({/* . . . */}); export default SplashScene;
  • 29. → Что такое react native? 29 // . . . class SplashScene extends Component {/* . . . */} const style = styles({ loader: { width, height, flex: 1, justifyContent: 'center', alignItems: 'center', position: 'absolute', top: 0, left: 0, backgroundColor: 'rgba(255,255,255,0.5)' } }); export default SplashScene;
  • 31. Что такое react native? 31 → // . . . class SplashScene extends Component { // . . . componentWillMount() {/* fe tch */данных } render() { return ( <View style={style.loader}> <ActivityIndicator color="#222222"/> </View> ); } onLocked(e) { /* . . . */ } onAllowed() { /* . . . */ } } const style = styles({/* . . . */}); export default SplashScene;
  • 32. 32 // . . . // re act-native /Librarie s/Co m po ne nts/ActivityIndicato r/ActivityIndicato r. js const ActivityIndicator = React.createClass({ // . . . render() { // . . . return ( <View /* . . . */> <RCTActivityIndicator /* . . . *//> </View> ); } }); // . . . if (Platform.OS === 'ios') { var RCTActivityIndicator = requireNativeComponent(‘RCTActivityIndicatorView', ActivityIndicator, {nativeOnly: {/* . . . */}}); } else if (Platform.OS === 'android') { var RCTActivityIndicator = requireNativeComponent(‘AndroidProgressBar', ActivityIndicator, {nativeOnly: {/* . . . */}}); }
  • 33. 33 // ... class LoginScene extends Component { // ... render() { if (this.state.waiting) { return ( <View style={style.button}> <ActivityIndicator color={style.indicatorColor}/> </View> ); } return ( <TouchableHighlight onPress={e => this.onPress(e)} /* ... */> <Text style={{color: this.state.color}}> {this.state.text} </Text> </TouchableHighlight> ); } onPress(e) { this.setState({waiting: true}); } } // ... →
  • 34. // ... class LoginScene extends Component { // ... render() { if (this.state.waiting) { return ( <View style={style.button}> <ActivityIndicator color={style.indicatorColor}/> </View> ); } return ( <TouchableHighlight onPress={e => this.onPress(e)} /* ... */> <Text style={{color: this.state.color}}> {this.state.text} </Text> </TouchableHighlight> ); } onPress(e) { this.setState({waiting: true}); } } // ... → 34
  • 35. 3
  • 36. 36
  • 37. 37
  • 38. 38
  • 39. 39
  • 40. 40
  • 41. 41 // ... class LoginScene extends Component { // ... render() { if (this.state.waiting) { return ( <View style={style.button}> <ActivityIndicator color={style.indicatorColor}/> </View> ); } return ( <TouchableHighlight onPress={e => this.onPress(e)} /* ... */> <Text style={{color: this.state.color}}> {this.state.text} </Text> </TouchableHighlight> ); } onPress(e) { this.setState({waiting: true}); } } // ... →
  • 42. // ... class LoginScene extends Component { // ... renderContent() { if (this.state.waiting) { return ( <View style={style.button}> <ActivityIndicator color={style.indicatorColor}/> </View> ); } return ( <TouchableHighlight onPress={e => this.onPress(e)} /* ... */> <Text style={{color: this.state.color}}> {this.state.text} </Text> </TouchableHighlight> ); } onPress(e) { this.setState({waiting: true}); } } // ... 42 'use strict'; import {AppRegistry} from 'react-native'; const Library = require('./library'); import MessageQueue from 'react-native/Libraries/BatchedBridge/MessageQueue'; MessageQueue.spy(info => console.log(info)); AppRegistry.registerComponent('library', () => Library);
  • 44. { type: 0, module: 'RCTEventEmitter', method: 'receiveTouches', args: [ 'topTouchEnd', [{ target: 8, pageY: 289.5, locationX: 227, locationY: 23.5, identifier: 1, pageX: 247, timestamp: 41049808.447223 }] ] } 44 { type: 0, module: 'RCTEventEmitter', method: 'receiveTouches', args: [ 'topTouchStart', [{ target: 8, pageY: 289.5, locationX: 227, locationY: 23.5, identifier: 1, pageX: 247, timestamp: 41048150.324917 }] ] } ... ...
  • 45. 45 { type: 0, module: 'RCTEventEmitter', method: 'receiveTouches', args: [ 'topTouchEnd', [{ target: 8, pageY: 289.5, locationX: 227, locationY: 23.5, identifier: 1, pageX: 247, timestamp: 41049808.447223 }] ] } { type: 0, module: 'RCTEventEmitter', method: 'receiveTouches', args: [ 'topTouchStart', [{ target: 8, pageY: 289.5, locationX: 227, locationY: 23.5, identifier: 1, pageX: 247, timestamp: 41048150.324917 }] ] } ... ...
  • 46. { type: 0, module: 'RCTEventEmitter', method: 'receiveTouches', args: [ 'topTouchEnd', [{ target: 8, pageY: 289.5, locationX: 227, locationY: 23.5, identifier: 1, pageX: 247, timestamp: 41049808.447223 }] ] } { type: 0, module: 'RCTEventEmitter', method: 'receiveTouches', args: [ 'topTouchStart', [{ target: 8, pageY: 289.5, locationX: 227, locationY: 23.5, identifier: 1, pageX: 247, timestamp: 41048150.324917 }] ] } ... 46 ... { type: 1, module: 'UIManager', method: 'createView', args: [ [Getter/Setter], [Getter/Setter], [Getter/Setter], [Getter/Setter] ] } --- last message repeated 2 times --- ... ...
  • 47. Stack trace обработки события touch 47 1. Перехват события платформой. 2. Создание обертк и для события t ouch: RCTTouchEvent , ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 91be5bf c861f 96175b73f e956b580a550f a0f 31a/ React / Base/ RCTTouchHandl er . m#L221 . 3. Отправк а события дальше через event Di spat cher , ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 91be5bf c861f 96175b73f e956b580a550f a0f 31a/ React / Base/ RCTTouchHandl er . m#L231 . 4. Коллек ция события и последующая отправк а события в блок е событий через br i dge в очередь поток а j s t hr ead ( RCTJSThr ead) . Ког да очередь освободится, будет вызван f l ushEvent sQueue, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 8016d838beddc59f 698b2004b573115f e82c1408/ React / Base/ RCTEvent Di spat cher . m#L180 . 1. Ставим выполнение к ода внутри _j avaScr i pt Execut or в очередь в j s t hr ead или вызываем сразу, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 9dc7654a6c6a32649f f 57e2c8845c1cf 02434672/ React / Base/ RCTBat chedBr i dge. mm#L654 . 5. Ког да доходит очередь, вызывается cal l back f l ushEvent sQueue, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 8016d838beddc59f 698b2004b573115f e82c1408/ React / Base/ RCTEvent Di spat cher . m#L211 . 6. Все события в блок е диспатчатся через di spat chEvent , ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 8016d838beddc59f 698b2004b573115f e82c1408/ React / Base/ RCTEvent Di spat cher . m#L222 . 7. Вызывается метод RCTBr i dge br i dge. enqueuJSCal l , в к оторый передается название cal l back, к оторый будет вызван в j s t hr ead и ег о арг ументы, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 8016d838beddc59f 698b2004b573115f e82c1408/ React / Base/ RCTEvent Di spat cher . m#L202 . 8. Получение метода для cal l back, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ c68a70862168cd3df 751c5110a0062493397dc9d/ React / Base/ RCTTouchEvent . m#L75 . 1. Вызывается метод с друг ой сиг натурой, но тем же именем. В к ачестве арг ументов этот метод принимает имя модуля и метода в j s t hr ead к оторый нужно вызвать. Эти данные получаются разбивая на две части имя метода из предыдущег о шаг а: RCTEvent Emi t t er . r ecei veTouches => modul e: RCTEvent Emi t t er , met hod: r ecei veTouches, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ b2f 3a65eab1b6cad5d287c4546bc1cc6b741ea9f / React / Base/ RCTBr i dge. m#L361. 9. Вызывается метод bat chedBr i dge. enqueueJSCal l , ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ b2f 3a65eab1b6cad5d287c4546bc1cc6b741ea9f / React / Base/ RCTBr i dge. m#L366. 10. Вызыввается метод r eact I nst ance- >cal l JSFunct i on к уда передается имя модуля RCTEvent Emi t t er , название метода r ecei veTouches и арг ументы метода, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ f 46eaa30cf e987cf a61d4580335bd4364d5b5707/ React / CxxBr i dge/ RCTCxxBr i dge. mm#L1002 . 11. Вызывается метод nat i veToJsBr i dge_- >cal l Funct i on( ) к уда передаются параметры cal l back, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ f 46eaa30cf e987cf a61d4580335bd4364d5b5707/ React Common/ cxxr eact / I nst ance. cpp#L123 . 12. Запрос встает в очередь и вызывается метод execut or >cal l Funct i on( ) . Здесь уже execut or напрямую зависит от платформы и используется необходимый раннер j s, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 62210531792f d3f 07ebc0aeef a19d37ebc7da707/ React Common/ cxxr eact / Nat i veToJsBr i dge. cpp#L145 . Интерфейс execut or имеет базовое описание этог о метода, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 34bc6bd2aec77f 730c43403c0625c74cec945e57/ React Common/ cxxr eact / Execut or . h#L75 . 13. Потом через br i dge событие попадает в RCTEvent Emi t t er . r ecei veTouches, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 6be550d85c29a6ded32dcf e1330577c202da9073/ Li br ar i es/ Render er / React Nat i veSt ack- pr od. j s#L699 .
  • 48. 48
  • 50. 50
  • 51. 51
  • 52. 52
  • 53. 5
  • 54. Кирпичная стена #1 54 Ск орость и плавность работы приложения мог ут зависеть от ск орости выполнения к ода в j s t hr ead
  • 55. Кирпичная стена #1 55 Решение #1 r e que s t Ani ma t i onFr a me
  • 56. → 5 // ... class LockedScene extends Component { // render() {}, ... componentDidMount() { const {colors} = this.props; setInterval(() => { const index = this.state.index + 1 >= colors.length ? 0 : this.state.index + 1; this.setState({index, color: colors[index]}); }, 100); } onPress(e) { let sum = 0; for (let i = 0; i < 1000000000; i++) { sum += 1; } this.setState({text: ' !'Спасибо }); } } // ...
  • 57. 5 → // ... class LockedScene extends Component { // render() {}, componentDidMount(){}, ... onPress(e) { const limit = 1000000000; this.process(limit, limit / 100, 0, 0, () => { this.setState({text: ' !'Спасибо }); }); } process(limit, batch, step, sum, callback) { for (let i = 0; i < batch; i++) { sum += 1; } if (limit - batch * (step + 1) > 0) { return requestAnimationFrame(() => this.process(limit, batch, step + 1, sum, callback)); } return callback(); } } // ...
  • 58. Кирпичная стена #1 58 Решение #2 Конце пция We b Wor ke r
  • 59. 59
  • 60. 60 // . . . import { Worker } from 'rn-workers'; class LockedScene extends Component { // re nde r() {}, . . . componentDidMount() { this.worker = new Worker(); this.worker.onmessage = (text) => { this.setState({text}); }; // 1 0 0смена цвета каждые мс // se tInte rval(() = > {. . . }, 1 0 0 ); } onPress(e) { this.worker.po stMe ssag e ('execute'); } } // . . . import { WorkerService } from 'rn-workers' const message = ' web worker!'Спасибо от ; const worker = new WorkerService(); worker.onmessage = message => { if (message === 'execute') { let sum = 0; for (let i = 0; i < 1000000000; i++) { sum += 1; } worker.po stMe ssag e (message); } }; i ndex. wor ker . j sndex. i os. j s
  • 61. 6
  • 62. 6
  • 64. 64
  • 65. 65
  • 66. Кирпичная стена #2 66 Недостаточная ск орость общения поток ов через br i dge
  • 67. Кирпичная стена #2 67 import React, { Component } from 'react'; import { requireNativeComponent } from 'react-native'; const RNSwipeable = requireNativeComponent('RNSwipeable', null); export default class Swipeable extends Component { render() { return ( <RNSwipeable> {this.props.children} </RNSwipeable> ); } }
  • 69. 69
  • 70. Кирпичная стена #3 70 Отсутсвие необходимых к омпонентов
  • 71. Кирпичная стена #3 71 Решение На йт и или с де ла т ь опт има льное для ва с ре ше ние
  • 72. ndex. andr oi d. j s 72 // ... const monthNames = [“ "Января , /* ... */ " "Декабря ]; export default class extends Component { // render() {} async showPicker() { try { const {value, minimum, onPick} = this.props; const {action, year, month, day} = await DatePickerAndroid.open({/* ... */}); action !== DatePickerAndroid.dismissedAction && onPick(new Date(year, month, day)); } catch (error) { app.reporter.trace(error); } } onButtonPress() { this.showPicker(); } } // ... export default class extends Component { render() { const {value, minimum, onPick} = this.props; return ( <DatePickerIOS mode="date" date={value} minimumDate={minimum} onDateChange={onPick}/> ); } } i ndex. i os. j s
  • 74. 74 - Познак омить с r eact nat i ve тех, к то не знак ом. - Поделиться своим опытом разработк и на r eact nat i ve. - Дать представление, г де к ончаются возможности r eact nat i ve.
  • 75. 75
  • 76. Примечания к слайдам - #1 76 #6 - Rambl er &Co, интернет- холинг , ht t ps: / / r ambl er - co. r u. #7 - Lent a. r u, медийный портал, ht t ps: / / l ent a. r u. #19 - 9 Top JavaScr i pt Fr amewor ks For Mobi l e App Devel opment , ht t ps: / / dzone. com/ ar t i cl es/ 9- t op- j avascr i pt - f r amewor ks- f or - mobi l e- app- devel op. - 5 Most Popul ar Fr amewor ks f or MD, ht t ps: / / medi um. com/ @eduoshaun/ 5- most - popul ar - f r amewor ks- f or - mobi l e- devel opment - 4089f f bf 536f . #20 - Kot l i n, st at i cal l y t yped pr ogr ammi ng l anguage, ht t p: / / kot l i nl ang. or g/ . - Haxe, t he cr oss- pl at f or m t ool ki t , ht t p: / / haxe. or g/ . - LUA, a l i ght wei ght mul t i - par adi gm pr ogr ammi ng l anguage, ht t p: / / www. l ua. or g/ about . ht ml . #21 - Cor dova, mobi l e devel opment f r amewor k, ht t ps: / / cor dova. apache. or g/ docs/ en/ l at est / gui de/ over vi ew/ i ndex. ht ml . - PhoneGAP, f r amewor k based on Cor dova, ht t p: / / phonegap. com/ . - I oni c, sdk f or devel opi ng nat i ve and pr ogr essi ve web apps, ht t p: / / i oni cf r amewor k. com/ . - Monaca, cr oss- pl at f or m hybr i d mobi l e app devel opment pl at f or m, ht t ps: / / monaca. i o/ - React Nat i ve, mobi l e apps wi t h r eact , ht t ps: / / f acebook. gi t hub. i o/ r eact - nat i ve/ . - Xamar i n, cr oss- pl at f or m devel opment sof t war e, ht t ps: //www. xamari n. com/. - Met eor , devel opment pl at f or m, a col l ect i on of l i br ar i es and packages, ht t p: / / j oshowens. me/ what - i s- met eor - j s/ . - React nat i ve + Met eor , ht t ps: / / medi um. com/ handl ebar - l abs/ r eact - nat i ve- met eor - r eact - nat i ve- met eor - vs- met eor - cl i ent - bundl er - f 7597442ed0. - Expo, pl at f or m whi ch uses React Nat i ve, expo. i o. #22 - Uni t y 3D, мног оплатформенный иг ровой движок , ht t ps: / / uni t y3d. com/ r u/ uni t y/ . - Unr eal Engi ne, power f ul cr eat i on engi ne, ht t ps: / / www. unr eal engi ne. com/ what - i s- unr eal - engi ne- 4. - Mar mel ade, cr oss- pl at f or m sol ut i on f or game devel oper s, ht t p: / / docs. madewi t hmar mal ade. com/ di spl ay/ MD/ Home. - I oni c Cr eat or , a si mpl e dr ag- &- dr op t ool f or goi ng f r om i dea t o App St or e, ht t p: / / i oni c. i o/ pr oduct s/ cr eat or . - Xcode, I nt er f ace Bui l der , ht t ps: / / devel oper . appl e. com/ xcode/ . #28 - Act i vi t yI ndi cat or , к омпонент индик атора ак тивности, ht t ps: / / f acebook. gi t hub. i o/ r eact - nat i ve/ docs/ act i vi t yi ndi cat or . ht ml .
  • 77. Примечания к слайдам - #2 77 #32 - Act i vi t yI ndi cat or , к омпонент индик атора ак тивности, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 0. 45- st abl e/ Li br ar i es/ Component s/ Act i vi t yI ndi cat or / Act i vi t yI ndi cat or . j s . - r equi r eNat i veComponent , возвращает обертк у для нативног о к омпонента, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 0. 45- st abl e/ Li br ar i es/ React Nat i ve/ r equi r eNat i veComponent . j s . - cr eat eReact Nat i veComponent Cl ass, создает обертк у для нативног о к омпонента, ht t ps: / / gi t hub. com/ f acebook/ r eact - nat i ve/ bl ob/ 0. 45- st abl e/ Li br ar i es/ Render er / sr c/ r ender er s/ nat i ve/ cr eat eReact Nat i veComponent Cl . #36 - Cr eat e nat i ve UI component i n React Nat i ve, ht t ps: / / medi um. com/ i bm- wat son- devel oper - cl oud/ cr eat e- nat i ve- ui - component - i n- r eact - nat i ve- 6f 4b7f e4cc95. - React Nat i ve: I nt o a new wor l d of r api d i OS devel opment , ht t ps: / / www. i bm. com/ devel oper wor ks/ l i br ar y/ mo- bl uemi x- r eact - nat i ve- i os8/ i ndex. ht ml . #38 - JavaScr i pt Cor e, ht t ps: / / devel oper . appl e. com/ r ef er ence/ j avascr i pt cor e. #40 - Br i dgi ng i n React Nat i ve, ht t ps: / / t adeuzagal l o. com/ bl og/ r eact - nat i ve- br i dge/ . #57 - Br eaki ng up Heavy Pr ocessi ng i n React Nat i ve, ht t ps: / / cor bt . com/ post s/ 2015/ 12/ 22/ br eaki ng- up- heavy- pr ocessi ng- i n- r eact - nat i ve. ht ml . #59 - Bar bar i c basi cs: web wor ker s, ht t ps: / / www. bar bar i anmeet scodi ng. com/ bl og/ 2015/ 02/ 13/ bar bar i c- basi cs- web- wor ker s/ . #60 - Package r eact - nat i ve- wor ker s ( r eact nat i ve > v0. 41) , ht t ps: / / gi t hub. com/ f abr i ci over gal / r eact - nat i ve- wor ker s . #65 - Per f or mance Li mi t at i ons of React Nat i ve and How t o Over come Them, ht t ps: / / medi um. com/ @t al kol / per f or mance- l i mi t at i ons- of - r eact - nat i ve- and- how- t o- over come- t hem- 947630d7f 440. - React Nat i ve Per f or mance — An Updat ed Exampl e, ht t ps: / / hacker noon. com/ r eact - nat i ve- per f or mance- an- updat ed- exampl e- 6516bf de9c5c .
  • 78. Используемое media 78 #1 - Fr ame by Yu l uck, ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=f r ame&i =687953. #12 - Ti me by Ki di l adon, ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=i t %27s%20t i me&i =1015010. #13 - Li br ar y by Cr eat i ve St al l , ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=l i br ar y&i =132522. - Cl oud by Fl or ent , ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=Obscur i t y&i =134694. - Super her o by Juan Pabl o Br avo, ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=good%20man&i =23556. #17 - St ar t up Launch by Anat ol i i Babi i , ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=begi n&i =325893. #30 - Submar i ne by H Al ber t o Gongor a, ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=submar i ne&i =747771. #35 - Видеопроек тор, ht t p: / / nat al ex84. l i vej our nal . com/ 352356. ht ml . #49 - Movi e by Ant on Gaj dosi k, ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=negat i ve&i =568434. #63 - Br i dge by Cr eat i ve Mani a, ht t ps: / / t henounpr oj ect . com/ sear ch/ ?q=br i dge&i =1033647.
  • 79. 79 Контак ты, ссылк и по теме и сама презентация Адрес для любых вопросов и предложений i am@kondr at enko. me Кондратенк о Павел http://kondratenko.me/speeches/frontendconf react native?Где кончается

Editor's Notes

  • #2: Привет! Меня зовут Паша. Мой доклад называется “Где кончается react native”.
  • #3: В своем докладе я постараюсь познакомить с этой технологией тех, кто не знаком.
  • #4: Поделюсь опытом разработки на react native.
  • #5: И покажу вам где кончаются возможности react native - это основная цель моего доклада. Но, для начала, представлюсь
  • #6: Кто такой Это я. И эта фотка намекает, что я люблю катать, горы и вообще снежок.
  • #7: Где работаю Несмотря на то, что отдыхать всегда приятно (за исключением подсчета суммы, которую потратил на отдых), я люблю работать вот тут. Это такой большой холдинг, куда входят проекты motor.ru, afisha.ru, championat.com, livejournal.ru и другие. Кстати, вы наверняка не заметили голубую звездочку вверху экрана. Для каждого слайда, на котором вы видите эту звездочку в правом верхнем углу, есть ссылка на дополнительный материал в конце презентации. Так что обязательно скачайте ее (я дам вам ссылку в конце), и сможете погрузиться еще глубже в тему. Дополнительный материал Rambler&amp;Co, интернет-холинг, https://rambler-co.ru.
  • #8: Чем занимаюсь В частности, в этот холдинг входит медиа портал lenta.ru, на котором я отвечаю за frontend. Раньше я еще и код там писал, но примерно пол года как я перестал этим заниматься и теперь просто отвечаю за frontend, который пишут мои коллеги. Также в моей зоне ответсвенности два проекта на node.js и админка на react.js, однако, это не значит что я стал меньше руками делать! Так вот, вернувшись из одной из своих поездок отдохнувшим и в хорошем расположении духа, я вернулся к работе и реализации своих идей. Дополнительный материал Lenta.ru, медийный портал, https://lenta.ru.
  • #9: Про библиотеку и ее статистика И, по счастливому совпадению, нашлась идея которая интересна мне и, в то же время, решает проблему внутри нашей компании. Наши сотрудники любят читать книги и наш босс тоже. В итоге у нас есть собственная библиотека, которую пополняют добрые люди своими личными книгами. И это один из стеллажей нашей библиотеки.
  • #10: Про библиотеку и ее статистика На момент, когда я сделал эту фотографию, на нем стояла 1621 книга.
  • #11: Про библиотеку и ее статистика А всего у нас пять стеллажей: этот самый большой и еще четыре поменьше. И это только официально зарегистрированных в нашем государстве… ой, системе. В сумме они хранят в себе 2331 книгу.
  • #12: Проблематика И все это оперировалось через вот такую тетрадку: взял книгу -&amp;gt; записал себя -&amp;gt; вернул -&amp;gt; отметился… 2331 книга… 2017 год… Тетрадка и ручка… Что?!?!
  • #13: Проблематика И вот, настало время оптимизировать это!
  • #14: Цикл жизни книги Начал я с самого простого. Так как библиотека - это книги, то первым делом я сделал “цикл жизни книги” в нашей библиотеке, который проходит каждая книга: начиная от человека, который ее пожертвовал нам, и заканчивая неизвестностью в виде облачка (когда книга потерялась или была испорчена).
  • #15: Архитектура будущей системы Было много вариантов архитектуры и на момент, когда я начал кодить, уже был прототип веб интерфейса. В итоге было решено превратить это все вот в такую экосистему: с веб-интерфейсом, мобильным приложением и api, которые будут представлением оффлайн библиотеки.
  • #16: Архитектура будущей системы Мобильное приложение? Зачем? Как? И, кажется, я не упоминал что я мобильный разработчик? Каждый узел интересен в своей реализации и про всю экосистему в целом можно рассказывать очень долго, но…
  • #17: Цель выступления … сейчас я перед вами стою, чтобы поделиться своим опытом разработки на react native, рассказать, что можно выжать из этой технологии, где заканчиваются ее возможности и все это основываясь на моем опыте и опыте других разработчиков, в частности, на примере рамблер библиотеки. Вопросы в зал - Кто знаком с этой технологией? - Кто написал хотя бы одну строчку кода с этой технологией?
  • #18: Архитектура приложения Глава I. Начинаем делать мобильное приложение. После всех этих исследований нужно было начать делать мобильное приложение, чего я ни разу не делал до того момента и всегда думал, что это ужасно трудно. Вопросы в зал - Кто написал хоть одно приложение (для домашнего использования тоже учитывается и не важно какая технология)?
  • #19: Архитектура приложения Начну с того, что нам нужно было от мобильного приложения. Я хотел, чтобы это был некоторый помощник с помощью которого можно было бы найти понравившуюся книгу, быстро записать ее на себя и сдать ее. Причем, это приложение, должно иметь и административный функционал вроде регистрации новых книг. В общем, это самый минимальный набор функционала упрощающий жизнь пользователей и администраторов. Затем настало время выбрать технологии, с использованием которых, я буду это делать.
  • #20: Обзор методов разработки Вопросы в зал - Кто написал хоть одно приложение на не нативных технологиях? - Кто написал хоть одно приложение которое есть в магазинах? - Какие есть способы и технологии делать мобильное приложение? Если будут отвечать хорошо, можно сказать следующее: В принципе, я мог бы и пропустить следующие три слайда, так как вы все рассказали, но так у вас останется больше времени в конце, чтобы задавать мне неудобные вопросы, так что, все же, покажу их. Дополнительный материал - 9 Top JavaScript Frameworks For Mobile App Development, https://dzone.com/articles/9-top-javascript-frameworks-for-mobile-app-develop. - 5 Most Popular Frameworks for MD, https://medium.com/@eduoshaun/5-most-popular-frameworks-for-mobile-development-4089ffbf536f.
  • #21: Обзор методов разработки Первый вариант: написать используя только язык программирования. Здесь я выделил некоторые платформы и языки. Да, в настоящем времени из-за наличия кучи компиляторов можно писать на чем угодно, но основным языком под android задумывался java, а под ios: Objective-C. А такой как haxe изначально задумывался как мультиплатформенный язык программирования. Дополнительный материал - Kotlin, statically typed programming language, http://kotlinlang.org/. - Haxe, the cross-platform toolkit, http://haxe.org/. - LUA, a lightweight multi-paradigm programming language, http://www.lua.org/about.html.
  • #22: Обзор методов разработки Дальше можно использовать библиотеки и фреймворки. Например: PhoneGAP, Monaca - преобразуют CSS, HTML и JavaScript в код, который любая платформа воспринимает как элемент web (web view, насколько я знаю, их еще называют hybrid app). Есть фреймворки, которые используют нативные компоненты вроде Xamarin. Также есть платформы, с помощью которых можно разрабатывать изоморфные приложения, которые также можно собрать под desktop. Дополнительный материал - Cordova, mobile development framework, https://cordova.apache.org/docs/en/latest/guide/overview/index.html. - PhoneGAP, framework based on Cordova, http://phonegap.com/. - Ionic, sdk for developing native and progressive web apps, http://ionicframework.com/. - Monaca, cross-platform hybrid mobile app development platform, https://monaca.io/. - React Native, mobile apps with react, https://facebook.github.io/react-native/. - Xamarin, cross-platform development software, https://www.xamarin.com/. - Meteor, development platform, a collection of libraries and packages, http://joshowens.me/what-is-meteor-js/. - React native + Meteor, https://medium.com/handlebar-labs/react-native-meteor-react-native-meteor-vs-meteor-client-bundler-f7597442ed0. - Expo, platform which uses React Native, expo.io.
  • #23: Обзор методов разработки Последний способ в моем списке: собрать из блоков используя игровой движок вроде Unity 3D или редактора Ionic Creator. Дополнительный материал - Unity 3D, многоплатформенный игровой движок, https://unity3d.com/ru/unity/. - Unreal Engine, powerful creation engine, https://www.unrealengine.com/what-is-unreal-engine-4. - Marmelade, cross-platform solution for game developers, http://docs.madewithmarmalade.com/display/MD/Home. - Ionic Creator, a simple drag-&amp;-drop tool for going from idea to App Store, http://ionic.io/products/creator. - Xcode, Interface Builder, https://developer.apple.com/xcode/.
  • #24: Выбор и аргументация выбора Среди всего этого многообразия я выбрал то, что ближе всего лежало к душе…
  • #25: Выбор и аргументация выбора На самом деле я выбрал react native изначально потому что этот проект был отличным шансом попробовать эту технологию. К тому же, я давно хотел попробовать сделать мобильное приложение, но немного страшился этого, а тут такая возможность!
  • #26: Что такое react native? React native - это инструмент и библиотека компонентов, таких как модальные окна, картинки, кнопки, индикаторы, поля для ввода и так далее: эти компоненты можно брать и использовать.
  • #27: Что такое react native? Причем все эти компоненты можно пощупать прямо в браузере.
  • #28: Что такое react native? С точки зрения структуры проекта react native выглядит так: есть две точки входа: index.ios.js и index.android.js. Также есть папочки android и ios, где хранится код для каждой из платформ.
  • #29: Что такое react native? React native позволяет создавать мобильные приложения, используя те самые декларативные компоненты про которые я говорил и имеет тот же дизайн, что и react. Например, у нас в мобильном приложении должна быть авторизация, чтобы пользователи могли как минимум увидеть книги в своем профиле. И, при этом, в зависимости от того, авторизован пользователь или нет, мы должны показать ему определенный экран: форму авторизации или домашнюю страницу. Это реализация первого экрана, который видит пользователь при запуске приложения после splash screen. Компоненты View и ActivityIndecator идут из коробки react native. Дополнительный материал - ActivityIndicator, компонент индикатора активности, https://facebook.github.io/react-native/docs/activityindicator.html.
  • #30: Что такое react native? Еще react native это css in js: стили, которые пишутся в js. К этому привыкаешь и, если вы действительно хотите сделать приложение, то для вас это не будет проблемой.
  • #31: Как устроены компоненты в react native Помните предыдущий слайд, где я показал пример реализации простой сцены?
  • #32: Как устроены компоненты в react native Здесь внимания заслуживает activity indicator. Для того, чтобы понять где кончается react native, я предлагаю посмотреть как react native устроен в глубине и для начала погрузиться в этот простой компонент.
  • #33: Как устроены компоненты в react native Это код компонента activity indicator в репозитарии react native. Я оставил только то, что заслуживает внимания. В render используется компонент RCTActivityIndicator., который, в свою очередь, представляет собой интерфейс для работы с нативным компонентом. requireNativeComponent возвращает обертку в виде React компонента для нативного компонента платформы. В качестве первого аргумента он принимает название представления, которое используется для той или иной платформы. Вторым аргументом передается интерфейс компонента. Ну и экстра опции третьим аргументом. Это мы погрузились только на один шаг. Давайте пойдем еще дальше, но, чтобы было интереснее, возьмем компонент посложнее… Дополнительный материал - ActivityIndicator, компонент индикатора активности, https://github.com/facebook/react-native/blob/0.45-stable/Libraries/Components/ActivityIndicator/ActivityIndicator.js. - requireNativeComponent, возвращает обертку для нативного компонента, https://github.com/facebook/react-native/blob/0.45-stable/Libraries/ReactNative/requireNativeComponent.js. - createReactNativeComponentClass, создает обертку для нативного компонента, https://github.com/facebook/react-native/blob/0.45-stable/Libraries/Renderer/src/renderers/native/createReactNativeComponentClass.js.
  • #34: Как устроены компоненты в react native Кнопка с обратной связью! Это изолированная часть реальной формы авторизации в нашем приложении. TouchableHightlight и Text - компоненты из коробки.
  • #35: Как устроены компоненты в react native У кнопок такого типа есть обработка событий. Это было бы просто понять, если бы это был phonegap или простая вкладка в браузере. Но как же это работает в production билде, когда наше приложение ставит себе обычный пользователь? Как вообще устроен react native внутри? Где там нативные компоненты, а где js?
  • #36: Архитектура react native Помните как работает эта штука? Весь фильм - это одна большая пленка из множества кадров и каждый кадр показывается какую-то долю секунды на экране и так создается иллюзия “подвижной картинки”. Именно иллюзия. Так вот, представьте теперь, что ваше мобильное приложение - это проектор, который рисует на экране у пользователя кадры, один за другим. И за то, чтобы нарисовать кадр в react native, отвечают, если упрощенно, …
  • #37: Архитектура react native … три потока. Ну вообще два потока, третий не совсем поток. Дополнительный материал - Create native UI component in React Native, https://medium.com/ibm-watson-developer-cloud/create-native-ui-component-in-react-native-6f4b7fe4cc95. - React Native: Into a new world of rapid iOS development, https://www.ibm.com/developerworks/library/mo-bluemix-react-native-ios8/index.html.
  • #38: Архитектура react native Первый поток (он же основной) - отрисовывает кадры результата выполнения следующих двух потоков. Здесь рисуются нативные компоненты, выполняется нативный код и перехватываются touch events на экране. В общем, это поток для ui.
  • #39: Архитектура react native Второй - JS Thread. Это где выполняется js код вашего приложения, выполняются вызовы к api компонентов, обрабатываются touch event, в общем весь код, написанный вами на js в рамках react native проекта. Дополнительный материал - JavaScript Core, https://developer.apple.com/reference/javascriptcore.
  • #40: Архитектура react native Shadow thread вычисляет размеры и позицию каждого ui элемента на экране.
  • #41: Архитектура react native Реализация компонента делится на две части: - Представление компонента, которое возвращает представление для отрисовки в main thread. Представление компонента также отправляет события в js thread через bridge созданный через react native. Проще говоря, это native компоненты. - Интерфейс компонента, который используется в js thread для управления компонентом. И две этих части общаются между собой через bridge. Обновления для нативных представлений группируются и отправляются из js в нативные компоненты в конце каждой итерации event loop, прежде чем кадр “умрет”. Это канал, по которому передаются сообщения между main thread и js thread. Давайте посмотрим как он работает, чтобы у вас было полное представление об архитектуре. Дополнительный материал - Bridging in React Native, https://tadeuzagallo.com/blog/react-native-bridge/.
  • #42: Архитектура react native На примере компонента кнопки TouchableHighlight. Вот у нас есть кнопочка, у которой есть callback onPress. Давайте попробуем нажать на нее и проследить путь от клика до изменения state в react native компоненте. Грубо говоря, отследить сообщение, которое передается через bridge.
  • #43: Архитектура react native Для этого можно в index файле вашего проекта прописать такой код. Теперь, все сообщения, падающие в bridge, будут выводиться в консоль. Раньше это было доступно через переменную, которую нужно было хардкодить в коде react native, но, недавно, это стало доступно с помощью подписки на событие.
  • #44: Архитектура react native Попробуем кликнуть и посмотреть что произойдет. Справа - это запущенный эмулятор в xcode, а слева - окно консоли. Я нажал на кнопку, подержал и спустя секунду отпустил. В консоль упало несколько событий, вплоть до финального запроса на отрисовку индикатора, но давайте взглянем на события детальнее.
  • #45: Архитектура react native В частности, на эти два события. Первое - touch start, второе - touch end. Эти события прилетели в js из native компонента. Как понять что они прилетели именно из native компонентов а не из js?
  • #46: Архитектура react native Type. Если значение этого свойства равно нулю - событие прилетело в js из native компонента. Если единица - событие прилетело в native компонент из js.
  • #47: Архитектура react native Как, например, последнее событие: оно говорит о том, что был отправлен запрос на создание компонента view в main thread. В нашем случае это activity indicator, нарисованный внутри обертки. На данном этапе создается два view компонента (контейнер индикатора и сам индикатор) и, поэтому, в консоли написано, что сообщение этого типа повторилось два раза. Вообще я тут пытался построить stack trace пути сообщения начиная с перехвата события и заканчивая вызовом коллбека onPress… И, кому интересно, может погрузиться в это еще глубже…
  • #48: Архитектура react native Вот на этом слайде :) И это только до момента, когда событие прилетает в js. Это как перехватывается событие из native компонентов. Если интересно, можете скачать презентацию и посмотреть этот слайд детальнее.
  • #49: Архитектура react native Вот примерно так и работает связь между потоками.
  • #50: Предел скорости интерфейса Вся эта система thread’ов имеет свои ограничения, например скорость интерфейса.
  • #51: Предел скорости интерфейса Как ни странно, основные проблемы могут возникнуть вот тут: ios дает отображать 60 кадров в секунду, что дает 16.67ms для того, чтобы сделать всю работу по генерации статичной картинки (фрейма). Если ваш js выполняет какую-то большую работу в одном цикле, то это повесит отрисовку интерфейса на весь период выполнения работы. Например, если вы обновляете state root компонента большого приложения, то это может занять больше времени, чем нужно. И все анимации под управлением js повиснут на период выполнения этого кода.
  • #52: Предел скорости интерфейса Позвольте подкрепить мои слова. Это домашний экран одной из версий нашего приложения с кнопками управления. Вопросы в зал: - Заметили что-нибудь? Помимо странного интерфейса и отсутствия картинки для первой книги в списке :)
  • #53: Предел скорости интерфейса Все верно! Залипание. Это как раз тот случай, когда новый frame собирается слишком долго в потоке js thread. Там, помимо получения данных еще и отрисовка списка элементов из около пятидесяти штук. И данные успеют прилететь еще до завершения анимации перехода между сценами и начинают обрисовываться в списке.
  • #54: Предел скорости интерфейса На сайте react native даже есть упоминание про эту проблему. Список книг инициализируется в ListView и эта первоначальная инициализация не быстра. Но эта проблема решена около трех месяцев назад. Надо бы переехать на эти новые списки…
  • #55: Предел скорости интерфейса Так что, кирпичная стена номер 1 говорит нам, что весь js, который написан внутри ваших компонентов, может повлиять на работу приложения. Так что: тут нужно стараться оптимизировать выполнение js и делать большие операции почти незаметными для пользователя.
  • #56: Предел скорости интерфейса Первым подходом будет использование reacstAnimationFrame.
  • #57: Предел скорости интерфейса Например, возьмем код уже знакомой сцены и добавим туда какую-то долгую операцию (1млрд операций). А еще сделаем так, чтобы цвет текста на кнопке постоянно менялся с интервалом в сто миллисекунд. А еще изменим цвет фона кнопки при клике для наглядности. Если помните, цвет кнопки и ее текст у нас берутся из state сцены. Видите, у нас зависает кнопка и вообще ничего не происходит, хотя я кликнул и сразу отпустил! В общем, как если бы вы эту логику делали в браузере. Нужно учесть, что любые другие события пришедшие от native компонентов в js не будут обработаны, потому что js thread занят выполнением сложного участка кода.
  • #58: Предел скорости интерфейса Одна из возможностей избежать таких проблем - использовать метод requestAnimationFrame, который позволяет выполнять всю процедуру батчами. Так я разбил большую операцию на маленькие батчи и выполняю их поочередно - выполнил операцию, запросил отрисовку фрейма, выполнил, запросил и так пока не закончатся батчи. Дополнительный материал - Breaking up Heavy Processing in React Native, https://corbt.com/posts/2015/12/22/breaking-up-heavy-processing-in-react-native.html.
  • #59: Предел скорости интерфейса Следующее решение пришло из веба из технологии web workers. Только в мобильной разработке такого понятия нет :( Вопрос в зал: Кто знает что такое web worker?
  • #60: Предел скорости интерфейса Для тех, кто не добрался еще до этой технологи, скажу. Веб воркеры это такая штука, которая может взять на себя часть сложной работы в js и выполнять ее в фоне не мешая выполнению вашего приложения в браузере. Дополнительный материал - Barbaric basics: web workers, https://www.barbarianmeetscoding.com/blog/2015/02/13/barbaric-basics-web-workers/.
  • #61: Предел скорости интерфейса Я нашел несколько пакетов, но самым рабочим из них был rn-workers. Чтобы он завелся нужно, даже не пришлось никаких дополнительных действий делать: подключить, слинковать через react-native link и готово. Я стер код, не относящийся к делу, и оставил только то, что пришлось написать, чтобы завелась эта штука. Здесь это все работает чуточку хитрее чем в вебе: внутри rn-workers есть native модуль который создает новый thread для выполнения js и, все, что внутри index.worker.js, будет выполняться в этом новом thread. Про native module я расскажу чуть позже, а пока скажу что это код написанный на языке платформы и который выполняется в main thread. Давайте посмотрим как это работает. Дополнительный материал - Package react-native-workers (react native &amp;gt; v0.41), https://github.com/fabriciovergal/react-native-workers.
  • #62: Предел скорости интерфейса Тот же самый пример с кнопкой. Запускаем и находим все потоки отвечающие за выполнение js созданные из react native. Тут таких одна штука. И пробуем нажать кнопку один раз… А потом много раз. На графике сверху видно когда пошла работа. И js thread сразу виснет и нельзя ничего поделать! А теперь давайте попробуем запустить модифицированный код, уже с подключением пакета react native workers. Подключаем пакет, прописываем в js нужный код и запускаем.
  • #63: Предел скорости интерфейса Ву-а-ля! В итоге мы имеем два потока, одну кнопку и не зависающий js, который продолжает свою работу! На этом хаки для этой стены закончались. Давайте дальше.
  • #64: Предел bridge Вообще все проблемы это не проблемы, а просто рамки за которые выходить нельзя. Но есть хаки, которые позволяют обойти эти ограничения. Так же и здесь: bridge, это инструмент, по которому события передаются между двумя основными потоками. Какие здесь могут быть ограничения? Как это можно обойти?
  • #65: Предел bridge Но, в основе своей, каждый thread сам по себе производителен и быстр, но вот связь между ними оставляет желать лучшего и для того, чтобы воспользоваться возможностями по максимуму, нужно стараться минимизировать количество сообщений, которые передаются через этот bridge. Например, есть возможность перенести свой компонент из js в native компонент, который будет выполняться в main thread без потери производительности. Но, для этого нужно подучить другие языки помимо js, например, objective c.
  • #66: Предел bridge Есть отличная статья, в которой рассматривается этот момент. Там анимация свайпа работает через bridge. То есть вся логика реализована на js (изменение позиции, обработка события и изменение прозрачности), и события передаются через bridge между native компонентами и js логикой. Из-за этого становиться заметно, когда свайпишь элемент: сообщению события свайп нужно сначала дойти до js, потом сообщение об изменении позиции и прозрачности должно дойти до native компонента и так пока вы двигаете элемент. Дополнительный материал - Performance Limitations of React Native and How to Overcome Them, https://medium.com/@talkol/performance-limitations-of-react-native-and-how-to-overcome-them-947630d7f440. - React Native Performance — An Updated Example, https://hackernoon.com/react-native-performance-an-updated-example-6516bfde9c5c.
  • #67: Предел bridge Из этого вытекает третья кирпичная стена - если вы хотите, чтобы приложение работало быстро, нужно минимизировать обращения к bridge.
  • #68: Предел bridge В частности, автор сделал native модуль и просто оборачивает свои элементы в этот интерфейс для native модуля. Выглядит это примерно так. Получается, что вся логика теперь реализована с помощью native модуля на objective c и выполняется на стороне native компонентов в main thread. И вот тут вам уже понадобится мобильный разработчик, который может реализовывать нативные компоненты, а вы их будете подключать в своем проекте. Или же можете сделать это сами. То есть автор освободил bridge от сообщений и вся логика работает без задержек. В таком случае будет только одно событие: callback, который сообщит о завершении swipe.
  • #69: Предел реализации Тут все просто: так как платформы две и у каждой свой интерфейс работы с компонентами - каких-то компонентов просто может не быть. Так что, если нет какой-то стандартной реализации, нужно повертеть.
  • #70: Предел реализации Что я имею ввиду? Вот пикер даты. В android и в ios я не нашел общего решения и пришлось объединять два разных варианта, чтобы у них был общий интерфейс. Благо, мне было не принципиально такое различие и в react native это можно сделать изи.
  • #71: Предел реализации Из этого вытекает последняя кирпичная стена: некоторых необходимых компонентов может не быть, или они есть, но в каждой платформе кардинально различаются и не объединены в один интерфейс.
  • #72: Предел реализации В моем случае я просто нашел компромис и сделал это так.
  • #73: Предел реализации Можете особо не вдаваться в код, суть в том, что у меня есть два разных файла: index.android.js и index.ios.js. Мне просто нужно написать require(‘index.js’), а react-native сам решит какой файл нужен в зависимости от того, под какую платформу сейчас идет сборка. Для меня было не принципиально, что интерфейсы различаются на двух платформах и это решение мне отлично подошло, тем более, что интерфейс компонента в коде один для двух платформ и if мне не нужен.
  • #74: Заключение Если останется время У нас еще есть пара минуток и, если хотите, я бы мог показать как это все работает прежде чем заканчивать свое выступление. Если времени не останется Я подошел к последним слайдам и хотел бы резюмировать свое выступление.
  • #75: В своей презентации я хотел познакомить с react native тех, кто не знаком, поделиться своим опытом разработки, но, основное, это показать, где кончаются возможность react native и что можно с этим делать.
  • #76: Это все.
  • #77: Здесь у меня есть куча ссылок из презентации, так что не забудьте скачать ее или перейти по ссылке которую я вам сейчас покажу.
  • #78: Это еще ссыкли.
  • #79: Здесь я дал ссылки на используемые иконки и картинки.
  • #80: Мои контакты и ссылку на страницу с дополнительным материалом и самой презентацией вы можете найти тут. Спасибо за то, что слушали! Надеюсь, я был полезен!