Motomichi Works Blog

モトミチワークスブログです。その日学習したことについて書いている日記みたいなものです。

Next.jsの開発環境構築手順2022年12月版 | Next.js

はじめに

yarnを使わずにnpmを使ってやります。

個人的に手順をまとめているだけなので、一般的にはイケてないかもしれません。

nodenv

インストール可能なバージョンを確認します。

% nodenv install -l

最新をインストールします。

% nodenv install 19.4.0

nodeのバージョンを設定します。

% nodenv local 19.4.0

確認します。

% nodenv versions
% node -v

プロジェクトを作成する

以下のコマンドを実行します。

% npx create-next-app next_js_introduction --ts

next_js_introduction の部分はプロジェクト名です。

% npx create-next-app {プロジェクト名} --ts

実行しますか?と聞かれるので y を入力してEnterします。

Need to install the following packages:
  create-next-app@13.1.2
Ok to proceed? (y) y

続けてESLintを使うか聞かれたので、Yesを選択しました。

? Would you like to use ESLint with this project? › No / Yes

srcディレクトリを使うか聞かれたので、Yesを選択しました。

Would you like to use `src/` directory with this project? › No / Yes

experimentalのappディレクトリを使うか聞かれたので、Noを選択しました。

Would you like to use experimental `app/` directory with this project? › No / Yes

dev serverを一度起動してみる

プロジェクトのディレクトリに移動します。

% cd next_js_introduction

起動してみます。

% npm run dev

ブラウザで以下のURLにアクセスして確認してみます。

http://localhost:3000/

control + c を押して一度止めます。

dev serverのportを変更する

railsとかで3000を使う場合は、package.jsonのscripts.devを以下の通り編集します。

  "scripts": {
    "dev": "next dev -p 3001",
    〜略〜
  },

pagesとstylesをsrcディレクトリに移動させる

以前は手でやっていたけど、今回はcreateしたときに生成された。

srcディレクトリを作成します。

% mkdir src/

srcディレクトリに移動させます。

% mv ./pages ./src
% mv ./styles ./src

publicディレクトリは移動させません。

TSの絶対パスインポートの設定

これも以前は手でやっていたけど、今回はcreateしたときに生成された。

絶対パスインポートが使えるように、tsconfig.jsonのcompilerOptionsに設定を追加します。

  "compilerOptions": {
    〜省略〜
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    },
    〜省略〜
  },

typesyncをインストール

インストールします。

% npm install --save-dev typesync

package.jsonのscripts.typesyncを追加します。

  "scripts": {
    〜省略〜
    "typesync": "typesync"
  },

実行できるか確認します。

% npm run typesync

npm installしておきます。

% npm install

ESLintとPrettierをインストールして設定

package.jsonのeslint関連パッケージを確認

package.jsonを確認すると、eslint-config-nextが既にインストールされています。

.eslintrcの拡張子を変更

まず.eslintrc.jsonが生成されているので、.eslintrc.jsに拡張子を変更します。

.jsにするとexportする必要があるので、以下のように、module.exports = { にします。

module.exports = {
  extends: "next/core-web-vitals",
};

eslint-config-nextの中身を確認

どのようなpluginが既に含まれているか、 node_modules/eslint-config-next/index.js を確認すると良いでしょう。

パッケージをインストール

prettier, eslint-config-prettier と その他のeslintパッケージをインストールします。

% npm install --save-dev prettier eslint-config-prettier eslint-config-airbnb @typescript-eslint/eslint-plugin

.eslintrc.jsの編集

extends

extendsを以下の通り編集します。各プラグインルールの推奨設定を適用しています。プラグインは読み込んだだけでは有効化されないので、有効化したいものをextendsで指定します。

module.exports = {
  extends: [
    'airbnb',
    'plugin:@typescript-eslint/recommended',
    'plugin:@typescript-eslint/recommended-requiring-type-checking',
    'next/core-web-vitals',
    'plugin:import/errors',
    'plugin:import/warnings',
    'plugin:import/typescript',
    'prettier',
  ],
};

plugin:import については「 eslint-plugin-import - npm 」を参照。

parserOptionsの設定を追加する

.eslintrc.jsにperserOptionsを追加します。

module.exports = {
  〜省略〜
  parserOptions: {
    project: './tsconfig.eslint.json',
    tsconfigRootDir: __dirname,
  },
};

.eslintrc.jsと同じディレクトリ内に、tsconfig.eslint.jsonを新規作成します。

% vim tsconfig.eslint.json

以下の通り記述します。

{
  "extends": "./tsconfig.json",
  "include": [
    "src/**/*.js",
    "src/**/*.jsx",
    "src/**/*.ts",
    "src/**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}

plugins

.eslintrc.jsにpluginsを追加します。pluginsの配列に加えることで、ルールが使用可能になります。

module.exports = {
  〜省略〜
  plugins: [
    '@typescript-eslint',
  ],
};

root: trueにする

frontendプロジェクトのrootディレクトリなので、root: true,にしておきます。

module.exports = {
  〜省略〜
  root: true,
};

rulesで少し調整する

このままだと src/pages/index.tsx などでeslintのエラーが出ているのでrulesで少し調整します。

module.exports = {
  〜省略〜
  rules: {
    'react/function-component-definition': [
      2,
      { namedComponents: 'arrow-function' },
    ],
    'react/jsx-filename-extension': [
      'error',
      {
        extensions: ['.js', '.jsx', '.ts', '.tsx'],
      },
    ],
    'react/jsx-props-no-spreading': 'off',
  },
};

.eslintignoreの作成

.eslintrc.jsと同じ階層に.eslintignoreを作成します。

% vim .eslintignore

以下の通り記述します。環境によってはディレクトリパスを少し調整する必要があるかもしれません。

build/
public/
**/coverage/
**/node_modules/
**/*.min.js
*.config.js
.*lintrc.js

.prettierrcの作成

デフォルト設定だとダブルクォートだったりするので、.prettierrcを作成して少し設定を変更します。

% vim .prettierrc

以下の通り記述します。

{
  "singleQuote": true,
  "trailingComma": "all",
  "endOfLine": "auto"
}

eslintとprettierのルールが衝突していないか確認

以下のコマンドで確認できます。

% npx eslint-config-prettier 'src/**/*.{js,jsx,ts,tsx}'

stylelintをインストールして設定

stylelintをインストール

% npm install --save-dev stylelint stylelint-config-standard stylelint-order stylelint-config-recess-order

.stylelintrc.jsの作成

% vim .stylelintrc.js

以下の通り記述します。

module.exports = {
  extends: [
    'stylelint-config-standard',
    'stylelint-config-recess-order',
  ],
  plugins: [
    'stylelint-order',
  ],
  ignoreFiles: [
    '**/node_modules/**',
  ],
  rules: {
    'string-quotes': 'single',
  },
};

VSCodeの設定

ディレクトリに移動する

Workspaceのrootに移動します。

% cd ../

VSCode用の.eslintignoreを作成する

VSCodeで.eslintrc.jsを開くとlintエラーが出ているのでWorkspaceのrootに.eslintignoreを作成します。

以下の通り記述して、Workspaceのrootに設置しました。pathはプロジェクトに合わせて適宜変更してください。

next_js_introduction/build/
next_js_introduction/public/
next_js_introduction/**/coverage/
next_js_introduction/**/node_modules/
next_js_introduction/**/*.min.js
next_js_introduction/*.config.js
next_js_introduction/.*lintrc.js

Prettierの拡張をVSCodeにインストールしていると、Prettierによるコード成形は動作しますが、ESLintによるチェックはしなくなるはずです。

.vscodeディレクトリの作成

% mkdir .vscode/

.vscode/settings.jsonの作成

% vim .vscode/settings.json

以下の通り記述します。(これらが何なのか理解不足なので後でちゃんと読む必要あり。)

{
  "css.validate": false,
  "less.validate": false,
  "scss.validate": false,
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true,
    "source.fixAll.stylelint": true
  },
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.formatOnSave": false,
  "[graphql]": {
    "editor.formatOnSave": true
  },
  "[javascript]": {
    "editor.formatOnSave": true
  },
  "[javascriptreact]": {
    "editor.formatOnSave": true
  },
  "[json]": {
    "editor.formatOnSave": true
  },
  "[typescript]": {
    "editor.formatOnSave": true
  },
  "[typescriptreact]": {
    "editor.formatOnSave": true
  },
  "editor.lineNumbers": "on",
  "editor.rulers": [
    80
  ],
  "editor.wordWrap": "on",
  "eslint.packageManager": "yarn",
  "files.insertFinalNewline": true,
  "files.trimTrailingWhitespace": true,
  "npm.packageManager": "yarn",
  "typescript.enablePromptUseWorkspaceTsdk": true
}

.vscode/extensions.jsonの作成

% vim .vscode/extensions.json

以下の通り記述します。

{
  "recommendations": [
    "CoenraadS.bracket-pair-colorizer-2",
    "dbaeumer.vscode-eslint",
    "donjayamanne.githistory",
    "esbenp.prettier-vscode",
    "msjsdiag.debugger-for-chrome",
    "oderwat.indent-rainbow",
    "stylelint.vscode-stylelint",
    "VisualStudioExptTeam.vscodeintellicode",
    "vscode-icons-team.vscode-icons",
    "wix.vscode-import-cost"
  ],
  "unwantedRecommendations": []
}

package.jsonのscriptsを編集する

scriptsに以下の行を追加...とりあえずしないですが、後で様子を見ながらするかもしれません。

  "scripts": {
    〜省略〜
    "fix": "npm run -s format && npm run -s lint:fix",
    "format": "prettier --write --loglevel=warn 'src/**/*.{js,jsx,ts,tsx,html,gql,graphql,json}'",
    "lint": "npm run -s lint:style; npm run -s lint:es",
    "lint:fix": "npm run -s lint:style:fix && npm run -s lint:es:fix",
    "lint:es": "eslint 'src/**/*.{js,jsx,ts,tsx}'",
    "lint:es:fix": "eslint --fix 'src/**/*.{js,jsx,ts,tsx}'",
    "lint:conflict": "eslint-config-prettier 'src/**/*.{js,jsx,ts,tsx}'",
    "lint:style": "stylelint 'src/**/*.{css,less,sass,scss}'",
    "lint:style:fix": "stylelint --fix 'src/**/*.{css,less,sass,scss}'",
    〜省略〜
  },