esbuild + knex: No se puede encontrar el módulo ‘../../dialects/mysql/index.js’
Actualmente estoy tratando de migrar un código de JavaScript a TypeScript. Este código utiliza el paquete “knex”. Soy capaz de construirlo y ejecutarlo utilizando “tsc”, pero me gustaría utilizar “esbuild” en su lugar (para una construcción más rápida).
Construyo con:
npx esbuild index.ts --bundle --platform=node --sourcemap=external --outfile=dist/index.js
Pero cuando intento ejecutar el código compilado, obtengo:
No se puede encontrar el módulo '../../dialects/mysql/index.js'
No tengo idea de qué es este directorio “dialect” y no pude encontrar ninguna documentación al respecto. Eché un vistazo a esta pregunta en Stack Overflow (https://stackoverflow.com/questions/37323425/mysql-dialect-cannot-be-fount-in-knex-browserified), pero no pude entender realmente el código que había en ella, y el error parecía estar más relacionado con “browserified”.
Aquí está el código que utilicé para reproducir el error:
import Knex from 'knex';
const knex = Knex({
client: 'mysql',
connection: {
port: 3306,
host: 'localhost',
database: 'database',
user: 'user',
password: 'password',
charset: 'utf8mb4',
},
});
const fetchData = async () => {
const data = await knex('table')
.select()
.first();
return data;
};
(async () => {
const results = await fetchData();
console.log(results);
})();
Lo interesante es que el uso únicamente del paquete “mysql” sin “knex” funcionó bien tanto con “tsc” como con “esbuild”.
Por alguna razón, solo la construcción con “esbuild” falla. Primero pensé que me faltaba algún paquete, e instalé “@types/node” y “@types/mysql” pero no solucionó mi problema.
Si ayuda, utilizo el siguiente “tsconfig.json”:
{
"compilerOptions": {
"module": "commonjs",
"moduleResolution": "node",
"outDir": "dist",
"target": "es6",
"esModuleInterop": true
}
}
davy.ai
El problema aquí parece estar en la ruta relativa del módulo
../../dialects/mysql/index.js
queknex
está intentando importar. Mientras quetsc
podría ser lo suficientemente inteligente como para resolver la ruta correcta, es posible queesbuild
no pueda hacerlo.Una solución alternativa para este problema es especificar manualmente la ruta al módulo
mysql
en la configuración deknex
, en lugar de depender de la ruta relativa. Así es como se hace:Al utilizar el paquete
mysql2/promise
y pasar el objeto de conexión directamente a la configuración deknex
, evitamos el posible problema de resolución de rutas con las importaciones deknex
. Esto debería funcionar tanto contsc
como conesbuild
.Algo a tener en cuenta es que
knex
depende del paquetemysql2
internamente, por lo tanto, debemos asegurarnos de usar el nombre adecuado del cliente en la configuración deknex
.