typescript - esbuild + knex: Δεν είναι δυνατή η εύρεση του module '../../dialects/mysql/index.js'


Αυτή τη στιγμή προσπαθώ να μεταφέρω κάποιο κώδικα από Javascript σε Typescript. Αυτός ο κώδικας χρησιμοποιεί το πακέτο knex. Μπορώ να τον δημιουργήσω και να τον τρέξω χρησιμοποιώντας tsc, αλλά θα ήθελα να χρησιμοποιήσω esbuild αντί για αυτό (για ταχύτερη δημιουργία).

Κατασκευάζω με:

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

Αλλά όταν προσπαθώ να τρέξω τον μεταγλωττισμένο κώδικα, παίρνω:

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

Δεν έχω καμία ιδέα τι είναι αυτός ο κατάλογος dialect, και δεν μπόρεσα να βρω καμία τεκμηρίωση γι' αυτόν. Ρίξα μια ματιά σε αυτήν την ερώτηση στο SO, αλλά δεν μπόρεσα πραγματικά να κατανοήσω τον κώδικα σε αυτήν, και το σφάλμα φαινόταν να αφορά περισσότερο το browserified.

Εδώ είναι ο κώδικας που χρησιμοποίησα για να αναπαράγω το σφάλμα:

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

Το ενδιαφέρον είναι ότι χρησιμοποιώντας μόνο το πακέτο mysql χωρίς το knex λειτούργησε τέλεια και με τα tsc και esbuild.

Για κάποιο λόγο, μόνο η κατασκευή από το esbuild αποτυγχάνει. Αρχικά σκέφτηκα ότι μου έλειπε κάποιο πακέτο, και εγκατέστησα τα @types/node και @types/mysql αλλά αυτό δεν έλυσε το πρόβλημά μου.

Αν βοηθάει, χρησιμοποιώ το ακόλουθο tsconfig.json:

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

Απάντηση #1

Αυτό είναι ένα πρόβλημα που είχα κι εγώ και βρήκα ένα σχετικό νήμα στο GitHub του esbuild.

Θα χρειαστεί απλώς να ενημερώσετε την αρχικοποίηση του knex σας ως εξής:

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

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