Webpack: Module not found: Error: Can't resolve 'X'
Cómo solucionar el error 'Module not found: Can't resolve' en Webpack. Causas por rutas incorrectas, alias no configurados y polyfills de Node.js.
¿Por qué ocurre?
Webpack no puede resolver el módulo porque: - La ruta del import es incorrecta (relativa mal escrita) - El paquete no está instalado (`npm install` pendiente) - Los alias de Webpack no están configurados (`@/components/...`) - En Webpack 5: módulos de Node.js core (`path`, `crypto`, `fs`) ya no se polyfillean automáticamente - Case sensitivity: en Linux, `import './Button'` falla si el archivo se llama `button.js`
Solución paso a paso
1. Verificar que el paquete está instalado
npm install nombre-del-paquete
# o
npm install # instalar todas las dependencias
2. Revisar la ruta del import
// ❌ Ruta mal escrita
import Header from './components/header' // ¿existe ese archivo?
import utils from '../utills/helpers' // typo: "utills"// ✅ Ruta correcta
import Header from './components/Header' // case sensitive en Linux
import utils from '../utils/helpers'
3. Configurar alias en webpack.config.js
const path = require('path');module.exports = {
resolve: {
alias: {
// ✅ Permite usar @/ como raíz del proyecto
'@': path.resolve(__dirname, 'src'),
// ✅ Alias específicos
'@components': path.resolve(__dirname, 'src/components'),
'@utils': path.resolve(__dirname, 'src/utils'),
},
extensions: ['.js', '.jsx', '.ts', '.tsx', '.json']
}
};
// Ahora puedes usar:
import Header from '@/components/Header'
import { formatDate } from '@utils/date'
4. Polyfills de Node.js en Webpack 5
# Instalar polyfills necesarios
npm install --save-dev crypto-browserify stream-browserify buffer process
// webpack.config.js
const webpack = require('webpack');module.exports = {
resolve: {
fallback: {
"crypto": require.resolve("crypto-browserify"),
"stream": require.resolve("stream-browserify"),
"buffer": require.resolve("buffer"),
"path": require.resolve("path-browserify"),
"fs": false, // No disponible en browser
"net": false,
"tls": false,
}
},
plugins: [
new webpack.ProvidePlugin({
process: 'process/browser',
Buffer: ['buffer', 'Buffer'],
}),
]
};
5. Extensions — importar sin extensión
// webpack.config.js
module.exports = {
resolve: {
extensions: ['.tsx', '.ts', '.jsx', '.js', '.json']
}
};// Ahora funciona sin extensión:
import MyComponent from './MyComponent' // busca .tsx, .ts, .jsx, .js
Cómo evitarlo en el futuro
- Ejecuta `npm install` después de clonar el repositorio - Configura alias desde el inicio para evitar rutas relativas complejas (`../../`) - En Webpack 5, revisa la [documentación de node polyfills](https://webpack.js.org/configuration/resolve/#resolvefallback) si usas librerías que dependían de Node.js APIs - En Linux, asegúrate de que los nombres de archivos son consistentes en mayúsculas/minúsculas
¿Quieres que una IA te ayude? Genera el prompt perfecto para tu error:
Generador de Prompts