React＋TailwindCSSプロジェクト with Vite

# きっかけ

最近よく名前を聞くViteです。

個人的に現在はNext.jsでCreate-next-appを使っていますが、一度試してみようと思ったので備忘録メモです。

## 構築環境

とりあえず大掛かりなものを作る予定ないので、下記の構成ではじめてみます。

- React 18.2.0
- typeScript 4.9.3
- vite 4.1.0
- eslint 8.34.0
- prettier 2.8.4
- tailwindcss 3.2.6

# Viteのインストール

[Vite](https://vitejs.dev/)

いつもnpmを使っているから気分を変えてyarnをインストールしてみる。

```
npm install yarn
```

viteのセットアップコマンド

```
yarn create vite
```

successしたら、プロジェクト名と利用Frameworkと言語が対話形式で聞かれるので答えてく。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614172/371ca04d-21f4-b376-2da3-fb7b16a633c8.png)


## dev viewを立ち上げてみる

プロジェクトファイルに移動して

```
yarn
```

```
yarn dev
```

localhostのポートはデフォルトで5173のようです。
ここまで2、3分です。とても速い。

![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614172/1e810450-59f1-c376-0eb2-f0c2b5dcd9d8.png)


## package.json

```json:package.json
{
  "name": "sample-project",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "@types/react": "^18.0.27",
    "@types/react-dom": "^18.0.10",
    "@vitejs/plugin-react-swc": "^3.0.0",
    "typescript": "^4.9.3",
    "vite": "^4.1.0"
  }
}
```

# ESlintとPrettierの設定

これに関してはeslintの設定コマンドが変わっていました。

```
yarn add eslint --save-dev

~~npx eslint --init~~

npm init @eslint/config　 //上でも行けましたが、今はこっちに変わったそう
```

```
yarn add prettier --save-dev

yarn add eslint-config-prettier --save-dev
```

対話形式で初期設定の内容はほぼ変わっていなかったので下記の記事を参照

[create-react-app（typescript）のプロジェクトでESlintの設定 | 田舎でのんびり書くテックブログ](https://tech-blog-efcg.vercel.app/36bf4512-a7a8-46dd-8025-61e1cba2b33a)

### .eslintrc.json

中身はこんな感じです。ほぼデフォルト。必要なものは適宜追加です。

```jsonc:.eslintrc.json
{
  "env": {
    "browser": true,
    "es2021": true
  },
  "extends": [
    "plugin:react/recommended",
    "standard-with-typescript",
    "plugin:react-hooks/recommended",
    "prettier" //追加←最後に追加しないと機能しないので注意
  ],
  "overrides": [],
  "parserOptions": {
    "ecmaVersion": "latest", //デフォルトがlatestになってる
    "sourceType": "module",
    "project": "./tsconfig.json" //追加
  },
  "plugins": [
    "react",
    "react-hooks"//追加
  ],
  "rules": {
    "react/react-in-jsx-scope": "off" //追加
  }
}
```

### react/react-in-jsx-scope

現在React17以降はReactのインポートが不要になっていますが、この設定が有効だとJSXではReactインポートしろと怒られるのでoffにしています

### flat config

現在はCLIからデフォルトの利用はできませんが、flat configという概念が持ち込まれたようで、その場合は、設定はすべてeslint.cofig.jsで書くことができるようになる。

ignoreファイルも中に一緒になって、プラグインもインポートで利用するので自分で名前を付けられるようになる。結果メンテコストが下がるようになるそうです。

今回はViteが使いたい趣旨なのと、まだ安定版でないことからあまり深く踏み入らないことにしました。。。詳しい記事をいくつか読みましたがふわっとした理解しか出来なかった😢

[ESLintのconfigがどのように変わり得るか（flat configとは何か）](https://zenn.dev/makotot/articles/0d9184f3dde858)

[Flat Config導入完了！　新しいESLintの設定フォーマットを使ってみた](https://zenn.dev/babel/articles/eslint-flat-config-for-babel)

どちらも記事内で公式ブログにも飛べます

そもそもESlintの設定も満足に理解できてないのにどんどん変わってくなぁ

## Prettier

コード整形は人気のこちらに任せます。

### .prettierrc

```json:.prettierrc
{
  "printWidth": 120,
  "tabWidth": 2,
  "useTabs": true,
  "semi": true,
  "singleQuote": false,
  "overrides": [{ "files": "*.js", "options": { "singleQuote": true } }],
  "bracketSpacing": true,
  "bracketSameLine": false,
  "arrowParens": "always",
  "trailingComma": "none",
  "embeddedLanguageFormatting": "off",
  "plugins": ["prettier-plugin-tailwindcss"],　//tailwindcss設定時に追加
  "pluginSearchDirs": false
}
```

### .eslintignoreと.prettierignore

それぞれ同じ内容です。

```
node_modules
yarn.lock
public
```

### .setting.json

```json:.setting.json
{
	"editor.defaultFormatter": "esbenp.prettier-vscode",
	"editor.codeActionsOnSave": {
		"source.fixAll.eslint": true
	},
	"editor.formatOnPaste": true,
	"editor.formatOnSave": true,
	"editor.minimap.enabled": false,
	"indentRainbow.colorOnWhiteSpaceOnly": true,
	"editor.quickSuggestions": {
		"comments": false,
		"strings": true,
		"other": true
	},
	"editor.guides.indentation": false,
	"editor.renderLineHighlight": "none",
	"editor.tabSize": 2,
	"editor.cursorBlinking": "expand",
	"files.associations": {
		"*.css": "tailwindcss"
	}
}
```

# TailwindCSSの設定

人気があるのは知っていましたが、もっぱらChakraUIを利用していたのでこちらも試してみようと設定することにしました。公式にWith Viteのやり方があったのでそれで。

[Install Tailwind CSS with Vite - Tailwind CSS](https://tailwindcss.com/docs/guides/vite)

```
yarn add -D tailwindcss postcss autoprefixer

npx tailwindcss init -p
```

生成されたtailwind.config.cjsファイルを下記のように追記します

```jsx:tailwind.config.cjs
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    //この中の2行を追加
    "./index.html",
    "./src/**/*.{js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
```

index.cssを書き換えます

```css:index.css
@tailwind base;
@tailwind components;
@tailwind utilities;
```

app.tsxも書き換えて試しにスタイルを当ててみます

```jsx:app.tsx
const App :()=>JSX.Element= () =>{
  return (
    <h1 className="text-3xl font-bold underline">
      Hello world!
    </h1>
  )
}

export default App;
```

yarn devしてみると、ちゃんとスタイルが当たっているようです。

![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614172/a58328e5-9188-54c8-e3c0-939b1eb3d975.png)



## VScodeを使っている方は拡張機能を追加するとよい

[Editor Setup - Tailwind CSS](https://tailwindcss.com/docs/editor-setup)

拡張機能をインストール後VScodeの設定を書くsetting.jsonに下記を追加

```jsonc:.vscode/setting.json
{
//...
"editor.quickSuggestions": {
  "strings": true
},
"files.associations": {
		"*.css": "tailwindcss"
	}
// ...
}
```

このようにホバーするとCSSを見れたり、utilityclassの補完が効きます。便利！

![Untitled (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614172/a7881431-5fac-824a-aefe-2ab5d8f6fdb6.png)

## Prettierの公式プラグインも設定

こちらはclass属性を自動的にソートしてくれます。

順番がバラバラになりがちですが、自動で並び替えてくれるので可読性もアップ。

複数人で開発するときは、ルール決めなくても揃うので便利ですね。

![Untitled (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614172/a7e6ab2b-ff3d-e66b-0ceb-b6b6aa6aecd1.png)


```
yarn add -D prettier prettier-plugin-tailwindcss
```

こちらをインストールして設定に下記を追加

```jsonc:setting.json
{
 // ...
 "plugins": ["prettier-plugin-tailwindcss"],　//tailwindcss設定時に追加
  "pluginSearchDirs": false
 // ...
}
```

![Untitled (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614172/2c414963-6228-c4e4-8da7-871220f9bc32.png)


![Untitled (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614172/a5e167cd-2998-60f2-0956-935edc2dc0fa.png)


Prettierが動くと並び変わりました！

## おわりに

次々に変わっていく技術に追いついていかないですが、Viteの設定は爆速ですし、ESlintやPrettierのルールも徐々に決めていくものなので、十数分もあれば「さぁ開発してこう」ってところまでできます。

ちょっとずつでも、足を止めずに新しい技術に触れる時間を作っていこうと思います。