
利用料金は、個人ユーザーは無料で利用可能。月間50回までのセキュリティスキャンも利用可能です。登録はメールアドレスのみで、AWSのアカウントも不要。
AWS版「GitHub Copilot」な「Amazon CodeWhisperer」が正式版に 個人ユーザーは無料、VSCodeに対応 - ITmedia NEWS
⇧ ありがたや、「GitHub Copilot」は有償になったから手が出せんかったけども、こちらを試してみますかね。
ReactとVue、選択に迷うよね
JavaScriptのフレームワークが様々あるけれど、3大フレームワークと言うと、
- Angular
- React
- Vue
って感じになるとは思うのだけど、世界的にはReactが主流らしいですと。
最近、Vue 2.xから3.xでの破壊的変更があったせいで、移行作業に苦しめられた人にとっては、この先、同様の破壊的変更が起こるんじゃないかとVueに対する不信感が払拭できない今日この頃。
⇧ 上記サイト様によりますと、Reactを選んでおく方が良さ気な雰囲気ですと。
Reactが推される風潮については、
⇧ hookという仕組みが導入されたことも大きいのかもしれません、知らんけど。
ReactでSPA(Single Page Application)を実装してみる
そも、SPA(Single Page Application)とは?
A single-page application (SPA) is a web application or website that interacts with the user by dynamically rewriting the current web page with new data from the web server, instead of the default method of a web browser loading entire new pages. The goal is faster transitions that make the website feel more like a native app.
In a SPA, a page refresh never occurs; instead, all necessary HTML, JavaScript, and CSS code is either retrieved by the browser with a single page load, or the appropriate resources are dynamically loaded and added to the page as necessary, usually in response to user actions.
⇧ 目指してるのは、Native Applicationのような速いページ遷移ってことらしい。
SPA(Single Page Application)とMultiple Page Applicationの違いはと言うと、
⇧ 上図の左側のように、SPA(Single Page Application)は1つのページの中でコンテンツの内容だけ切り替えて読み込むため、ページ遷移が高速化されるということかと。
SEO(Search Engine Optimization)とか考慮する必要がないはずの業務システムなんかは、だいたいSPA(Single Page Application)で作る感じになるんじゃないかと。
で、ReactでSPA(Single Page Application)を実現するとなると、
⇧ 上記サイト様によりますと、
- react-router
- react-router-dom
の2つがメジャーらしいんだけども、
Declarative routing for React
React Router is a lightweight, fully-featured routing library for the React JavaScript library. React Router runs everywhere that React runs; on the web, on the server (using node.js), and on React Native.
This repository is a monorepo containing the following packages:
⇧ スマホのようなNative Application向けのreact-router-nativeってのもあるらしい。
react-router-domでSPA(Single Page Application)
とりあえず、調べた感じでは、ReactでSPA(Single Page Application)を実現するにはreact-router-domを導入すれば良いらしい。
新規でReactのプロジェクトを作成できるのであれば、CLIで作る感じになるのかな?と思っていて
- Create React App
- Vite
の2つの方法が主流っぽいのだけど、「Vite」はVueの開発者のEvan You氏が開発してるものだそうです。
なんか、いまのところ、
⇧「CRA(Create React App)」は改善に取り組もうと方針を検討中らしいので、「Vite」を使ってReactのプロジェクトを作成することにします。
「Vite」のGitHub のドキュメントによると、
⇧「Vite」で利用できるtemplateでReactに関係するものを選んでいく感じらしいです。
「Vite」を利用するには、事前に「Node.js」を導入しておく必要があるようです。
自分は、Windows環境なので「nvm-windows」をインストールして「Node.js」をインストールしています。
手前味噌で恐縮ですが、
⇧ 前回の記事で、「nvm-windows」のバージョン上げてたりしてますので、宜しければご照覧ください。
「Node.js」のバージョンは、LTS(Long Term Support)版の18.16.0を利用してます。

で、「Vite」の公式のtemplateを見た感じ、ReactでSPAを実現するための「react-router-dom」は含まれていないので、「Vite」でReactプロジェクトを作成後に「react-router-dom」をnpm installしていく感じになるのかな。
ということで、まずは、Reactのプロジェクト用のディレクトリを作成したい場所に移動します。

そしたらば、作成したディレクトリに移動して、「Node.js」に同梱されてるnpmで公開されてる「Vite」のバージョン確認してみます。


4.2.0を利用していこうと思います。
ViteでReactプロジェクトの雛型を作成。
npm create vite@4.2.0 my-react-spa-app -- --template react-ts


⇧ 雛型が作成されたようです。
ここからは、Visual Studio Codeを使っていきます。
Visual Studio Codeを起動して、「File」>「Open Folder...」を選択して、先ほど作成されたReactのプロジェクトのフォルダを選択。

続いて、「View」>「Terminal」を選択。

「Command Prompt」を選択。

公開されているreact-router-domのバージョンを確認してみる。


2023年4月15日(土)時点の最新をインストールすることにします。
npm install react-router-dom@6.10.0

で、
⇧ 上記サイト様によりますと、TypeScriptを使う場合は、「@types/react-router-dom」ってライブラリもインストールする必要があるらしい。
こちらも、今時点の最新をインストールしました。
npm install @types/react-router-dom@5.3.3

package.jsonの依存関係に追加されてれるのでインストールされたようです。
{
"name": "my-react-spa-app",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview"
},
"dependencies": {
"@types/react-router-dom": "^5.3.3",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.10.0"
},
"devDependencies": {
"@types/react": "^18.0.28",
"@types/react-dom": "^18.0.11",
"@vitejs/plugin-react": "^3.1.0",
"typescript": "^4.9.3",
"vite": "^4.2.0"
}
}
そしたらば、まずは、遷移先のページを作成する必要があるようなので、適当にフォルダを作成してファイルを作成します。

ルーター用のファイルを作成。

今回、追加したフォルダとファイルは以下のようになりました。

追加したファイルにコーディング。
■C:\Users\Toshinobu\Desktop\soft_work\react_work\my-react-spa-app\src\page\home\index.tsx
export const Home = () => {
return (
<div>
<h1>Home</h1>
</div>
);
}
■C:\Users\Toshinobu\Desktop\soft_work\react_work\my-react-spa-app\src\page\about\index.tsx
export const About = () => {
return (
<div>
<h1>About</h1>
</div>
);
}
■C:\Users\Toshinobu\Desktop\soft_work\react_work\my-react-spa-app\src\page\404.tsx
export const Page404 = () => {
return (
<div>
<h1>404</h1>
</div>
);
}
■C:\Users\Toshinobu\Desktop\soft_work\react_work\my-react-spa-app\src\routes\router.tsx
import { Route, Routes } from "react-router-dom";
import { Home } from "../page/home";
import { About } from "../page/about";
import { Page404 } from "../page/404";
export const Router = () => {
return (
<Routes>
<Route path="/" element={<Home/>} />
<Route path="/about" element={<About/>} />
<Route path="*" element={<Page404/>} />
</Routes>
);
}
あとは、既存のファイルに追加。
■C:\Users\Toshinobu\Desktop\soft_work\react_work\my-react-spa-app\src\App.tsx
import { useState } from 'react'
import reactLogo from './assets/react.svg'
import viteLogo from '/vite.svg'
import './App.css'
import { BrowserRouter } from 'react-router-dom';
import { Router } from './routes/router';
function App() {
const [count, setCount] = useState(0)
return (
<div className="App">
{/**
<div>
<a href="https://vitejs.dev" target="_blank">
<img src={viteLogo} className="logo" alt="Vite logo" />
</a>
<a href="https://reactjs.org" target="_blank">
<img src={reactLogo} className="logo react" alt="React logo" />
</a>
</div>
<h1>Vite + React</h1>
<div className="card">
<button onClick={() => setCount((count) => count + 1)}>
count is {count}
</button>
<p>
Edit <code>src/App.tsx</code> and save to test HMR
</p>
</div>
<p className="read-the-docs">
Click on the Vite and React logos to learn more
</p>
*/}
{/* ルーター追加 */}
<BrowserRouter>
<Router/>
</BrowserRouter>
</div>
)
}
export default App
で、開発用のサーバー起動。

ブラウザで、上記のリンクにアクセスする。

アクセス先を変更。

上記以外の場合は、404に遷移できてます。

とりあえずは、ReactでSPA(Single Page Application)を実現できたということで。
formとかも追加してサーバー側にリクエストすることもしていきたいですかね。その前に、hookの使い方やら、状態管理やらに慣れていくのが先ですかね...
2023年4月16日(日)11:40 追記:↓ ここから
型を付ける書き方を、
⇧ 上記サイト様を参考にやってみました。
■C:\Users\Toshinobu\Desktop\soft_work\react_work\my-react-spa-app\src\page\home\index.tsx
import React from 'react'
const Home: React.FC = () => {
return (
<div>
<h1>Home</h1>
</div>
);
}
export default Home
■C:\Users\Toshinobu\Desktop\soft_work\react_work\my-react-spa-app\src\page\about\index.tsx
import React from 'react';
const About:React.FC = () => {
return (
<div>
<h1>About</h1>
</div>
);
}
export default About
■C:\Users\Toshinobu\Desktop\soft_work\react_work\my-react-spa-app\src\page\404.tsx
import React from 'react'
const Page404: React.FC = () => {
return (
<div>
<h1>404</h1>
</div>
);
}
export default Page404
■C:\Users\Toshinobu\Desktop\soft_work\react_work\my-react-spa-app\src\routes\router.tsx
import { RouteObject } from "react-router-dom";
import Home from "../page/home";
import About from "../page/about";
import Page404 from "../page/404";
export const Router: RouteObject[] = [
{
path: '/',
element: <Home />
},
{
path: '/about',
element: <About />
},
{
path: '*',
element: <Page404 />
}
]
■C:\Users\Toshinobu\Desktop\soft_work\react_work\my-react-spa-app\src\App.tsx
import { useState } from 'react'
import reactLogo from './assets/react.svg'
import viteLogo from '/vite.svg'
import './App.css'
import { useRoutes, BrowserRouter } from 'react-router-dom';
import { Router } from './routes/router';
import React from 'react'
const App: React.FC = () => {
const [count, setCount]: [number, React.Dispatch<React.SetStateAction<number>>] = React.useState<number>(0)
const router: React.ReactNode = useRoutes(Router)
return (
<div className="App">
{/**
<div>
<a href="https://vitejs.dev" target="_blank">
<img src={viteLogo} className="logo" alt="Vite logo" />
</a>
<a href="https://reactjs.org" target="_blank">
<img src={reactLogo} className="logo react" alt="React logo" />
</a>
</div>
<h1>Vite + React</h1>
<div className="card">
<button onClick={() => setCount((count) => count + 1)}>
count is {count}
</button>
<p>
Edit <code>src/App.tsx</code> and save to test HMR
</p>
</div>
<p className="read-the-docs">
Click on the Vite and React logos to learn more
</p>
*/}
{/* ルーター追加 */}
{/*
<BrowserRouter>
<Router/>
</BrowserRouter>
*/}
<>{router}</>
</div>
)
}
export default App
■C:\Users\Toshinobu\Desktop\soft_work\react_work\my-react-spa-app\src\main.tsx
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
import './index.css'
import {BrowserRouter} from 'react-router-dom'
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>,
)
どうしても、App.tsxの10行目とか変数の型が複雑になりますな...any型を指定してしまいたくなるよね...
まぁ、そもそも、count、setCountの値を使ってる個所をコメントアウトしてるから、使ってないんだけどね...
ただ、型付けが分かり辛いのは、TypeScriptがイケてないのか、Reactがイケてないのか...
あと、
⇧ 上記サイト様によりますと、「react-router-dom」はバージョン5系とバージョン6系でコーディングの仕方が結構変わってくるようです。
2023年4月16日(日)11:40 追記:↑ ここまで
毎度モヤモヤ感が半端ない...
今回はこのへんで。
