React(TypeScript) の環境構築(create-react-app を使わずに)


## 注意
- 参考URLに記載されている内容を実際にやってみた。
- やったことのメモです。

## 目的
- React + TypeScriptの環境構築の勉強用(やったことメモ)
- React(typescriptの)開発環境を、create-react-app を使わずに構築する

## 環境
```
~ $ sw_vers
ProductName:	macOS
ProductVersion:	11.5.2
BuildVersion:	20G95

~ $ node --version
v14.17.4

~ $ npm --version
6.14.14

```

## やったこと
### 1. 参考URL1 を見ながら、Hello React!まで実装
フォルダ作って、プロジェクト作成する。

```
react-tutorial $ ls
package.json
react-tutorial $ cat package.json 
{
  "name": "react-tutorial",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
```

モジュールを入れてみる

```
react-tutorial $ cat package.json 
{
  "name": "react-tutorial",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/react": "^17.0.18",
    "@types/react-dom": "^17.0.9",
    "html-webpack-plugin": "^5.3.2",
    "ts-loader": "^9.2.5",
    "typescript": "^4.3.5",
    "webpack": "^5.50.0",
    "webpack-cli": "^4.8.0"
  },
  "dependencies": {
    "react": "^17.0.2",
    "react-dom": "^17.0.2"
  }
}

```

webpackの設定ファイルを作る

```
react-tutorial $ cat webpack.config.js 
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  mode: 'development',
  entry: './src/index.tsx',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'index.js'
  },
  resolve: {
    extensions: ['.js', '.json', '.ts', '.tsx']
  },
  devtool: 'source-map',
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: "ts-loader",
        include: path.resolve(__dirname, 'src'),
        exclude: /node_modules/
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html'
    })
  ]
};
```

TypeScriptの設定ファイルを作る

```
react-tutorial $ cat tsconfig.json 
{
  "compilerOptions": {
    "target": "ES2015",
    "module": "commonjs",
    "lib": ["esnext", "dom"],
    "jsx": "react",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
  },
}
```

HelloWorld用にindexファイルを生成

```
  react-tutorial $ ls -la
   drwxr-xr-x  dist
   drwxr-xr-x  node_modules
   -rw-r--r--  package-lock.json
   -rw-r--r--  package.json 
   drwxr-xr-x  src
   -rw-r--r--  tsconfig.json
   -rw-r--r--  webpack.config.js

   --------------
   src $ ls -la
    total 16
    drwxr-xr-x  .
    drwxr-xr-x  ..
    -rw-r--r--  index.html
    -rw-r--r--  index.tsx

```
ビルドして画面を確認
![helloworld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870907/60559ce2-fe92-bdf4-5d3f-fcd0e4df6ec3.png)

できた。

### 2. 参考URL2,3 を見ながら、live reloadingできるようにする

npm install --save-dev webpack-dev-server

```bash:package.json
    "dependencies": {
      "react": "^17.0.2",
      "react-dom": "^17.0.2",
      "webpack-dev-server": "^4.0.0"
    }

```

webpack.config.js と package.jsonを更新

```bash:webpack.config.js
  devServer:{
    static: './dist',
  },

```

```bash:package.json
  "scripts": {
    "build": "webpack",
    "start": "webpack serve",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

```
npm startを実行

```bash:terminal
react-tutorial $ npm start
> react-tutorial@1.0.0 start /workspace/react-tutorial
> webpack serve

<i> [webpack-dev-server] Project is running at:
<i> [webpack-dev-server] Loopback: http://localhost:8080/
・・・
webpack 5.50.0 compiled successfully in 2612 ms

```
画面でた。
![localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870907/f08b3320-9cb3-912c-1dfe-4c972226d269.png)

live reloadを試すために、React!をTypeScript!に変更してみる
index.tsxの name の中身を変更して保存

```bash:index.tsx

ReactDom.render(
  <Hello name="TypeScript" />,
  document.getElementById('root')
);

```
上書き保存すると自動で webpack compiledされた。画面。
![hotreload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870907/299c7aa2-ffe9-c29a-fddb-4f8df47ae90d.png)

## おわりに
無事できてよかった。
ハマるような部分もなくてよかった。

## 参考URL一覧
1. https://maku.blog/p/m4dmt3a/
2. https://qiita.com/takmatsukawa/items/e59f74d32fcd5ec034d2
3. https://webpack.js.org/guides/development/#using-webpack-dev-server
4. https://webpack.js.org/concepts/