ブラウザのみで動作するローカルアプリの開発環境を構築したい 1
概要
- TypeScript + React + MaterialUI の開発環境を構築する
- Webpack を用いてパッケージングを行い、アプリをローカルサーバなしで起動できるようにする
なぜ
- 自分が使う便利アプリを作りたいだけなのにいちいちローカルサーバを起動したくない
- 身の回りのひとにくばるときに ZIP を投げつけるだけで動いてほしい
- JS + Bootstrap の開発方法に限界感じてきたから React つかいたい
- ついでに TypeScript つかいたい
だれのための記事か
- 自分と同じ境遇のひと
- ある程度 node.js 知ってる人
何も知らなくてもこの記事を上から順に読めば同じ環境を作れるはずです
よくわからない場合、各自ググってください
環境
- win10
- node.js v19.4.0
必要なもの
- node.js
事前にインストールしてください
可能であれば nvm を先に入れてバージョン管理してしまうことをおすすめします
やること
開発用パッケージの導入
- Webpack の導入
- TypeScript の導入
フロントエンドライブラリの導入
- React の導入
- MaterialUI の導入
もろもろの設定
- React 用の設定にする
- index.html を src ディレクトリへ移動させる
環境構築できたか確認する
- アプリを生成できるか確認する
- アプリの動作確認
環境構築
初期設定
作業ディレクトリの作成
mkdir directory-name
cd .\directory-name\
パッケージの作成
npm init -y
開発用パッケージの導入
モジュールインストール時に-D
オプションをつけます
Webpack と TypeScript の導入
@webpack-cli/generators
を使い、必要なモジュールをインストールします
npm i -D @webpack-cli/generators
npx webpack init
微妙な待ち時間のあと、いくつか質問をされるので、以下のように回答します
必要最低限の設定なので、各自好きにしてください
? Which of the following JS solutions do you want to use?
> Typescript
? Do you want to use webpack-dev-server?
> n
? Do you want to simplify the creation of HTML files for your bundle?
> y
? Do you want to add PWA support?
> n
? Which of the following CSS solutions do you want to use?
> none
? Do you like to install prettier to format generated configuration?
> n
? Pick a package manager:
> npm
? Overwrite package.json?
> y(overwrite)
TypeScript と Webpack のモジュールが自動的にインストールされます
パッケージの確認
現在のモジュールの状態は以下の様になっているはずです
"devDependencies": {
"@webpack-cli/generators": "^3.0.1",
"html-webpack-plugin": "^5.5.0",
"ts-loader": "^9.4.2",
"typescript": "^4.9.4",
"webpack": "^5.75.0",
"webpack-cli": "^5.0.1"
}
開発用パッケージの導入は以上です
フロントエンドライブラリの導入
モジュールインストール時に-S
オプションをつけます
React の導入
npm i -S react react-dom @types/react @types/react-dom
-
react
:React のライブラリ -
react-dom
:ReactDOM のライブラリ -
@types/react
:TypeScript で使う React の型定義 -
@types/react-dom
:TypeScript で使う ReactDOM の型定義
MaterialUI の導入
npm i -S @mui/material @emotion/react @emotion/styled
-
@mui/material
:MaterialUI のライブラリ -
@emotion/react
:なんかしらんけど無いと MaterialUI 使えない -
@emotion/styled
:なんかしらんけど無いと MaterialUI 使えない
パッケージの確認
現在のモジュールの状態は以下の様になっているはずです
"devDependencies": {
"@webpack-cli/generators": "^3.0.1",
"html-webpack-plugin": "^5.5.0",
"ts-loader": "^9.4.2",
"typescript": "^4.9.4",
"webpack": "^5.75.0",
"webpack-cli": "^5.0.1"
},
"dependencies": {
"@emotion/react": "^11.10.5",
"@emotion/styled": "^11.10.5",
"@mui/material": "^5.11.6",
"@types/react": "^18.0.27",
"@types/react-dom": "^18.0.10",
"react": "^18.2.0",
"react-dom": "^18.2.0"
}
フロントエンドライブラリの導入は以上です
もろもろの設定
React 用の設定にする
拡張子を.tsx にする
./src/index.ts
の拡張子を.tsx
に変更します
tsconfig.json の編集
tsconfig.json
に以下の設定を追加します
{
"compilerOptions": {
/* 追加する設定 */
"sourceMap": true,
"strict": true,
"jsx": "react",
"moduleResolution": "node",
"lib": ["ES6", "DOM"]
},
"files": ["src/index.tsx"] /* 拡張子を.tsxに変更 */
}
webpack.config.js の編集
webpack.config.js
内のconfig.entry
を編集します
const config = {
entry: './src/index.tsx', /* 拡張子を.tsxに変更 */
}
index.html に React でレンダリングするための root id を付与する
index.html
を編集します
<body>
の中身を削除して<div>
を追加します
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Webpack App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
index.html を src ディレクトリへ移動させる
index.html
だけ root ディレクトリにあるのはキモいので移動させます
index.html の移動
./index.html
を./src/index.html
へ移動させます
webpack.config.js の編集
webpack.config.js
内のconfig.plugins
を編集します
const config = {
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html', /* ./src/indexへ変更 */
}),
],
}
環境構築できたか確認する
アプリを生成できるか確認する
確認用のコードを書く
./src/index.tsx
を以下のように編集します
import React from "react";
import { useState } from "react";
import ReactDOM from "react-dom/client";
import * as MUI from "@mui/material";
const CountButton = () => {
const [count, setCount] = useState(0);
return (
<MUI.Button variant="contained" onClick={() => setCount(count + 1)}>
{count}
</MUI.Button>
);
};
const Root = () => {
return (
<>
<h1>Hello TypeScript + React + MaterialUI</h1>
<CountButton></CountButton>
</>
);
};
window.addEventListener("load", () => {
const rootElement = document.getElementById("root");
if (!rootElement) {
return;
}
const root = ReactDOM.createRoot(rootElement);
root.render(<Root />);
});
build する
npm run build
build に成功すると、./dist
ディレクトリとその中にアプリが生成されます
アプリの動作確認
-
./dist/index.html
をクリックして、アプリが起動することを確認します -
Hello TypeScript + React + MaterialUI
と表示されていることを確認します - ボタンをクリックして、カウントアップされていることを確認します
- 全て正しく動作した場合、環境構築成功です
(こんなかんじの画面が表示されるはずです)
さいごに
有識者はコメントでうんちくを垂れ流してくれると助かります
Discussion