What Causes This Warning?
This warning appears when Nuxt cannot use the native file system watcher and falls back to chokidar, a JavaScript-based file watcher. This typically happens on certain operating systems or file systems.
Why It Matters
| Watcher | Performance | CPU Usage |
|---|---|---|
| Native (fs.watch) | Fast | Low |
| Chokidar | Slower | Higher |
Chokidar works but uses more system resources and may have slightly delayed file change detection.
Common Causes
1. Network File Systems
Watching files over NFS, CIFS, or other network mounts:
# Files on network drive
/mnt/network-drive/my-nuxt-app # May not support native watching
2. Docker/Container Volumes
# docker-compose.yml
volumes:
- ./src:/app/src # Mounted volumes may need chokidar
3. WSL2 with Windows Files
# Accessing Windows files from WSL
/mnt/c/Users/me/projects/nuxt-app # Cross-filesystem issues
4. File System Limits
# Linux: Too many files to watch
cat /proc/sys/fs/inotify/max_user_watches
# If this is too low, native watching fails
The Fix
Fix 1: Increase inotify Watches (Linux)
# Temporary fix
sudo sysctl fs.inotify.max_user_watches=524288
# Permanent fix
echo "fs.inotify.max_user_watches=524288" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Fix 2: Use Local File System
# Instead of network drive
mv /mnt/network/project ~/local-project
# Instead of /mnt/c in WSL
mv /mnt/c/project ~/project
Fix 3: Configure Vite Watcher
// nuxt.config.ts
export default defineNuxtConfig({
vite: {
server: {
watch: {
// Use polling for problematic file systems
usePolling: true,
interval: 1000 // Check every second
}
}
}
})
Fix 4: Docker Configuration
# docker-compose.yml
services:
app:
environment:
- CHOKIDAR_USEPOLLING=true
volumes:
- ./src:/app/src:delegated # Better performance on macOS
// nuxt.config.ts (for Docker)
export default defineNuxtConfig({
vite: {
server: {
watch: {
usePolling: true
}
}
}
})
Fix 5: WSL2 Best Practices
# Clone project inside WSL filesystem (not /mnt/c)
cd ~
git clone https://github.com/user/project
cd project
npm install
npm run dev
Chokidar Configuration
If you must use chokidar, optimize it:
// nuxt.config.ts
export default defineNuxtConfig({
vite: {
server: {
watch: {
// Reduce watched files
ignored: [
'**/node_modules/**',
'**/.git/**',
'**/dist/**',
'**/.nuxt/**'
]
}
}
}
})
Performance Optimization
Reduce Watched Directories
// nuxt.config.ts
export default defineNuxtConfig({
watch: [
// Only watch necessary paths
'~/composables',
'~/utils'
],
vite: {
server: {
watch: {
ignored: [
'!**/node_modules/your-local-package/**'
]
}
}
}
})
Disable Watch in CI
// nuxt.config.ts
export default defineNuxtConfig({
vite: {
server: {
watch: process.env.CI ? null : {} // Disable in CI
}
}
})
Debugging
Check Current Watcher
// nuxt.config.ts
export default defineNuxtConfig({
hooks: {
'builder:watch'(event, path) {
console.log('File changed:', path, 'Event:', event)
}
}
})
Monitor Performance
# Watch CPU usage during development
top -p $(pgrep -f "nuxt dev")
# Or use htop for better visualization
htop
Platform-Specific Solutions
macOS
# Increase file descriptor limit
ulimit -n 10240
Windows (Native, not WSL)
// nuxt.config.ts
export default defineNuxtConfig({
vite: {
server: {
watch: {
usePolling: true,
interval: 100
}
}
}
})
Linux
# Check current limit
cat /proc/sys/fs/inotify/max_user_watches
# Increase if needed
echo "fs.inotify.max_user_watches=524288" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Quick Checklist
- Use local filesystem instead of network drives
- In WSL2, work in Linux filesystem (not /mnt/c)
- Increase inotify watches on Linux
- Use polling in Docker environments
- Ignore unnecessary directories
- Optimize chokidar settings if unavoidable