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