React環境構築
react
typescript
環境
- os: windows
- node: 16.15.0
- npm: 8.5.5
実行コマンド一覧
# プロジェクトの初期化(-y で質問をスキップ)
npm init -y
# reactインストール
npm i react react-dom @types/react @types/react-dom --save
# webpack等インストール
# webpack webpack-cli => JavaScriptコードを単一にバンドルするためのライブラリとそのCLI
# webpack-dev-server => 開発時に使用するローカルWebサーバー
npm i --save-dev webpack webpack-cli webpack-dev-server
# webpackのプラグインをインストール
# html-webpack-plugin => dist/にHTMLファイルを出力するプラグイン
npm i --save-dev html-webpack-plugin mini-css-extract-plugin
# babel等インストール
# @babel/core => babel本体
npm i --save-dev @babel/core
# babelのloaderをインストール
# babel-loader => webpackでbabelを使用するのに必要なモジュール ※webpack用のbabel-loaderの先頭に@はつかない
# ts-loader => Typescriptをトランスパイルするために必要
# style-loader => バンドルされたcssをHTMLで読み込まれるようにするためのloader
# css-loader => cssをjavascriptにバンドルするためのloader
# sass-loader => sassをcssに変換するためのloader
npm i --save-dev babel-loader ts-loader style-loader css-loader sass-loader
# babelのpresetをインストール
# @babel/preset-env => ES6以上のコードをES5にトランスパイルするのに役立つプリセット
# @babel/preset-react => jsx形式のファイルをトランスパイルするのに必要なプリセット
# @babel/preset-typescript => typescriptをトランスパイルするのに必要なプリセット
npm i --save-dev @babel/preset-env @babel/preset-react @babel/preset-typescript
# typescriptインストール
npm i --save-dev typescript
# sassインストール
npm i --save-dev sass
npm scriptの設定
package.jsonのscriptsを以下のように編集する
"scripts": {
"start": "webpack-dev-server --mode development",
"build": "webpack --mode production"
},
webpackの設定
webpack.config.jsを作成する
// pathはNode.jsネイティブユーティリティーモジュール
// 絶対パスを参照するためのモジュール
const path = require("path");
// htmlファイルを自動生成するためのモジュール読み込み
const HtmlWebpackPlugin = require("html-webpack-plugin");
// バンドルしたjsファイルからCSSファイルを出力するためプラグイン読み込み
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
// バンドルファイルのentrypointを指定
// path.resolve:OS毎にパスが異ならないようにするために使用
// __dirnameはNode.jsで用意されているグローバル変数
entry: path.resolve(__dirname, "./src/index.tsx"),
// sourceMapの出力設定 出力しないときはfalse
devtool: "hidden-source-map", // hidden-source-mapはコメントを除外したsourceMap
// モジュールプロパティ
module: {
rules: [
{
// bandle対象のファイルの拡張を指定
test: /\.(js|jsx|ts|tsx)$/,
// bandle除外?
exclude: /node_modules/,
// 変換を行うために使用するローダーの指定
use: ["babel-loader", "ts-loader"],
},
{
test: /\.(sass|scss|css)$/,
use: [
// CSSファイルを書き出すオプションを有効にする
{
loader: MiniCssExtractPlugin.loader,
},
{
loader: "css-loader",
options: {
url: true,
sourceMap: true,
},
},
{
loader: "sass-loader",
options: {
sourceMap: true,
},
},
],
},
{
test: /\.(gif|png|jpg|svg)$/,
type: "asset/resource",
},
],
},
// 出力設定
output: {
// 出力先を指定
path: path.resolve(__dirname, "public"),
// 生成されたindex.html内のリソースのプレフィックス(接頭辞)
// build時にHTMLファイル内のURLを更新していく
publicPath: "/",
// ビルド後のファイル名を指定
filename: "main.js",
},
// importの際に拡張子を省略できるようにする対象を指定
resolve: {
extensions: ["*", ".js", ".jsx", ".ts", ".tsx"],
},
// プラグインのインスタンスを作成 ※それぞれのプラグインで設定
plugins: [
new HtmlWebpackPlugin({
// htmlのテンプレートのパスを指定
template: "./src/index.html",
}),
new MiniCssExtractPlugin({
// 出力先の設定
filename: "./css/[name].css",
}),
],
};
Babelの設定
.babelrcを作成する
{
// webpack用のローダーを追加
"presets": [
"@babel/preset-env",
"@babel/react", // jsxをサポート
"@babel/preset-typescript"
]
}
HTMLの作成
src/index.htmlを作成する
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Hello</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
Typescript導入
tsconfig.json作成
npx tsc --init
tsconfig.jsonの一例
{
"compilerOptions": { // コンパイルする際のオプション
"target": "es5", // コンパイル後のjsの形式を指定
"module": "commonjs", // 出力するjsのモジュールの仕組みとして何を使用するかを指定
"rootDir": "./src", // 出力されるjsが指定したパスの構造で出力されるようにする
"outDir": "./dist", // コンパイルしたjsの出力先
"allowJs": true, // .jsと.jsxもコンパイル対象に含まれる ※部分的にjsなど書いている場合にtrueにする
"strict": true, // おまかせでいくつかの設定がtrueになる ※詳細は別途記載予定
"baseUrl": "./", // non-relativeなimportの際のカレントディレクトリを指定
"moduleResolution": "node", // tscのモジュール解決の方法を指定 node | classic 一般的にはnodeを指定
"allowSyntheticDefaultImports": true,
"esModuleInterop": true, // CommonJS 形式のモジュールを、ES Modules でデフォルトインポート可能にする
"forceConsistentCasingInFileNames": true, // importでファイル名の大文字・小文字を区別する
"jsx": "react" // reactでjsxを使う場合はこの設定が必須
},
"include": ["src/**/*"] // コンパイルする対象ファイルを記述
}
tsconfig.jsonの詳細は以下のリンクを参照
tsconfig.jsonを設定する | TypeScript入門『サバイバルTypeScript』
Node.jsはそれ自身ではTypeScriptをサポートしているわけではないため、TypeScriptの導入をする時はTypeScriptの設定ファイルであるtsconfig.jsonが必要です。
https://typescriptbook.jp/reference/tsconfig/tsconfig.json-settings
tsconfig.jsonの主要オプションを理解する - Qiita
概要社内勉強会の資料。TypeScriptのtsconfig.jsonにはオプションが色々とあるので、それらの意味や用途を理解する目的です。tscのバージョンは3.7.2を使用します。VSC…
https://qiita.com/ryokkkke/items/390647a7c26933940470
index.tsxの作成
src/index.tsxを作成する
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
<React.StrictMode>
<App />
</React.StrictMode>
)
App.tsxの作成
src/App.tsxの作成
import React from 'react';
const App = () => {
return(
<div><h1>My new React App</h1></div>
)
}
export default App;
ディレクトリ構成
ここまでのディレクトリ構成は以下の通り
.
│─ src
│ ├ App.tsx
│ ├ index.html
│ └ index.tsx
├ .babelrc
├ package-lock.json
├ package.json
├ README.md
├ tsconfig.json
└ webpack.config.js
解説
webpack
webpackとはJSファイルをまとめる高機能なモジュールバンドラー。
モジュールの形式には、ESModuleとCommonJSが存在する
babel
Babelは、次の世代のJavaScriptの標準機能をブラウザのサポートを待たずに使えるようにするNode.js製のツール
次の世代の標準機能を使って書かれたコードを、それらの機能をサポートしないブラウザでも動くコードに変換する
参考:https://reffect.co.jp/html/webpack-babel-loader-setting-for-beginner
loader
webpackはjavascriptしか扱うことができないためCSSや画像をjsのオブジェクトに変換してバンドルできるようにするもの