Задать вопрос
@hamster141095

Можно ли настроить ts.config на компиляцию как require(), так и ESM импорты?

Я использую приложение Node.js и TS 4.8, и я обновил тип файла пакета, но теперь компиляция моего проекта завершается с ошибкой.

[1] const _fileType = /#PURE/ _interopRequireWildcard(require("file-type")); [1] ^ [1] [1] Error [ERR_REQUIRE_ESM]: require() of ES Module /home/victor/Desktop/alytics/node_modules/file-type/index.js from /home/victor/Desktop/alytics/dist/routes/index.js not supported. [1] Instead change the require of /home/victor/Desktop/alytics/node_modules/file-type/index.js in /home/victor/Desktop/alytics/dist/routes/index.js to a dynamic import() which is available in all CommonJS modules.


Настройки swc
{
  "jsc": {
    "parser": {
      "syntax": "typescript",
      "tsx": false,
      "decorators": true,
      "dynamicImport": true
    },
    "target": "es2020",
    "paths": {
      "@routes/*": ["./src/routes/*"],
      "@middlewares/*": ["./src/middlewares/*"]
    },
    "baseUrl": "."
  },
  "module": {
    "type": "commonjs"
  }
}


tsconfig:
"compilerOptions": {
    "target": "es2020",
    "module": "es2020",
    "allowJs": true,
    "removeComments": true,
    "resolveJsonModule": true,
    "typeRoots": ["./node_modules/@types"],
    "sourceMap": true,
    "allowSyntheticDefaultImports": true,
    "outDir": "dist",
    "strict": true,
    "lib": ["es2020"],
    "baseUrl": ".",
    "forceConsistentCasingInFileNames": true,
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "moduleResolution": "Node",
    "skipLibCheck": true,
    "paths": {
      "@routes/*": ["./src/routes/*"],
      "@middlewares/*": ["./src/middlewares/*"]
    }
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}


Импорт пакета `file-type`
import KoaRouter from "@koa/router";
import { Context } from "koa";

import { logger } from "@middlewares/index.js";
import * as FileType from "file-type";

const router = new KoaRouter();

router.get("/", logger, (ctx: Context): void => {
  ctx.body = { message: JSON.stringify(FileType) };
});

export default router;


Насколько я понимаю, file-type использует только импорт ESM, но после компиляции этот импорт конвертируется в require(). Я читал об этой проблеме в их репозитории, но эта тема была закрыта, так как TS теперь поддерживает ESM. Как я могу настроить свой ts.config, чтобы исключить этот модуль для конвертации в `require()` ?? Есть ли способ решить эту проблему только с помощью конфигурации TS? Я нахожу единственное решение - конвертировать из commonjs в ESM (изменить type: module и добавить его в мой package.json), но я не хочу обновлять весь мой импорт, добавляя .js в конце, и я не хочу преобразовать весь мой импорт в ESM.
  • Вопрос задан
  • 83 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы