【Hello World】TypeScript + React Native for Web + Webpack

e-hello-world-rnforweb プログラミング

※当ブログでは商品・サービスのリンク先にプロモーションを含みます。ご了承ください。

今度はTypeScript + React Native for Web + webpack + github pages templateを作ってみました。

こちらにコードはありますのでみてみてね〜

GitHub - jiji-thecat/ts-webpack-rn-hello-world
Contribute to jiji-thecat/ts-webpack-rn-hello-world development by creating an account on GitHub.

はじまり

React Native(以後、RN)を使いたかったのですが、なんだか色々種類がありました。今回はRN for Webを使ってみました。

  1. React: Web Appを作るためのFrame Work
  2. React Native: Mobile Appを作るためのFrame Work
  3. React Native for Web: Web AppでReact Native使うためのFrame Work

このような感じで理解しています。1が最初に登場して、2がモバイルアプリサポートのために登場して、3はモバイルアプリをwebアプリにも使いたいという要望に応えて登場したのかな?(自己解釈)

2,3を使えばマルチプラットフォームなアプリが開発できるため、なようです。

とりあえず流行りに乗って、RN for Webを使ってテンプレを作ります。

まず、ベースとなる以下の記事で作成したテンプレを拡張したいと思います!以下、説明するパラメタなどは新たに追加したものに関してです。

tsconfig.json

ts-webpack-rn-hello-world/tsconfig.json at main · jiji-thecat/ts-webpack-rn-hello-world
Contribute to jiji-thecat/ts-webpack-rn-hello-world development by creating an account on GitHub.
プロパティ説明
jsxどのようなjsx codeを生成するか?
.tsxから、.jsにするか.jsxにするか選べるようです。(公式
moduleResolution使いたいtargetに欲しいライブラリがないときにライブラリを追加できる

依存の追加

ts-webpack-rn-hello-world/package.json at main · jiji-thecat/ts-webpack-rn-hello-world
Contribute to jiji-thecat/ts-webpack-rn-hello-world development by creating an account on GitHub.

babelやreact-native系の依存するパッケージを追加していきます。

index.web.ts

ts-webpack-rn-hello-world/index.web.ts at main · jiji-thecat/ts-webpack-rn-hello-world
Contribute to jiji-thecat/ts-webpack-rn-hello-world development by creating an account on GitHub.

ルートにindex.html以外にindex.web.tsというファイルを追加しました。

この中で、表示するアプリのコンポーネントを登録し、エントリーファイルとしてロードするようwebpack configを修正します。

App.tsx

ts-webpack-rn-hello-world/src/App.tsx at main · jiji-thecat/ts-webpack-rn-hello-world
Contribute to jiji-thecat/ts-webpack-rn-hello-world development by creating an account on GitHub.

ここでは、TextコンポーネントとButtonコンポーネントを使っています。

このように、RNではコンポーネント(部品)を簡単に利用することができます。

他にも、ScrollViewやTextInputなどさまざまなコンポーネントが提供されています。

webpack.config.ts

ts-webpack-rn-hello-world/webpack.config.ts at main · jiji-thecat/ts-webpack-rn-hello-world
Contribute to jiji-thecat/ts-webpack-rn-hello-world development by creating an account on GitHub.

エントリの追加

  entry: ['./index.web.ts', './src/styles.css'],

entryパラメタに新たなエントリーファイルであるindex.web.tsを追加します。

babel-loaderの追加

ここは正直100%理解できていません。とりあえず公式のいうようにコピペしたのみです。

Multi-platform setup // React Native for Web

もうちょっと色々説明つけてほしいな。。

ts-webpack-rn-hello-world/webpack.config.ts at main · jiji-thecat/ts-webpack-rn-hello-world
Contribute to jiji-thecat/ts-webpack-rn-hello-world development by creating an account on GitHub.
 use: [
          {
            loader: 'babel-loader',
            options: {
              cacheDirectory: true,
              // The 'metro-react-native-babel-preset' preset is recommended to match React Native's packager
              presets: ['module:metro-react-native-babel-preset'],
              // Re-write paths to import only the modules needed by the app
              plugins: ['react-native-web'],
            },
          },
          ,
          { loader: 'ts-loader' },
        ],

babel

babelとは、javascript用のトランスパイラーです。各ブラウザには、対応するjsバージョンがあり、

自分の作ったアプリがその条件を満たしていない場合、ブラウザではロードができないという問題があります。

この問題を解決してくれるのが、babel!

babelを使うと、es6を使っている自分のアプリをes5しか動かないブラウザでも動かせるようになります。babelがトランスパイルしてくれるので!

とても便利!

presets

こちらは、pluginのセットらしいです。

plugins

こちらはただのpluigin。

じゃあ、presets vs plugins?

パラメタを分ける必要があるのか気になったので少し調べてみました。

ありがたきstackoverflowで似たような質問を発見!

Difference between plugins and presets in .babelrc
SituationSo I have a .babelrc like this:{ "presets": [ "es2015", "stage-2", "react" ], "plugins": [ "transform-decorator...

どうやら、pluginsのがpresetsより先にロードされるらしいですね。

サンプル

ボタンを押しても何も起きませんが、RNのボタンコンポーネントを使っているのがわかりますね。

https://jiji-thecat.github.io/ts-webpack-rn-hello-world

まとめ

TypeScript + React Native for Web + Webpackな環境を作ってみました。

勉強になりました〜webpackは難しいな〜。。

にほんブログ村に参加しております!よろしければクリックお願いします 🙂

にほんブログ村 IT技術ブログへ
にほんブログ村

コメント

タイトルとURLをコピーしました