メインコンテンツへスキップ

JavaScript環境

JavaScript ランタイム

React Native を使用する場合、最大 3 つの環境で JavaScript コードを実行することになります。

  • ほとんどの場合、React Native は React Native 向けに最適化されたオープンソースの JavaScript エンジンであるHermesを使用します。
  • Hermes が無効になっている場合、React Native は Safari に搭載されている JavaScript エンジンであるJavaScriptCoreを使用します。iOS では、iOS アプリに書き込み可能な実行可能メモリがないため、JavaScriptCore は JIT を使用しないことに注意してください。
  • Chrome デバッグを使用する場合、すべての JavaScript コードは Chrome 自体の中で実行され、WebSocket を介してネイティブ コードと通信します。Chrome は JavaScript エンジンとしてV8を使用しています。

これらの環境は非常に似ていますが、いくつかの不整合に遭遇する可能性があります。特定のランタイムに依存することは避けるのが最善です。

JavaScript 構文トランスフォーマー

構文トランスフォーマーを使用すると、すべてのインタプリタがサポートするのを待つことなく新しい JavaScript 構文を使用できるため、コードの記述がより楽しくなります。

React Native にはBabel JavaScript コンパイラが同梱されています。サポートされている変換の詳細については、Babel ドキュメントを確認してください。

React Native で有効になっている変換の全リストは、@react-native/babel-presetにあります。

変換コード
ECMAScript 5
予約語
promise.catch(function() {...});
ECMAScript 2015 (ES6)
アロー関数
<C onPress={() => this.setState({pressed: true})} />
ブロックスコープ
let greeting = 'hi';
コールスプレッド
Math.max(...array);
クラス
class C extends React.Component {render() { return <View />; }}
計算プロパティ
const key = 'abc'; const obj = {[key]: 10};
定数
const answer = 42;
分割代入
const {isActive, style} = this.props;
for…of
for (var num of [1, 2, 3]) {...};
関数名
let number = x => x;
リテラル
const b = 0b11; const o = 0o7; const u = 'Hello\u{000A}\u{0009}!';
モジュール
import React, {Component} from 'react';
オブジェクトの簡潔なメソッド
const obj = {method() { return 10; }};
オブジェクトの省略記法
const name = 'vjeux'; const obj = {name};
パラメータ
function test(x = 'hello', {a, b}, ...args) {}
レストパラメータ
function(type, ...args) {};
短縮プロパティ
const o = {a, b, c};
スティッキー正規表現
const a = /o+/y;
テンプレートリテラル
const who = 'world'; const str = `Hello ${who}`;
ユニコード正規表現
const string = 'foo💩bar'; const match = string.match(/foo(.)bar/u);
ECMAScript 2016 (ES7)
べき乗演算子
let x = 10 ** 2;
ECMAScript 2017 (ES8)
Async 関数
async function doStuffAsync() {const foo = await doOtherStuffAsync();};
関数の末尾カンマ
function f(a, b, c,) {};
ECMAScript 2018 (ES9)
オブジェクトスプレッド
const extended = {...obj, a: 10};
ECMAScript 2019 (ES10)
オプショナルキャッチバインディング
try {throw 0; } catch { doSomethingWhichDoesNotCareAboutTheValueThrown();}
ECMAScript 2020 (ES11)
ダイナミックインポート
const package = await import('package'); package.function()
Nullish 合体演算子
const foo = object.foo ?? 'default';
オプショナルチェイニング
const name = obj.user?.name;
ECMAScript 2022 (ES13)
クラスフィールド
class Bork {static a = 'foo'; static b; x = 'bar'; y;}
ステージ 1 プロポーザル
Export Default From
export v from 'mod';
その他
Babel テンプレート
template(`const %%importName%% = require(%%source%%);`);
Flow
function foo(x: ?number): string {};
ESM から 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 ランタイムで利用できます。

ブラウザ

ECMAScript 2015 (ES6)

ECMAScript 2016 (ES7)

ECMAScript 2017 (ES8)

特定

  • __DEV__