typescript - esbuild + knex: Moduulia '../../dialects/mysql/index.js' ei löydy


Yritän parhaillani siirtää joitakin koodeja Javascriptistä Typescriptiin. Tämä koodi käyttää knex-pakettia. Pystyn rakentamaan ja ajamaan sen käyttämällä tsc, mutta haluaisin käyttää sen sijaan esbuild (nopeampaa rakennetta varten).

Rakennan kanssa:

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

Mutta kun yritän suorittaa käännetyn koodin, saan:

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

Minulla ei ole aavistustakaan, mikä tämä dialect-hakemisto on, enkä löytänyt siitä mitään dokumentaatiota. Katselin tätä SO-kysymystä, mutta en oikein ymmärtänyt siinä olevaa koodia, ja virhe vaikutti liittyvän enemmän browserified.

Tässä on koodi, jota käytin virheen toistamiseen:

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

Mielenkiintoinen asia on, että käyttämällä vain mysql-pakettia ilman knex-pakettia toimi loistavasti sekä tsc:n että esbuild:n kanssa.

Jostain syystä vain esbuild-rakennus epäonnistuu. Aluksi luulin, että olin unohtanut paketin, ja asensin @types/node ja @types/mysql, mutta se ei ratkaissut ongelmaani.

Jos se auttaa, käytän seuraavaa tsconfig.json:

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

Vastaus #1

Tämä on ongelma, jonka kanssa olen myös ollut, ja törmäsin siihen liittyvään keskusteluun esbuildin GitHubissa.

Sinun tarvitsee vain päivittää Knexin alustus seuraavasti:

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

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