2023/08/05
2023/08/05
Next.jsの環境構築の方法をいつも忘れるのでメモしておく。
以下のパッケージをインストールする。
プロジェクトディレクトリを作成したい階層でnpx create-next-app@latest
を実行。
質問に答えていくとNext.js + TypeScript + ESLint が設定された環境までは手に入る。
npm install --save-dev husky lint-staged stylelint stylelint-config-recommended \ prettier eslint-config-prettier @typescript-eslint/eslint-plugin@^5.0.0\ jest jest-environment-jsdom @testing-library/react @testing-library/jest-dom
eslint-plugin
はv6系統だと依存関係を解決できない様子(参考: eslint-config-nextのdependencyがeslint-plugin-jestとコンフリクトする)。
そのうちeslint-config-next
が更新されたら使えるようになると思う。
scripts
の部分を置き換えて、lint-staged
を追加する。
{ "scripts": { "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint --dir src", "lint:fix": "next lint --dir src --fix", "lint:css": "stylelint \"**/*.css\" --fix", "format": "prettier --write --ignore-path .gitignore ./**/*.{js,jsx,ts,tsx,json,css}", "test": "jest --passWithNoTests", "test:ci": "jest --ci --passWithNoTests", "prepare": "husky install" }, ..., "lint-staged": { "*.{ts,tsx}": [ "npm run lint:fix", "npm run format" ], "*.{css,less,sass,scss}": [ "npm run lint:css" ] } }
.eslintrc.json
を書き換える。TypeScript関連の設定などを追加する。
{ "extends": [ "eslint:recommended", "next/core-web-vitals", "plugin:@typescript-eslint/recommended", "plugin:@typescript-eslint/recommended-requiring-type-checking", "prettier" ], "parser": "@typescript-eslint/parser", "parserOptions": { "project": "./tsconfig.json" }, "plugins": [ "@typescript-eslint" ], "root": true, "rules": { "import/order": [ "error", { "alphabetize": { "order": "asc" } } ] } }
以下の内容を.prettierrc.json
として保存。中身は好みに応じて変える
{ "trailingComma": "all", "tabWidth": 2, "singleQuote": false, "semi": false }
最初に npm run prepare
を実行する。
以下の内容を.husky/pre-commit
として保存。
#!/bin/sh . "$(dirname "$0")/_/husky.sh" npx lint-staged
コミット前にlint-staged
による自動フォーマットが走るようになる。
以下の内容を.stylelintrc.json
として保存
{ "extends":["stylelint-config-recommended"] }
以下の内容をjest.config.js
として保存
const nextJest = require("next/jest"); const createJestConfig = nextJest({ dir: "./", }); const customJestConfig = { moduleNameMapper: { "^@/(.*)$": "<rootDir>/src/$1", }, }; module.exports = createJestConfig(customJestConfig);