DockerでNext.jsの環境構築をする

16970 ワード

はじめに

DockerでNext.jsの環境構築を行いました

  • Next.js
    • TypeScript
    • ホットリロード機能
    • ESLintの設定
    • Prettierの設定

最終的なディレクトリ構成

.
├── .vscode
│   └── .settings.json
├── src
|   ├── <Next.jsのコード>
|   ├── .eslintrc.json
│   └── .prettierrc
├── .dockerignore
├── docker-compose.yml
└── Dockerfile

Next.js on Docker

Dockerfile

Dockerfile
FROM node:lts-buster-slim

WORKDIR /app

docker-compose.yml

docker-compose.yml
version: '3'
services:
  app:
    build:
      context: .
    tty: true
    volumes:
      - ./src:/app
    command: sh -c "npm run dev"
  • volumes
    • srcディレクトリ内にNext.jsアプリを作成していくため、./src:/appとしています

create-next-app

docker-compose build

docker-compose run --rm app sh -c 'npx create-next-app src --typescript'

docker-compose up

これでアプリの雛形をsrcディレクトリ内に作成でき、サーバーを起動できていることが確認できました

ホットリロードの設定

Next.jsのホットリロード機能を有効にするため、docker-compose.ymlで環境変数を設定しました

docker-compose.yml
version: '3'
services:
  app:
    build:
      context: .
    tty: true
    volumes:
      - ./src:/app
+   environment:
+     - WATCHPACK_POLLING=true
    command: sh -c "npm run dev"
  • watchpack

    • webpackに含まれているライブラリ
    • fileを監視する役割
  • ちなみに、最初はnext.config.jsに以下のようなwatchOptionsを記載するやり方を真似したのですが、採用しませんでした

next.config.js
module.exports = {
  webpackDevMiddleware: config => {
    config.watchOptions = {
      poll: 800,
      aggregateTimeout: 300,
    }
    return config
  },
}

採用しなかった理由としては以下です

  • コード変更から一定時間たたないとホットリロードによる変更が開始しない(poll: <秒数>のため)
  • ホットリロードが完了するのに数秒かかる(再コンパイルが発生するため?)

リンター・フォーマッターの設定

そもそもなぜESLintだけでなくPrettierも使用するのか、といったことに疑問を持ったのですが、以下の記事が参考になりました