slothis · Русский

Как исправить ошибку Cannot find module '#q-app/wrappers' в Vue + Quasar

2025-03-20 · Оригинал (корейский)

Эта статья переведена с корейского оригинала с помощью ИИ. Цены в скобках — приблизительный пересчёт. Читать оригинал на корейском →
Ааааааааааааааааааааааааааа


Возможно, у вас возникает такая ошибка, или та, что ниже.
Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: No "exports" 
Или
 ERROR(vue-tsc)  Cannot find module '#q-app/wrappers' or its corresponding type declarations.

Текущее окружение
  • vue 3.4.18
  • quasar 2.16.0
  • quasar/app-vite 2.1.4
Не знаю, когда именно Quasar изменил способ использования, но в версии, которую я сейчас использую, он отличается от старого. Особенно если вы используете CLI вместе с Vite, вы обязательно столкнетесь с этой проблемой. Ссылка

import { defineConfig } from "@quasar/app-vite";

Если это был старый способ, то теперь нужно делать так:
import { defineConfig } from '#q-app/wrappers'

Импортировать нужно именно так. При этом возникает ошибка, что #q-app не может быть импортирован. Если спросить ChatGPT или Cursor.ai, они посоветуют удалить node_modules и снова запустить npm install, или попробовать quasar clean --qconf, или импортировать старым способом. Похоже, они еще не обучились на недавних изменениях.

Основная проблема связана с багом. Патч уже вышел, но он выглядит скорее как временное решение, а не идеальное.

Если в tsconfig.json определен baseUrl, он будет конфликтовать с tsconfig.json, который Quasar создает и использует сам (тот, что использует Quasar, находится в /.quasar/tsconfig.json и определен в ключе extends).
Связанный issue на GitHub

Решение

Удалите baseUrl и path из tsconfig.json.

Ниже приведен рекомендуемый файл tsconfig.json.
{
  "extends": "./.quasar/tsconfig.json",
  "compilerOptions": {
    "esModuleInterop": true,
    "skipLibCheck": true,
    "target": "esnext",
    "allowJs": true,
    "resolveJsonModule": true,
    "moduleDetection": "force",
    "isolatedModules": true,
    "module": "preserve",
    "noEmit": true,
    "lib": [
      "esnext",
      "dom",
      "dom.iterable"
    ]
  },
В vite.config.js тоже есть похожие настройки, но их можно игнорировать, так как это пути alias для Vite. Конфликтует только tsconfig.