typescript - esbuild + knex: Nu se poate găsi modulul '../../dialects/mysql/index.js'
În prezent încerc să migrez niște cod de la JavaScript la TypeScript. Acest cod folosește pachetul knex. Pot să-l construiesc și să-l rulez folosind tsc, dar aș dori să folosesc în schimb esbuild (pentru o construcție mai rapidă).
Construiesc cu:
npx esbuild index.ts --bundle --platform=node --sourcemap=external --outfile=dist/index.js
Dar când încerc să rulez codul compilat, primesc:
Cannot find module '../../dialects/mysql/index.js'
Nu am nicio idee ce este acest director dialect și nu am găsit nicio documentație despre el. Am aruncat o privire la această întrebare SO, dar nu am reușit să înțeleg cu adevărat codul din ea, iar eroarea părea mai degrabă să fie despre browserified.
Iată codul pe care l-am folosit pentru a reproduce eroarea:
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);
})();
Lucrul interesant este că folosind doar pachetul mysql fără knex a funcționat foarte bine atât cu tsc, cât și cu esbuild.
Dintr-un anumit motiv, doar build-ul din esbuild eșuează. Mai întâi am crezut că am ratat un pachet și am instalat @types/node și @types/mysql, dar nu mi-a rezolvat problema.
Dacă ajută, folosesc următorul tsconfig.json:
{
"compilerOptions": {
"module": "commonjs",
"moduleResolution": "node",
"outDir": "dist",
"target": "es6",
"esModuleInterop": true
}
}
Răspuns #1
Aceasta este o problemă pe care am avut-o și eu și am dat peste un fir legat pe GitHub-ul esbuild.
Va trebui doar să actualizați inițializarea knex la următoarea:
import Knex from 'knex';
import KnexMysql from 'knex/lib/dialects/mysql';
const knex = Knex({
client: KnexMysql,
...
});
