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,
  ...
});