※2019.06.10追記
[TypeScript] create-react-appで始めるだいたいストレスフリーな開発環境の構築2
これから新しくプロジェクトを作成する方は更新版の上記の記事をご覧ください。この方法は現在非推奨です。
はじめに
TypeScriptは素晴らしいのですが、create-react-appで始めるとルールが厳しすぎて心が折れます。かといってtslintの推奨設定をすべて取ってしまうのも抵抗があるので…安全かつある程度快適な開発のために、私がいつも最低限やっている事をメモしておきます。
サンプル
https://github.com/Julia0709/ts-react-app
0. 事前準備
Node.jsがインストールされているか確認します。下記コマンドを実行したときにv8.11.2
などの数字が現れれば大丈夫です。
$ node -v
Node.jsがインストールされていなかった場合は、下記よりOSに合ったインストーラをダウンロードして実行してください。
https://nodejs.org/ja/download/
1. 新規プロジェクトを作成
1-1. create-react-app
下記コマンドを実行します。my-app
部分はプロジェクト名になるので、任意の名前に変更してください。npxを先頭に付けると、グローバルにインストールされていなくてもcreate-react-appが使えます。
$ npx create-react-app my-app --scripts-version=react-scripts-ts
1-2. プロジェクトを起動
完了したら作成されたディレクトリ内に移動します。
$ cd my-app
プロジェクトを起動します。推奨されているyarnを使用していきます。
$ yarn start
http://localhost:3000がブラウザで開き、Welcome to Reactと表示されれば成功です。
停止させる場合はcontrol
+ c
です。
2. gitの設定
立ち上がることを確認したので、ここでgitを設定し一度コミットしておきます。Initial commit
は任意のコミットメッセージに変更してください。必要であればここでGithubのリポジトリを作成して連携させます。
$ git init
$ git add .
$ git commit -m "Initial commit"
3. 開発環境設定
ここがこの記事の本題です。作業を始める前に便利な設定をしておきます。
3-1. devDependencies(package.json)
下記の3つ、husky
、lint-staged
、prettier
をインストールすれば、コミット時にコードを自動整形してくれるようになります。プロダクションには必要ないので、-D
を付けてすべてdevDependencies
としてインストールします。
$ yarn add -D husky lint-staged prettier
package.json
をエディタで開いて必要なものを足していきます。個人的にはscripts
をdependencies
の上に置きたいので、このときに位置を入れ替えます。
最後の}
の直前あたりに下記のlint-staged
コマンドを追記します。これは拡張子がts
またはtsx
の場合に、prettier
を走らせてからgit add
するように指示しています。
{
...
"lint-staged": {
"*.{ts,tsx}": [
"prettier --write",
"git add"
]
}
}
"precommit": "lint-staged"
をscriptsの最後あたりに追記します。precommit
で上記のlint-staged
が実行できるようになります。
{
"scripts": {
...
"precommit": "lint-staged"
},
...
}
prettierはルールを変更したい場合はlint-staged
の後あたりに、下記のように追加してください。私は基本的にダブルクォートをシングルクォートに変更します。また"trailingComma": "all"
にして、コミットで余計な差分が出ないようにすべての行にカンマを付けるときもあります。
{
...
"prettier": {
"singleQuote": true,
"trailingComma": "all"
}
}
3-2. tslint.json
tslint.json
をエディタで開き、最後の}
の直前にrules
を追加します。チェックしてほしくないものだけをここで上書きしていきます。
{
...
"rules": {
"interface-name": false,
"member-access": false,
"no-console": false,
"object-literal-sort-keys": false,
"ordered-imports": false,
}
}
interface-name
型定義のときに、毎回先頭にI
を付けたくないので外します。
member-access
renderの前などにpublic
と明示する必要はないと思っているので外します。私はprivate
のものだけ明記するようにしています。
no-console
開発中はconsole.log
を色んな所で使いたいのでfalseにしておきます。falseではなく{ "severity": "warning" }
とすると、ビルドは通ってwarningとしてエラーが表示されます。
object-literal-sort-keys
オブジェクトのkeyの並びをアルファベット順以外にしたいことがあるので外しておきます。
ordered-imports
import文はアルファベット順ではなく関連度順にしておきたいのでfalseにします。
また"defaultSeverity": "warning"
を指定しておけば、tslintがエラーの場合でもビルドが行われて、warningにエラー内容が表示されるのみになります。
{
...
"defaultSeverity": "warning"
}
詳しくはTSLintのConfigurationに説明があります。
https://palantir.github.io/tslint/usage/configuration/
3-3. tsconfig.json
ここでsrc
内にcomponents
やcontainers
などのディレクトリを作成してファイルを整理します。
tsconfig.json
のcompilerOptions
内にpaths
を追加して、@ディレクトリ名
で読み込めるようにしておくと記述するパスが短くなりますし、ディレクトリ構造を変更をしてもここのパスを変更するのみで済むのでおすすめです。
{
"compilerOptions": {
...
"paths": {
"@containers": ["src/containers"],
}
},
...
}
するとコンポーネント内では下記のように読み込めるようになります。
import { App } from '@containers';
ここまでできたらyarn start
でプロジェクトを再起動してみて、無事表示されれば完了です。
おわりに
後は必要に応じてSassを導入したり、precommit時にtslintやテストも走らせたりしていきます。他にもオススメ設定があれば教えてください!