create-react-appを使わないReact+TS構築法
Reactを学ぶとき、特別なことが無い限り恐らく誰もが通った 「react-create-app」を使ってHello Worldをしたと思います。
何番煎じかはわかりませんがcreate-react-appを使わずに、 React+TypeScript環境を構築した備忘録として残しておきます。
まずはシンプルにReactをTypeScriptで組めるようにします。
最終的な構成は以下のようになります。
- react
- react-dom
- typescript3
- ts-loader
- post-css
- webpack4
タスクランナーもGulpを使わずnpm-scriptsで管理します。
当記事は前提条件として以下のような方が対象になります。
- crete-react-appでHelloWorldをしたことがある
- create-react-appを使わない構築方法が知りたい
- cssフレームワークを使わずCSSを自分で構築したい
- node.js(npm or yarn含む)を導入済み
- node.jsを使う最低限の知識(npm install等)
当記事はnpmではなくyarnでやっていきます。
npmでも問題なくできると思います。
yarnとnpmのコマンドの差異にはお気を付けください。
第1回目ということでまずはシンプルにReactをTypeScriptで動かしてみましょう。
構築準備
mkdir pure-react
cd pure-react
yarn init -y
新規ディレクトリを作成してその中でinitしてpackage.jsonを作りましょう。
Reactのインストール
早速Reactをインストールしてみましょう。
yarn add react react-dom
webpackの導入
このままでは使えませんので、webpackを導入しましょう。
yarn add -D webpack webpack-cli webpack-dev-server
webpack導入に伴い「webpack.config.js」をルートに作成しましょう。
// pathモジュールの読み込み
const path = require("path");
module.exports = {
// モードを開発モードにする
mode: "development",
// 入力ファイル設定
entry: [path.resolve(__dirname, "./src/index.tsx")],
// 出力ファイル設定
output: {
// 出力されるファイル名
filename: "bundle.js",
// 出力先ディレクトリ
path: path.resolve(__dirname, "dist")
},
// モジュール設定
module: {
rules: [
{
// ts-loaderの設定
test: /\.(js|ts|tsx)?$/,
use: "ts-loader",
exclude: /node_modules/
},
]
},
// モジュール解決
resolve: {
extensions: [".ts", ".tsx", ".js", ".json"]
},
// 開発モード設定
devtool: "source-map",
devServer: {
contentBase: "./dist"
}
};
TypeScriptの導入
TypeScript(以下TS)を使わないのであればbabelでいいと思いますが、 TSであればts-loaderで良いかと思います。
早速インストールしましょう。
yarn add -D typescript ts-loader
ついでにTSの型情報も入れておきましょう。
yarn add -D @types/react @types/react-dom @types/node
次にTSの設定ファイルを作ります。
ルートに「tsconfig.json」を作成してください。
{
"compilerOptions": {
"target": "es5",
"module": "es2015",
"types":["node"],
"lib": [
"es2019",
"dom"
],
"allowJs": true, // jsコンパイル用
"checkJs": true, // js簡易型チェック
"sourceMap": true,
"inlineSources": true,
"outDir": "./dist/",
"noImplicitAny": true,
"jsx": "react",
"allowSyntheticDefaultImports": true,
"moduleResolution": "node"
}
}
tsconfigについては深くは語りません。
詳しくはtsconfig.jsonでググったら全ての詳細が出てきます。
Reactのソースファイルを作る
これでReactを使う準備ができましたので、早速コードを組んでいきましょう。
まずは最初に読み込まれる「index.tsx」を作ります。
ディレクトリは「src」をルートに作成して、その中に「index.tsx」を格納します。
import React from "react";
import ReactDOM from "react-dom";
// コンポーネント読み込み
import App from "./components/App";
ReactDOM.render(<App />, document.getElementById("root"));
これはreactでおなじみの書き方ですね。
Appコンポーネントを読み込んでるので中身を作っていきましょう。
とりあえず定番のHello Worldですね。
「components」ディレクトリを作成してその中に格納していきます。
名前は「App.tsx」
import React, { Component } from 'react';
class App extends Component {
render() {
return (
<>
<h1>Hello TS-React!</h1>
</>
)
}
}
export default App;
シンプルですね。
最近のReactは
元コーダーとしては無駄なタグが増えなくて最高です。
それでは早速動かしてみましょう。
起動コマンドの作成
package.jsonに起動するためのコマンドを記述しましょう。
webpack-dev-serverを使うので以下のように「package.json」改編してください。
{
"name": "pure_react",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"start": "webpack-dev-server --open",
"build": "webpack",
"build-prod": "webpack --mode=production"
},
"dependencies": {
"react": "^16.12.0",
"react-dom": "^16.12.0"
},
"devDependencies": {
"@types/node": "^13.1.4",
"@types/react": "^16.9.17",
"@types/react-dom": "^16.9.4",
"ts-loader": "^6.2.1",
"typescript": "^3.7.4",
"webpack": "^4.41.5",
"webpack-cli": "^3.3.10",
"webpack-dev-server": "^3.10.1"
}
}
追加したのはscriptsの部分です。
最後にhtmlを作成して仮想サーバーを立ち上げる
最後にルートに「dist」というディレクトリを作成して「index.html」を作成しましょう。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>pure-react</title>
</head>
<body>
<div id="root"></div>
<script src="bundle.js"></script>
</body>
</html>
出力されたbundle.jsを読み込むのと、 Reactが描写しようとするid=Rootを持つタグを入れています。
後は
yarn start
で仮想サーバーが立ち上がります
「Hello TS-React!」
と出ていれば完成です!
TS+Reactの最小構成の完成
たぶんこれが一番だと思います。
正直この状態ではTypeScriptの意味は成してないと思いますが、 脱babelに成功しているので良しとしましょう。
jsの場合はbabelでtsの場合はts-loaderを使う感じですね。
そしてなんだかんだやってたらbabelが無いとダメという状況になって 結局babel使ってんじゃねーか!ってなることもあります。
今では何度も構築したのである程度理解しましたが、node.jsは設定するものが多すぎて面倒ですよね。
正直webpackだけで全部やってほしいぐらいです。
次回はpost-cssを使って個別にコンパイルしてみましょう。
それが終わったらnpm-scriptsで順番に自動コンパイルするようにすれば、 Reactアプリの土台作りは完璧です。
cssフレームワークに関してはSASS(scss)でもいいのですが、脱Gulpしたことでpost-cssに移り変わったので、 基本はpost-cssで進めます。
気が向いたらSASSの導入も書いていきます。
それでは!