typescript - esbuild + knex: Kan inte hitta modulen '../../dialects/mysql/index.js'


Jag försöker för närvarande migrera viss kod från JavaScript till TypeScript. Denna kod använder paketet knex. Jag kan bygga och köra den med tsc, men jag skulle vilja använda esbuild istället (för snabbare byggprocess).

Jag bygger med:

npx esbuild index.ts --bundle --platform=node --sourcemap=external --outfile=dist/index.js

Men när jag försöker köra den kompilerade koden får jag:

Cannot find module '../../dialects/mysql/index.js'

Jag har ingen aning om vad den här dialect-katalogen är, och kunde inte hitta någon dokumentation om den. Jag tog en titt på den här SO-frågan, men kunde egentligen inte förstå koden i den, och felet verkade handla mer om browserified.

Här är koden jag använde för att återskapa felet:

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);
})();

Intressant är att genom att använda endast mysql-paketet utan knex fungerade det utmärkt med både tsc och esbuild.

Av någon anledning är det bara bygget från esbuild som misslyckas. Jag trodde först att jag hade missat ett paket, och jag installerade @types/node och @types/mysql men det löste inte mitt problem.

Om det hjälper, använder jag följande tsconfig.json:

{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist",
    "target": "es6",
    "esModuleInterop": true
  }
}

Svar #1

Det här är ett problem jag också har haft och jag stötte på en relaterad tråd på esbuilds GitHub.

Du behöver bara uppdatera din knex-initialisering till följande:

import Knex from 'knex';
import KnexMysql from 'knex/lib/dialects/mysql';

const knex = Knex({
  client: KnexMysql,
  ...
});