【初心者】ASP.NET CoreとReactでWebアプリをつくる -開発環境編-

オウルです。

さて、最近工作にハマってる4歳の娘が作った、これは一体誰しょう?

煉獄杏寿郎

娘の日課は「ノージーのひらめき工房」を3~4回観る⇔工作なので、我が家は娘の工作品で溢れかえっています。こんなに無邪気に工作するのも、いつまでだろう。これ残したいなぁと思ってると、ひらめきー!です。

最近、React勉強してるし、勉強がてらにWebアプリを作ってみるという、別に全然ひらめきではないですが、思った次第です。Googleフォトといった素晴らしいサービスはありますが、僕の家族が使うWebアプリを目指してみようと思います、まぁいつ完成するかは分からないですが。

ということで、ASP.NET CoreのReactプロジェクトテンプレートをベースにWebアプリを作成していきます。何はともあれ開発環境の準備からです。

目標

  • ASP.NET CoreとReactの開発環境の準備
  • ログインから他ページ遷移の実装

開発環境

ローカル開発環境は次になります。

OS WSL Ubuntu 21.04
Editor VSCode

言語と主なライブラリ

フロントエンド

 

React 17.0.2
React Router 6.0.0-beta.2
Typescript 4.1.5
Tailwind CSS

バックエンド

ASP.NET Core 5.0

node.jsとnpmはインストール済みであることとします。

開発環境の準備

ASP.NET CoreのReactプロジェクトテンプレートを使ってプロジェクトを作成します。

Reactプロジェクトテンプレート

.NET Core CLIでReactプロジェクトテンプレートを作成します。

React Redux Appに置き換え

上記で作成されたClientAppは標準のCRA Reactアプリです。これをRedux + TS テンプレートのReact Redux Appに置き換えます。

ASP.NET Coreプロジェクトを変更

ClientApp⇒client-appに変更したので、関係するところを変更していきます。同じClientAppで作成した場合は、ここを変更すればいいんだなと思いながら眺めてください。

プロジェクトファイル

まずは、プロジェクトファイルです。

Startup.cs

続いて、Startup.csです。

生成されたパスのUrlを小文字にする

Startup.csを編集中なので、ついでに生成されたパスのURLが小文字になるように構成します。

ここでは省略しますが、Loggerを追加しておきましょう。NLogを使う場合は、Getting started with ASP.NET Core 5を参考にしてください。また、エディターにVSCodeをお使いの場合は、プロジェクトファイルに、nlog.configをコピーするように設定してください。

Prettier

PrettierをVS Codeに導入します。Prettierは、Javascriptでよく使われるコード整形ツールです。

これで、動くはずです。VS Codeからデバッグして、次のページがブラウザに表示されればOKです。

React Redux Appのトップページ

ログインから他ページに遷移

開発環境の準備が整ったので、ログインページから他ページの遷移を実装してみます。今回のサンプルに限り、認証ロジックなしのトークン(固定文字列)を返すだけのAPIにして、結果のトークンをセッションストレージに格納します。”限り”というのも、例えばJWS形式のJWTにした場合、トークンの保存先問題があります。Please Stop Using Local Storageにあるようにセキュリティリスクを考えなければならないです。なので、ASP.NET Core Identityを使用しない認証Cookieを使った方法を検討中です。こちらは検証次第、また紹介できればと思います。

JWS形式のJWTって何?という方はこちらをご参考に。


Identityを使用しない認証Cookieって何?という方はこちらをご参考に。

フォームライブラリとCSSフレームワーク

シンプルなフォームバリデーションが実現できるReact Hook FormとCSSフレームワークのTailwind CSSを導入します。なぜ、Tailwind CSSなのか?Bootstrap以外で流行っているフレームワークをただ触りたかったからという理由です。

各インストールは手順通りに進めれば問題ないはずです。ただ、僕はTailwind CSSのtailwind.config.jsを生成するときに”lum[i] = (chan <= 0.039_28) ? chan / 12.92 : ((chan + 0.055) / 1.055) ** 2.4;`”というエラーが出て嵌りましたが。。。色々試しましたが、結局Nodeのバージョンがv10で古く、v14までアップデートして再度インストールすると上手くいきました。

ログイン

ログインページを作っていきます。作るファイルは以下の3つです。

  • Login.tsx
  • loginAPI.ts
  • loginSlice.ts

loginAPI.ts

Redux ToolkitのcreateAsyncThunkを使ってASP.NET Core APIにアクセスする非同期関数を実装します。因みにRedux Toolkitは以下のような声から生まれたようです。

  • “Configuring a Redux store is too complicated”
  • “I have to add a lot of packages to get Redux to do anything useful”
  • “Redux requires too much boilerplate code”

要は、めんどくさくて使いにくいってことですね。

loginAsyncのpayloadCreator(createAsyncThunkの第2引数)に、ASP.NET Core APIのログインAPIにアクセスする非同期ロジックを含めています。

loginSlice.ts

createSliceのreducersパラメーターには何も追加していません。loginAsyncは、公式の言葉を使うならば「reference “external” actions」になるので、extraReducersパラメーターに追加します。これは、以下の公式引用にあるように推奨とあります。今回は単純な非同期リクエストのライフサイクル(pending、fulfilled、rejected)を表すステータスを変更するReducerだけですけど。

We recommend using this API as it has better TypeScript support (and thus, IDE autocomplete even for JavaScript users), as it will correctly infer the action type in the reducer based on the provided action creator. It’s particularly useful for working with actions produced by createAction and createAsyncThunk.

Login.tsx

ログインコンポーネントを作ります。メールアドレスとパスワードのシンプルなフォームです。

React Hook Formを使うと、簡単にバリデーションできました。ただやはり実装してみると色々思うところがでてきて、特にログインボタンをクリックした結果が、エラーだった場合の表示制御がいまいち。この辺りは、実装を進めながら模索ってとこですね。

後、β版ですがReact Router v6の機能になるナビゲーション関数を使用しています。ここでは、React RouterのuseNavigateフックを使って遷移する機能を追加しています。

本当は、ページ遷移まで行きたかったですが、少し長くなってきたのでページ遷移(React Router)とAPI側(ただ単に文字列を返すだけですが)は次回ということにします。何分、Reactの勉強歴が浅いので、Twitterなどでここはこうした方がいいとかアドバイス等いただけると幸いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA