Я использую приложение 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.