typescript - esbuild + knex: Modul '../../dialects/mysql/index.js' kann nicht gefunden werden
Ich versuche derzeit, etwas Code von JavaScript nach TypeScript zu migrieren. Dieser Code verwendet das Knex-Paket. Ich kann ihn mit tsc bauen und ausführen, aber ich würde stattdessen esbuild verwenden (für einen schnelleren Build).
Ich baue mit:
npx esbuild index.ts --bundle --platform=node --sourcemap=external --outfile=dist/index.js
Aber wenn ich versuche, den kompilierten Code auszuführen, erhalte ich:
Cannot find module '../../dialects/mysql/index.js'
Ich habe keine Ahnung, was dieses dialect-Verzeichnis ist, und konnte keine Dokumentation darüber finden. Ich habe mir diese SO-Frage angesehen, konnte den Code darin aber nicht wirklich verstehen, und der Fehler schien eher mit browserified zusammenzuhängen.
Hier ist der Code, den ich verwendet habe, um den Fehler zu reproduzieren:
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);
})();
Interessant ist, dass die Verwendung nur des mysql-Pakets ohne knex sowohl mit tsc als auch esbuild großartig funktionierte.
Aus irgendeinem Grund schlägt nur der Build von esbuild fehl. Zuerst dachte ich, ich hätte ein Paket verpasst, und habe @types/node und @types/mysql installiert, aber das hat mein Problem nicht gelöst.
Wenn es hilft, verwende ich die folgende tsconfig.json:
{
"compilerOptions": {
"module": "commonjs",
"moduleResolution": "node",
"outDir": "dist",
"target": "es6",
"esModuleInterop": true
}
}
Antwort #1
Das ist ein Problem, das ich ebenfalls hatte, und ich bin auf einen verwandten Thread auf dem esbuild GitHub gestoßen.
Sie müssen nur Ihre Knex-Initialisierung wie folgt aktualisieren:
import Knex from 'knex';
import KnexMysql from 'knex/lib/dialects/mysql';
const knex = Knex({
client: KnexMysql,
...
});
