Nuxt開発サーバーの「Failed to resolve dependency」警告を解消する
問題
Nuxt + @nuxt/content を使用したプロジェクトで pnpm dev を実行すると、以下のような警告が大量に表示される。
WARN Failed to resolve dependency: @nuxtjs/mdc > remark-emoji, present in client 'optimizeDeps.include'
WARN Failed to resolve dependency: @nuxtjs/mdc > remark-mdc, present in client 'optimizeDeps.include'
WARN Failed to resolve dependency: @nuxtjs/mdc > remark-rehype, present in client 'optimizeDeps.include'
WARN Failed to resolve dependency: @nuxtjs/mdc > rehype-raw, present in client 'optimizeDeps.include'
WARN Failed to resolve dependency: @nuxtjs/mdc > parse5, present in client 'optimizeDeps.include'
WARN Failed to resolve dependency: @nuxtjs/mdc > unist-util-visit, present in client 'optimizeDeps.include'
WARN Failed to resolve dependency: @nuxtjs/mdc > unified, present in client 'optimizeDeps.include'
WARN Failed to resolve dependency: @nuxtjs/mdc > debug, present in client 'optimizeDeps.include'
原因
@nuxtjs/mdc(Nuxt Content が内部で使用する MDC パーサー)が、Vite の optimizeDeps.include にこれらのパッケージを追加している。
しかし、これらのパッケージはサーバーサイドでのみ使用される Markdown パース用のライブラリであり、クライアントサイドのバンドルには含まれない。そのため、Vite がクライアント用に事前最適化しようとしても解決できず、警告が発生する。
なぜ実害はないのか
remark-*、rehype-*、unifiedなどは Markdown をパースするためのパッケージ- Nuxt Content は SSR(サーバーサイドレンダリング)でコンテンツをパースする
- 本番ビルド時は静的 HTML に変換されるため、これらのパッケージはビルド時にのみ使われる
- 警告が出ていても、ビルド自体は正常に完了する(
✔ Vite client builtが表示される)
対処法
nuxt.config.ts に vite.optimizeDeps.exclude を追加して、これらのパッケージをクライアント側の最適化対象から明示的に除外する。
// nuxt.config.ts
export default defineNuxtConfig({
// ... 他の設定 ...
vite: {
optimizeDeps: {
exclude: [
// These are server-side only packages used by @nuxtjs/mdc
// Excluding them removes "Failed to resolve dependency" warnings
'remark-emoji',
'remark-mdc',
'remark-rehype',
'rehype-raw',
'parse5',
'unist-util-visit',
'unified',
'debug'
]
}
},
// ... 他の設定 ...
})
結果
設定追加後、pnpm dev を再起動すると警告が表示されなくなる。
補足:本番環境への影響
このプロジェクトでは cloudflare-pages-static プリセットを使用しており、本番ビルド時にはすべてのページが静的 HTML に変換される。そのため:
- これらのパッケージはビルド時(サーバー側)でのみ使用される
- クライアントに配信される JavaScript バンドルには含まれない
- 本番環境のパフォーマンスには一切影響しない
この対処は開発時の警告を消すためのものであり、本番環境の動作には影響しない。