Weboldal keresés

typescript - esbuild + knex: Nem található a(z) '../../dialects/mysql/index.js' modul


Jelenleg azt próbálom, hogy néhány kódot Javascriptből Typescriptbe migráljak. Ez a kód a knex csomagot használja. Képes vagyok a kódot tsc-vel buildelni és futtatni, de inkább a esbuild-et szeretném használni (gyorsabb build miatt).

Építek ezzel:

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

De amikor megpróbálom futtatni a lefordított kódot, ezt kapom:

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

Fogalmam sincs, mi ez a dialect könyvtár, és nem találtam róla semmilyen dokumentációt. Megnéztem ezt a SO kérdést, de igazából nem értettem a benne lévő kódot, és a hibának inkább a browserified-dal kapcsolatosnak tűnt.

Itt van a kód, amit az hiba reprodukálásához használtam:

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

Érdekes dolog, hogy csak a mysql csomagot használva knex nélkül mind a tsc, mind az esbuild esetén remekül működött.

Valamilyen oknál fogva csak a esbuild által készített build hibás. Először azt hittem, hogy kihagytam egy csomagot, ezért telepítettem az @types/node és @types/mysql csomagokat, de ez nem oldotta meg a problémámat.

Ha segít, a következő tsconfig.json-t használom:

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

Válasz #1

Ez egy probléma, amivel nekem is volt dolgom, és találtam egy kapcsolódó témát az esbuild GitHubon.

Csak frissítened kell a knex inicializációdat a következőre:

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

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