Как правильно импортировать nanoid?

import { nanoid } from "nanoid";

export class User {
...
@prop({ required: true, default: () => nanoid() })
  verificationCode: string;
...
}


Ошибка:
Error [ERR_REQUIRE_ESM]: require() of ES Module node_modules/nanoid/index.js from user.model.ts not supported.
Instead change the require of index.js in user.model.ts to a dynamic import() which is available in all CommonJS modules.


tsconfig.json
{
  "compilerOptions": {
    "target": "ES2016",
    "module": "CommonJS",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "strictPropertyInitialization": false,
  }
}
  • Вопрос задан
  • 387 просмотров
Решения вопроса 1
Так как вы компилируете ваш код (в частности модуль user.model.ts) в формат модуля CommonJS, то в JS-выхлопе после компиляции будут вызовы require. Судя по чейнджлогу для версии 4.0 Ситник выпилил нафиг поддержку CommonJS в 4-й версии, однако она остаётся в версии 3 и будет некоторое время поддерживаться. Вы не можете взять и из CommonJS-модуля сделать require ES-модуля (а в пакете версии 4 только ES-модули и остались).

Следовательно, в зависимости от того, что у вас в проекте и насколько он большой:
  • вы можете задуматься о переходе в своём проекте на использование ES-модулей. Для этого нужно поменять опцию module в tsconfig.json на es2015/es2020/es2022. Это самый предподчтительный вариант, но все остальные ваши инструменты и библиотеки должны быть готовы работать с ES-модулями
  • вы можете откатиться на nanoid третьей версии
  • вы можете использовать динамический импорт, как вам и предлагают, но мне кажется вам проще взять версию 3
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы