はじめに
ReactとTypeScriptを使用したモダンなWebアプリケーションの開発は、効率的で型安全なコードを書けるため非常に人気があります。しかし、その開発環境をセットアップするには少し手間がかかることもあります。特に、ReactとTypeScriptをWebpackでバンドルする設定は初めての方にとっては敷居が高く感じられるかもしれません。
この記事では、ReactとTypeScriptをWebpackでバンドルする方法をステップバイステップで解説します。実際に開発を始めるために必要な設定までを網羅しています。これからReactとTypeScriptを使ったプロジェクトを始める方、またはWebpackの設定に悩んでいる方にとって役立つ内容となっていますので、ぜひ最後までご覧ください。
なおWebpackの基本的な設定に関しては別の記事でご紹介していますので合わせてご参考ください。
https;//shinagawa-web.com/blogs/webpack-basics-guide
今回のゴール
ReactコンポーネントをJSX形式で実装しWebpackでバンドルしたのちにブラウザで確認できるよう実装していきます。
その後、TypeScriptをバンドルできるようにしReactコンポーネントをTSX形式に修正します。修正したのちにWebpackでバンドルし同じようにブラウザで表示されるか確認します。
今回のチュートリアルでTypeScriptを使った型安全な開発でReactを実装できるようになることをイメージしていただけたら幸いです。
React(JSX)をバンドルする
JSXのような非標準のJavaScript構文をJSに変換する必要があるのですがそれを担うのがBabelになります。
前回の記事でBabelをご紹介しましたがその際は新しいJavaScriptの書き方を古い書き方に変換するために使いましたが、今回はJSX -> JSへの変換で使用します。
Babel公式
Babelプリセットの追加
npm i -D @babel/preset-react
.babelrc
ファイルをプロジェクト直下に作成してありましたので先ほど追加したプリセットを指定します。
{
"presets": ["@babel/preset-env", "@babel/preset-react"]
}
プロジェクトにReactのインストール
ReactのインストールをしてJSX構文が使えるようにします。
npm i react react-dom
Reactアプリの作成
これまで作成してきたJSファイルを削除し新たにReactアプリを作成していきます。
rm dist/*.js* src/*.js
App
コンポーネントの作成
import React from "react";
export const App = ({name}) => {
return (
<h1>{`Hello ${name}`}</h1>
);
};
name
をPropsに取り表示させています。
import { createRoot } from 'react-dom/client';
import React, { StrictMode } from 'react';
import { App } from './App';
import './styles.css'
const root = createRoot(document.getElementById('app'));
root.render(
<StrictMode>
<App name={'Test'} />
</StrictMode>
);
id='app'
の要素にReactアプリを表示させるよう定義しています。
<head>
<meta charset="utf-8" />
<title>webpack tutorial</title>
</head>
<body>
+ <div id="app"></div>
<script src="./main.js"></script>
</body>
表示させるHTMLに新たにid='app'
の要素を追加しました。
動作確認
webpackでバンドルしてみます。
npx webpack --mode development
するとエラーが発生しました。
これまではデフォルトでsrc/index.js
をエントリーファイルとして読み込まれるモジュールをバンドルしていましたが、src/index.jsx
が今回エントリーポイントになったためエラーとなりました。
webpack.config.jsを修正します。
/** @type {import('webpack').Configuration} */
module.exports = {
devtool: "source-map",
module: {
rules: [
{
- test: /\.js$/,
+ test: /\.jsx?$/,
loader: "babel-loader",
},
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
+ resolve: {
+ extensions: ['.js', '.jsx']
+ }
};
再度バンドルすると今度は成功するかと思います。
TypeScriptをバンドルする
Reactがバンドルできましたので次はTypeScriptで書いたコードのバンドルを行なっていきます。
TypeScriptのインストール
まず最初にTypeScriptのインストールを行います。
npm i -D typescript
react-dom に含まれる関数やオブジェクトの型情報もインストールします。
npm i -D @types/react-dom
tsconfigの作成
TypeScript プロジェクトのコンパイラ設定を管理するためのtsconfig.json
ファイルを作成します。
npx tsc --init
Reactを使用するため、"jsx": "react-jsx"
を追記しておきます。
{
"compilerOptions": {
"target": "es2016",
"module": "commonjs",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true,
"jsx": "react-jsx"
}
}
TypeScript用のローダーのインストール
TypeScriptで書かれたコードを読み取るためにローダーをインストールします。
npm i -D ts-loader
webpack.config.jsの設定変更
babel-loader
からts-loader
に変更します。
また新たに.ts
と.tsx
をサポートするように設定変更します。
/** @type {import('webpack').Configuration} */
module.exports = {
devtool: "source-map",
module: {
rules: [
{
- test: /\.jsx?$/,
+ test: /\.tsx?$/,
- loader: "babel-loader",
+ loader: "ts-loader",
},
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
resolve: {
- extensions: ['.js', '.jsx']
+ extensions: ['.js', '.jsx', '.ts', '.tsx']
}
};
jsx -> tsxへの書き換え
ファイルの拡張子を変更しつつTypeScriptに書き換えていきます。
- import React from "react";
- export const App = ({name}) => {
+ export const App = ({name}: {name: string}) => {
return (
<h1>{`Hello ${name}`}</h1>
);
};
name
の型を定義します。
また、tsconfig.json
で"jsx": "react-jsx"
を設定したためimport React from "react";
は不要になりました。
import { createRoot } from 'react-dom/client';
- import React, { StrictMode } from 'react';
+ import { StrictMode } from 'react';
import { App } from './App';
import './styles.css'
+ const container = document.getElementById('app');
+ if (!container) {
+ throw new Error("Failed to find the root element. Make sure there's an element with id='app' in your HTML.");
+ }
- const root = createRoot(document.getElementById('app'));
+ const root = createRoot(container);
root.render(
<StrictMode>
- <App name={'Test'} />
+ <App name={'TypeScript'} />
</StrictMode>
);
id='app'
の要素を取得できなかった場合の処理を追記しています。
動作確認のためTest
からTypeScript
に変更しています。
動作確認
webpackでバンドルしてみます。
npx webpack --mode development
TypeScript + Reactの環境で動作確認ができました。
webpack.configをTypeScriptで記述する
webpack.config.jsはwebpack.config.tsに変更することも可能です。
(そこまでする必要があるかはプロジェクトごとの判断になるかと思いますが)
webpack.configはwebpackでバンドルする前に読み込むためts-loader
ではなくts-node
を使ってTypeScript のまま Node.js スクリプトを実行できるようにします。
また実行時にはTypeScript 用 Node.js の型定義ファイルが必要となるためこちらもインストールします。
npm i -D ts-node @types/node
webpack.config.js
-> webpack.config.ts
に拡張子を変更しつつ書き方も若干変わります。
import { Configuration } from "webpack";
const config: Configuration = {
devtool: "source-map",
module: {
rules: [
{
test: /\.tsx?$/,
loader: "ts-loader",
},
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
resolve: {
extensions: [".js", ".jsx", ".ts", ".tsx"],
},
};
export default config;
Configuration
というwebpackの型情報をセットすることで入力補完が効くようになります。
これまで通りwebpackでバンドルできるか確認します。
npx webpack --mode development
HTMLをバンドルする
これまではHTMLファイルをdist
フォルダに置いて、getElementById
でReactアプリを表示させていました。
webpackではHTMLもバンドルしてまとめてコードを出力することが可能です。
プラグインのインストール
html-webpack-plugin
をプロジェクトに追加します。
npm i -D html-webpack-plugin
webpack.config.ts
に設定を追加
import { Configuration } from "webpack";
+ import HtmlWebpackPlugin from "html-webpack-plugin";
const config: Configuration = {
devtool: "source-map",
module: {
rules: [
{
test: /\.tsx?$/,
loader: "ts-loader",
},
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
resolve: {
extensions: [".js", ".jsx", ".ts", ".tsx"],
},
+ plugins: [
+ new HtmlWebpackPlugin({
+ template: "./src/index.html",
+ inject: "body",
+ }),
+ ],
};
export default config;
先ほどのプラグインを追加し、HTMLファイルの配置先を定義します。
合わせてbody
タグでJavaScriptを読み込むよう設定します。
次にHTMLファイルをdist
-> src
に移動しscript
タグは削除します。
<head>
<meta charset="utf-8" />
<title>webpack tutorial</title>
</head>
<body>
<div id="app"></div>
- <script src="./main.js"></script>
</body>
動作確認
これまで通りwebpackでバンドルできるか確認します。
npx webpack --mode development
ブラウザで表示されていればOKです。
これでdist
フォルダは管理しなくて良くなったので.gitignore
に追加しておきます。
dist/
さいごに
今回の記事では、ReactとTypeScriptのアプリケーションをWebpackでバンドルする方法について解説しました。Webpackの設定ファイルの編集、BabelやTypeScriptの導入、さらにはHTMLのバンドルまで、必要な手順をひとつずつ追っていきました。
ReactとTypeScriptを使った開発は、最初は少し学習曲線があるかもしれませんが、適切なツールと設定を使うことで、開発効率が大きく向上します。このガイドを参考にして、あなたも自分の開発環境を整えて、効率的なReactアプリの開発を楽しんでください。
今後もWeb開発に役立つ情報を提供していきますので、引き続きチェックしていただけると嬉しいです
なおWebpackの基本的な設定に関しては別の記事でご紹介していますので合わせてご参考ください。
関連する技術ブログ
Webpackの基本から実践的な使い方まで完全ガイド
Webpackは、JavaScriptアプリケーションのビルドプロセスを効率化する強力なツールですが、その設定方法や使い方には少しの学習が必要です。本記事では、Webpackの基本概念から、実際にプロジェクトで使える設定方法まで詳しく解説します。
shinagawa-web.com
React × Tailwind CSS × Emotionで実践するコンポーネント設計ガイド:デザインシステム・状態管理・再利用性の最適解
React、Tailwind CSS、Emotion、Storybook、Figma、Next.jsを活用したコンポーネント設計のベストプラクティスを紹介。デザインシステムに基づく命名規則、適切な状態管理、再利用性を高める抽象化、アクセシビリティ対応、スタイルガイドラインの整備、テーマ設定、バージョン管理、ドキュメント作成まで、モダンフロントエンド開発に欠かせない知識を徹底解説します。
shinagawa-web.com
NestJS × React × Railway:ブログUIを実装して本番環境へデプロイ
NestJS+React+Prismaで構成したブログアプリを、Dockerで本番ビルドし、クラウドサービス「Railway」へデプロイするまでの手順をまとめました。本番DB接続、環境変数管理、フロントエンドとバックエンドの統合配信など、運用を意識した実践的な構成に仕上げていきます。個人開発やPoCにも応用できる「即戦力の本番構成」を一緒に組み立てていきましょう。
shinagawa-web.com
React + Express を活用したモノレポ環境構築ガイド:Turborepoで効率的な開発を実現
React、Expressを使ってモノレポ環境を構築し、Turborepoでの効率的な開発を実現する方法を解説します。フロントエンドとバックエンドを統合した最適な開発環境を整えるためのステップを順を追って紹介します。
shinagawa-web.com
スキーマ駆動開発の実践:React × Express × GraphQLで効率的なAPI設計を実現
GraphQLを活用したスキーマ駆動開発(Schema-Driven Development, SDD)の実践方法を解説します。React(フロントエンド)とExpress(バックエンド)を組み合わせ、GraphQLスキーマを基にAPI設計を進めることで、型安全性と開発効率を向上させる手法を紹介します。GraphQL Code Generatorを用いた型定義の自動生成、スキーマ設計のベストプラクティス、Turborepoによるモノレポ構成についても詳しく解説します。
shinagawa-web.com
ExpressとMongoDBで簡単にWeb APIを構築する方法【TypeScript対応】
本記事では、MongoDB Atlasを活用してREST APIを構築する方法を、初心者の方にも分かりやすいステップで解説します。プロジェクトの初期設定からMongoDBの接続設定、Expressを使用したルートの作成、さらにTypeScriptを用いた型安全な実装まで、実践的なサンプルコードを交えて丁寧に説明します。
shinagawa-web.com
Express(+TypeScript)入門ガイド: Webアプリケーションを素早く構築する方法
Node.jsでWebアプリケーションを構築するための軽量フレームワーク、Expressの基本的な使い方を解説。シンプルなサーバー設定からルーティング、ミドルウェアの活用方法、TypeScriptでの開発環境構築まで、実践的なコード例とともに学べます。
shinagawa-web.com
React のリファクタリング完全ガイド:モジュール化・レンダリング最適化・設計パターン適用でコードを改善
フロントエンド開発において、可読性が低いコードやパフォーマンスの課題を抱えていませんか?本記事では、React を用いたフロントエンドのリファクタリング手法を具体的なコード例とともに解説します。命名規則の統一や関数分割による可読性向上、共通処理のモジュール化によるコードの整理、関心の分離に基づいたコンポーネント設計の最適化を実践。また、useMemo / useCallback / React.memo を活用したレンダリングの最適化、Promise.all や useQuery の適切な適用による非同期処理の最適化など、パフォーマンス改善にも焦点を当てます。さらに、クリーンアーキテクチャやリポジトリパターンの導入、TypeScript による型安全性の強化、依存関係の整理まで幅広くカバー。リファクタリングを計画的に進める方法も紹介し、スムーズな適用を支援します。より読みやすく、保守しやすいコードへと進化させるための実践的なアプローチをご紹介します。
shinagawa-web.com