esbuild + knex:找不到模块'../../dialects/mysql/index.js'

esbuild + knex: Cannot find module '../../dialects/mysql/index.js'

我目前正在尝试将一些代码从 javascript 迁移到打字稿。此代码使用 knex 包。我可以使用 tsc 构建并 运行 它,但我想使用 esbuild 代替(为了更快的构建)。

我构建的是:

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

但是当我尝试 运行 编译代码时,我得到:

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

我不知道这个 dialect 目录是什么,也找不到任何关于它的文档。看了一下this SO question,里面的代码没看懂,错误好像更多的是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,在 tscesbuild 上效果很好。

由于某种原因,只有 esbuild 的构建失败。我首先以为我错过了一个包,我安装了 @types/node and @types/mysql 但它并没有解决我的问题。

如果有帮助,我使用以下 tsconfig.json:

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

我也遇到过这个问题,我在 esbuild GitHub.

上看到了一个相关的帖子

您只需将 knex 初始化更新为以下内容:

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

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