create-react-app×TypeScript の環境をつくる
参考にさせていただく
$ npx create-react-app app --template typescript
# # HappyHuckingまで待機 # #
create-react-app に何が含まれているか?
入れたい設定
ESLint
・リンター。静的解析ツール。コード実行前に検証して、バグを発見する
・コーディング規約を定義できる
・有名なルールセット Google / airbnb / standard
・create-react-appに含まれているので、initで設定ファイルを作成する
Prettier
・コードフォーマッタ。自動整形する
・コードスタイルを統一する
+
コミット時にコードを自動整形したいので、下記3つをインストールします。
husky
lint-staged
prettier
husky
Github: https://github.com/typicode/husky
Git hook を管理するライブラリ。?
📝 Git hook
・特定のコマンドを操作するときに、特定の処理を走らせるもの
・.git/hooks
にインストールされるものなので、Gitで管理できない
📝 husky
・huskyは、Git hookを管理してくれるライブラリ
・huskyにLintやテスト実行の処理設定を記述する..?
・huskyでGit hookを有効にして、package.json に記述する。npm installの対象にする
lint-staged
すべてのコードを対象にするのではなく、コミットされるファイルだけをリンターにかけたい。
==
ふむ..む.....
husky
とりあえず一旦huskyの設定をおこなおう...適しているかどうかは追って考えてみる
{
"scripts": {
"prepare": "cd .. && husky install app/.husky"
// .gitとpackage.jsonの階層が異なるので、
// 階層をひとつ下げてinstallを実行する
}
}
npm run prepare
で .husky/
ができるので、pre-commit
の設定をおこなう
$ npx husky add .husky/pre-commit "echo \"Hello husky\""
.husky
配下にpre-commit ファイルができあがる。
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
echo "Hello husky"
これでcommit前にHello huskyが叫ばれるようになる。
echo "Hello husky"
のかわりに npm run lint-staged
を記述する..?
lint-staged
{
"lint-staged": {
// ステージングしたときに行いたい処理を記載する
"*.{ts,tsx}": [
"prettier --write"
]
}
"scripts": {
.....,
// .husky から呼び出されるコマンド処理
"lint-staged": "lint-staged"
}
}
prettier
.prettierrc
に設定する
{
"tabWidth": 4,
"semi": false,
"useTabs": true,
"singleQuote": true,
"jsxBracketSameLine": true,
"printWidth": 120,
"bracketSpacing": true
}
tsconfig.json
baseUrl: "src"
追加しといた
ESLint
$ npm init @eslint/config
# 設定ファイルを作成する
対話形式で設定する
Need to install the following packages:
@eslint/create-config
Ok to proceed? (y) # enter
? How would you like to use ESLint? …
To check syntax only
To check syntax and find problems
❯ To check syntax, find problems, and enforce code style
# 構文チェック、問題発見、コードスタイルの修正
? What type of modules does your project use? …
❯ JavaScript modules (import/export)
CommonJS (require/exports)
None of these
# ESModuleを使う
? Which framework does your project use? …
❯ React
Vue.js
None of these
? Does your project use TypeScript? · No / Yes
# TypeScriptを適用する
? Where does your code run? … (Press <space> to select, <a> to toggle all, <i> to invert selection)
✔ Browser
✔ Node
? How would you like to define a style for your project? …
❯ Use a popular style guide
Answer questions about your style
? Which style guide do you want to follow? …
❯ Standard: https://github.com/standard/eslint-config-standard-with-typescript
XO: https://github.com/xojs/eslint-config-xo-typescript
? What format do you want your config file to be in? …
JavaScript
❯ YAML
JSON
# いままでjsonだったけどyamlにしてみる
Local ESLint installation not found.
The config that you've selected requires the following dependencies:
eslint-plugin-react@latest eslint-config-standard-with-typescript@latest @typescript-eslint/eslint-plugin@^5.0.0 eslint@^8.0.1 eslint-plugin-import@^2.25.2 eslint-plugin-n@^15.0.0 eslint-plugin-promise@^6.0.0 typescript@*
? Would you like to install them now? › No / Yes
# Yes インストールもする
? Which package manager do you want to use? …
❯ npm
yarn
pnpm
## Installing...
env:
browser: true
es2021: true
node: true
extends:
- plugin:react/recommended
- standard-with-typescript
overrides: []
parserOptions:
ecmaVersion: latest
sourceType: module
plugins:
- react
rules: {}
📝 yaml
・基本 key - value で構造化データを表現できるもの
・コメントが...できる...っ!
・タブは...つかえない..っ!
huskyの動きをみる
コミットしてみる
$ git commit -m 'init'
npm ERR! enoent ENOENT: no such file or directory, open '/Users/.../dirname/package.json'
見つからないな...?
設定を修正する
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
cd app # << package.jsonがあるところまで移動する
npm run lint-staged
再実行
> app@0.1.0 lint-staged
> lint-staged
✔ Preparing lint-staged...
✔ Running tasks for staged files...
✔ Applying modifications from tasks...
✔ Cleaning up temporary files...
[main 39748bb] init
8 files changed, 296 insertions(+), 165 deletions(-)
動いた🍰