Next.jsをはじめよう
Next.js プロジェクト作成
TypeScriptベースのNext.jsプロジェクト
yarn create next-app --typescript アプリ名
TypeScript不要なら、オプションを外すだけ。
yarn create next-app アプリ名
フォルダ構成はこうなる
|-- README.md
|-- next-env.d.ts
|-- next.config.js
|-- node_modules
|-- pages
|-- public
|-- styles
|-- tsconfig.json
|-- yarn.lock
Git連携
作成したプロジェクトのディレクトリで下記のコマンドを実行
リポジトリをつなぐ
git remote add origin 使うレポジトリのURL
ちゃんとなっているか確認
git remote -v
こうなっていれば、OK
origin https//github.com/test-repo/repository.git (fetch)
origin https//github.com/test-repo/repository.git (push)
プロジェクトをPUSH
git push origin main
するとエラーになる
git push origin main
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to 'https//github.com/test-repo/repository.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
forceをつけて、再実行
git push origin main --force
これでOK
Enumerating objects: 20, done.
Counting objects: 100% (20/20), done.
Delta compression using up to 16 threads
Compressing objects: 100% (18/18), done.
Writing objects: 100% (20/20), 47.41 KiB | 9.48 MiB/s, done.
Total 20 (delta 0), reused 0 (delta 0), pack-reused 0
To https//github.com/test-repo/repository.git
+ 43356...f323458 main -> main (forced update)
ESLint & Prettier導入
コードコンベンションの一貫性を担保するため
ESLintとPrettierを導入する
ESLintインストール
yarn add --dev eslint
yarn add v1.22.19
warning ../../package.json: No license field
[1/4] 🔍 Resolving packages...
[2/4] 🚚 Fetching packages...
[3/4] 🔗 Linking dependencies...
[4/4] 🔨 Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
└─ eslint@8.21.0
info All dependencies
└─ eslint@8.21.0
✨ Done in 1.21s.
ESLint設定
yarn eslint --init
...
Successfully created .eslintrc.js file in ディレクトリ
...
✨ Done in 162.13s.
好みの設定を行う
module.exports = {
env: {
browser: true,
es2021: true,
},
extends: [
'plugin:react/recommended',
'airbnb',
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaFeatures: {
jsx: true,
},
ecmaVersion: 'latest',
sourceType: 'module',
},
plugins: [
'react',
'@typescript-eslint',
],
rules: {
},
};
設定した内容が上記のように.eslintrc.jsに反映される。
touch .eslintignore
vi .eslintignore
.next
next-env.d.ts
node_modules
yarn.lock
package.lock.json
public
eslintで除外する対象を設定する。
Prettierインストール
yarn add --dev prettier
yarn add v1.22.19
warning ../../package.json: No license field
[1/4] 🔍 Resolving packages...
[2/4] 🚚 Fetching packages...
[3/4] 🔗 Linking dependencies...
[4/4] 🔨 Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
└─ prettier@2.7.1
info All dependencies
└─ prettier@2.7.1
✨ Done in 1.15s.
yarn add --dev eslint-config-prettier
yarn add v1.22.19
warning ../../package.json: No license field
[1/4] 🔍 Resolving packages...
[2/4] 🚚 Fetching packages...
[3/4] 🔗 Linking dependencies...
[4/4] 🔨 Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
└─ eslint-config-prettier@8.5.0
info All dependencies
└─ eslint-config-prettier@8.5.0
✨ Done in 1.07s.
eslintとprettierの間で競合するフォーまっティングを片方に任せるため(Prettierに担当してもらう)
.eslintrc.jsを編集
extendsの最後に、prettierを追記する。
(react/react-in-jsx-scopeを追加。
react/react-in-jsx-scopeはNext.jsではReactを別途importする必要ないため追記してエラーが出ないようにするため設定)
module.exports = {
...
extends: ['plugin:react/recommended', 'airbnb', 'prettier'],
...
rules: {
'react/jsx-uses-react': 'off',
'react/react-in-jsx-scope': 'off',
'react/jsx-props-no-spreading': 'off',
'react/function-component-definition': [
2,
{
namedComponents: 'arrow-function',
unnamedComponents: 'function-expression',
},
],
'react/jsx-filename-extension': [
0,
{
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
],
},
}
Prettier設定
.prettierrc.jsをプロジェクトのルートに作成して、下記の内容にする
module.exports = {
endOfLine: 'lf',
printWidth: 80,
tabWidth: 2,
semi: false,
singleQuote: true,
jsxSingleQuote: true,
trailingComma: 'all',
}
prettierで除外する対象を追加(eslintと同様にした)
touch .prettierignore
vi .prettierignore
.next
next-env.d.ts
node_modules
yarn.lock
package.lock.json
public
vscode設定
保存時にPrettierが働くように設定。
default formater : Pretter
Format On Save : check
package.json反映
"scripts": {
...
"format": "prettier --check --ignore-path .gitignore .",
"format:fix": "prettier --write --ignore-path .gitignore ."
...
},
Visual Studio Codeの設定
mkdir .vscode
cd ./vscode
touch settings.json
settings.jsonに下記の内容を設定。
これでGithubからcloneしてもvscodeの設定が反映されるようになる。
{
"editor.formatOnPaste": true,
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
"source.fixAll.format": true
}
}
husky設定
gitコミット、プッシュ前にコンベンションチェックを走らせるために導入。
npx husky-init && yarn
すると、
.husky/_
.husky/pre-commit
が生成される。また、package.jsonを下記のように修正
"scripts": {
...
"format": "prettier --write --ignore-path .gitignore .",
...
"prepare": "husky install",
"check-types": "tsc --pretty --noEmit",
"check-format": "prettier --check .",
"check-lint": "eslint . --ext ts --ext tsx --ext js",
"test-all": "yarn run check-format && yarn run check-lint && yarn run check-types"
},
yarn run format
yarn run v1.22.19
warning ../../package.json: No license field
$ prettier --write --ignore-path .gitignore .
.eslintrc.js 50ms
.eslintrc.json 3ms
.prettierrc.js 5ms
.vscode/settings.json 3ms
next.config.js 5ms
package.json 3ms
pages/_app.tsx 303ms
pages/api/hello.ts 12ms
pages/index.tsx 23ms
README.md 43ms
styles/globals.css 33ms
styles/Home.module.css 17ms
tsconfig.json 7ms
✨ Done in 1.00s.
Discussion