サイト名変更・お引越しのお知らせ

Create React AppしたReactアプリをReact Native for Web化する方法を解説

Create React AppしたReactアプリをReact Native for Web化する方法を解説します。

React Native for Webについてはこちらで解説していますので、ご参照ください。

React Native for Webとは何かについて解説

この記事でわかること
  • ReactアプリをReact Native for Web化する方法がわかる
  • react-native-webの基本の使い方がわかる

バージョン
  • React 17.0.2
  • react-native-web 0.17.5

create-react-appでReactアプリを作成する

まずは、Create React AppでReactアプリを作成しましょう。

モグモグさん

すでに作成済みの方はスキップでOKです!

ReactとTypeScript環境を構築 【入門】create-react-appでReactとTypeScript環境を構築

最低限画面が表示されるところまで進めましょう。

react-native-webパッケージを追加

続いて、react-native-webを追加しましょう。

$ yarn add react-native-web

// npmの方
$ npm install react-native-web

詳細なドキュメントはこちらを参照ください。

React Nativeのcomponentに変更

最後に、App.js(もしくは、App.tsx)でReact Nativeのcomponentに変更します。

何も触っていない状態は下記のようなコードだと思います。(多少バージョンによって異なります)

import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;

こんな感じに書き換える

import logo from './logo.svg';
import { Image, StyleSheet, Text, View } from 'react-native';


function App() {
  return (
    <View style={styles.app}>
      <View style={styles.appHeader} accessibilityRole="banner">
        <Image source={logo} style={styles.appLogo} />
        <Text style={styles.appText}>
          Edit src/App.js and save to reload.
        </Text>
        <Text 
          href="https://reactjs.org"
          accessibilityRole="link" 
          style={styles.appLink}>
          Learn React
        </Text>
      </View>
    </View>
  );
}

const styles = StyleSheet.create({
  app: {
    textAlign: "center"
  },
  appLogo: {
    height: "40vmin",
    width: "40vmin",
  },
  appHeader: {
    backgroundColor: "#282c34",
    minHeight: "100vh",
    display: "flex",
    flexDirection: "column",
    alignItems: "center",
    justifyContent: "center",
    fontSize: 'calc(10px + 2vmin)',
  },
  appText: {
    color: "white",
    fontSize: 'calc(10px + 2vmin)',
  },
  appLink: {
    color: "#61dafb",
    fontSize: 'calc(10px + 2vmin)',
  }
})

export default App;

再度、ビルドしなおして、最初にビルドしたような画面が表示されていればOKです。

初期のスタイルと多少変わりますが、気になる方はスタイルを細かく修正してみましょう!

変更点

divViewに変更したりpTextに変更したりしています。

React Nativeのcomponentsのドキュメントはこちらです。

モグモグさん

TextInputなど他のcomponentを使ってみても理解が深まると思います。

スタイルもReact NativeのStyleSheetを使う形に変更しています。

これで、React Native for Web化が完了です。

補足

Create React Appではすでに、import { } from react-nativeの箇所をimport { } from react-native-webに変換するaliasがwebpackで設定されています。

これによってただimportするだけでよくなっています。

もし、独自でwebpack等も実装している場合はwebpack側で設定するかreact-native-webからimportすることで実現できます。

モグモグさん

Viewをmainsectionなどの特定のタグに変換したい場合は、accessibilityRoleを渡します。

こちらがマッピングなので参考にしてみてください!

まとめ

最後に要点を簡単にまとめておきます。

React Native for Web化する方法まとめ
  • Create React Appを行い、react-native-webライブラリを追加
  • React Nativeのcomponentsを使う形に変更
  • Create React Appの場合は、aliasを設定しているのでreact-nativeをimportするだけでcomponentsが使える