Next.js + Docker環境でhot reloadが効かないときの対処法

これはなに Link to this heading

Next.js 13の環境をDockerで作ってNextアプリを実行したらホットリロードされなかった。 そのときの対処法を残す。

どうすればよいのか Link to this heading

2つのことをする必要がある。

まず、環境変数にWATCHPACK_POLLING=trueを追加する。 Docker Composerを使っているなら、docker-compose.yamlenvironmentに渡せばよい。

docker-compose.yaml
frontend:
    environment:
        - WATCHPACK_POLLING=true

devcontainerを使っているなら、devcontainer.jsoncontainerEnvに渡せばよい。

devcontainer.json
{
  "containerEnv": {
    "WATCHPACK_POLLING": "true"
  }
}

次に、next.config.jswebpackプロパティを追加する。

next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  reactStrictMode: true,
+ // hot reload
+ webpack: (config, { dev }) => {
+   if (dev) {
+     config.watchOptions = {
+       poll: 1000,
+       aggregateTimeout: 200,
+     };
+   }
+   return config;
+ },
}

module.exports = nextConfig

これでホットリロードが効くようになる。ただし、0.5秒程度の遅延が入る。

環境 Link to this heading

  • next : 13.1.6
  • react : 18.2.0
  • typescript : 4.9.5

効果がなかった方法 Link to this heading

  • 環境変数にCHOKIDAR_USEPOLLING=trueを追加→解決しなかった
  • next.config.jsに下記を追加→そんなプロパティはないとwarningが出た
next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  reactStrictMode: true,
+ // hot reload
+ webpackDevMiddleware: config => {
+   config.watchOptions = {
+     poll: 800,
+     aggregateTimeout: 300,
+   }
+   return config
+ },
}

module.exports = nextConfig

表示された警告を下記に示しておく。

$ yarn dev
yarn run v1.22.19
$ next dev
ready - started server on 0.0.0.0:3000, url: http://localhost:3000
warn  - Invalid next.config.js options detected:
  - The root value has an unexpected property, webpackDevMiddleware, which is not in the list of allowed properties (amp, analyticsId, assetPrefix, basePath, cleanDistDir, compiler, compress, crossOrigin, devIndicators, distDir, env, eslint, excludeDefaultMomentLocales, experimental, exportPathMap, generateBuildId, generateEtags, headers, httpAgentOptions, i18n, images, modularizeImports, onDemandEntries, optimizeFonts, output, outputFileTracing, pageExtensions, poweredByHeader, productionBrowserSourceMaps, publicRuntimeConfig, reactStrictMode, redirects, rewrites, sassOptions, serverRuntimeConfig, skipMiddlewareUrlNormalize, skipTrailingSlashRedirect, staticPageGenerationTimeout, swcMinify, trailingSlash, transpilePackages, typescript, useFileSystemPublicRoutes, webpack).

See more info here: https://nextjs.org/docs/messages/invalid-next-config

参考文献・URL Link to this heading

Licensed under CC BY-NC-SA 4.0
最終更新 11月 04, 2023
Hugo で構築されています。
テーマ StackJimmy によって設計されています。