Окружение JavaScript¶
Время выполнения JavaScript¶
При использовании React Native вы будете выполнять свой JavaScript-код в трех средах:
- В большинстве случаев React Native будет использовать Hermes, движок JavaScript с открытым исходным кодом, оптимизированный для React Native.
- Если Hermes отключен, React Native будет использовать JavaScriptCore, JavaScript-движок, на котором работает Safari. Обратите внимание, что на iOS JavaScriptCore не использует JIT из-за отсутствия записываемой исполняемой памяти в приложениях iOS.
- При использовании отладки в Chrome весь код JavaScript выполняется в самом Chrome, взаимодействуя с родным кодом через WebSockets. В качестве движка JavaScript в Chrome используется V8.
Хотя эти среды очень похожи, вы можете столкнуться с некоторыми несоответствиями. Лучше всего не полагаться на специфику какой-либо среды выполнения.
Синтаксические трансформаторы JavaScript¶
Синтаксические трансформаторы делают написание кода более приятным, позволяя вам использовать новый синтаксис JavaScript без необходимости ждать поддержки во всех интерпретаторах.
React Native поставляется с компилятором Babel JavaScript compiler. Более подробную информацию о поддерживаемых им преобразованиях можно найти в документации Babel.
Полный список поддерживаемых преобразований React Native можно найти в metro-react-native-babel-preset.
TRANSFORMATION | CODE |
---|---|
ECMAScript 5 | |
Reserved Words | promise.catch(function() {...}); |
ECMAScript 2015 (ES6) | --- |
Arrow functions | <C onPress={() => this.setState({pressed: true})} /> |
Block scoping | let greeting = 'hi'; |
Call spread | Math.max(...array); |
Classes | class C extends React.Component {render() { return <View />; }} |
Computed Properties | const key = 'abc'; const obj = {[key]: 10}; |
Constants | const answer = 42; |
Destructuring | const {isActive, style} = this.props; |
for…of | for (var num of [1, 2, 3]) {...}; |
Function Name | let number = x => x; |
Literals | const b = 0b11; const o = 0o7; const u = 'Hello\u{000A}\u{0009}!'; |
Modules | import React, {Component} from 'react'; |
Object Concise Method | const obj = {method() { return 10; }}; |
Object Short Notation | const name = 'vjeux'; const obj = {name}; |
Parameters | function test(x = 'hello', {a, b}, ...args) {} |
Rest Params | function(type, ...args) {}; |
Shorthand Properties | const o = {a, b, c}; |
Sticky Regex | const a = /o+/y; |
Template Literals | const who = 'world'; const str = \ Hello ${who}`;` |
Unicode Regex | const string = 'foo💩bar'; const match = string.match(/foo(.)bar/u); |
ECMAScript 2016 (ES7) | --- |
Exponentiation Operator | let x = 10 ** 2; |
ECMAScript 2017 (ES8) | --- |
Async Functions | async function doStuffAsync() {const foo = await doOtherStuffAsync();}; |
Function Trailing Comma | function f(a, b, c,) {}; |
ECMAScript 2018 (ES9) | --- |
Object Spread | const extended = {...obj, a: 10}; |
ECMAScript 2019 (ES10) | --- |
Optional Catch Binding | try {throw 0; } catch { doSomethingWhichDoesNotCareAboutTheValueThrown();} |
ECMAScript 2020 (ES11) | --- |
Dynamic Imports | const package = await import('package'); package.function() |
Nullish Coalescing Operator | const foo = object.foo ?? 'default'; |
Optional Chaining | const name = obj.user?.name; |
ECMAScript 2022 (ES13) | --- |
Class Fields | class Bork {static a = 'foo'; static b; x = 'bar'; y;} |
Stage 1 Proposal | --- |
Export Default From | export v from 'mod'; |
Miscellaneous | --- |
Babel Template | template( const %%importName%% = require(%%source%%);); |
Flow | function foo(x: ?number): string {}; |
ESM to CJS | export default 42; |
JSX | <View style={{color: 'red'}} /> |
Object Assign | Object.assign(a, b); |
React Display Name | const bar = createReactClass({}); |
TypeScript | function foo(x: {hello: true, target: 'react native!'}): string {}; |
Полифиллы¶
Многие стандартные функции также доступны во всех поддерживаемых средах выполнения JavaScript.
Browser
- CommonJS require
- console.{log, warn, error, info, trace, table, group, groupEnd}
- XMLHttpRequest, fetch
- {set, clear}{Timeout, Interval, Immediate}, {request, cancel}AnimationFrame
ECMAScript 2015 (ES6)
- Array.from
- Array.prototype.{find, findIndex}
- Object.assign
- String.prototype.{startsWith, endsWith, repeat, includes}
ECMAScript 2016 (ES7)
- Array.prototype.includes
ECMAScript 2017 (ES8)
Специфический
__DEV__