typescript - Relative Importe in einer mit nx erstellten Next-App unter Verwendung von VS Code
Ich habe ein Problem mit einem Next.js-Projekt, das mit nx und VS Code aufgesetzt wurde:
Wenn ich versuche, eine Komponente mit VS Code automatisch zu importieren, wird ein absoluter Import erzeugt, der sofort die @nrwl/nx/enforce-module-boundaries eslint-Regel auslöst, wodurch die aktuelle Datei ungültig wird.
Zum Beispiel mit Ordnerstruktur:
apps/my-app/
pages/
entity/
new/
index.tsx
components/
Loading.tsx
Der generierte Import wird sein:
// in my-app/pages/entity/new/index.tsx
import Loading from 'apps/my-app/components/Loading'
Während ich erwarte:
import Loading from '../../../components/Loading'
VS Code hat eine Einstellung, um immer relative Pfade für Importe zu verwenden, aber das wird mich daran hindern, Bibliotheken auf die richtige Weise zu importieren (@scope/lib).
Gibt es eine mögliche Konfiguration, die automatische Importe wie erwartet funktionieren lässt?
Antwort #1
Sie können die paths-Eigenschaft in der tsconfig.base.json-Datei im Stammverzeichnis Ihres Projekts konfigurieren. Wenn Sie sie zu anderen tsconfig-Dateien hinzufügen, funktioniert es nicht, die richtige Datei ist die tsconfig.base.json-Datei im Stammverzeichnis Ihres Projekts.
Ausgehend von deinem Beispiel kannst du Folgendes zur paths-Option hinzufügen.
"@my-app/*": ["apps/my-app/*"]
Jetzt können Sie ../../../components/Loading zu @my-app/components/Loading ändern.
Detaillierteres Beispiel (Hinweis: Ich habe eine Reihe der anderen Optionen, die in Ihrer tsconfig.base.json-Datei sein sollten, aus Gründen der Lesbarkeit gelöscht)
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@my-app/*": [
"apps/my-app/*"
]
}
}
Quelle und weitere Informationen im offiziellen TS-Handbuch: https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping
Antwort #2
Für diejenigen, die hierher kommen, ohne dass dies gelöst wird. (Verwendung von nx Monorepo)
Fehlerbehebung bei den 2 Fehlern (TS-Fehler und Lint-Fehler):
Zuerst der Alias-Fehler: Modul '@account/components/something' oder dessen entsprechende Typdeklarationen können nicht gefunden werden.
- Fügen Sie in Ihrer Basis-tsconfig.base.json (nicht in tsconfig.json unter Ihren Apps, da diese überschrieben wird) Folgendes hinzu:
"compilerOptions":{
...
baseUrl:"." // Try "src" as well incase of boiler plates or if your resolved path (on the error) is missing an src.
path: {
"@account/*": ["app/*"],
"@account/components/*": ["app/components/*"]
}
},
Das Obige wird sich auflösen:
import { authMiddleware } from '@account/components/something';von
import { authMiddleware } from '../../../components/something';Für Lint-Fehler: Projekte sollten relative Importe verwenden, um aus anderen Dateien innerhalb desselben Projekts zu importieren - eslint-Regel @nrwl/nx/enforce-module-boundaries schlägt fehl
- Fügen Sie "allowCircularSelfDependency": true hinzu.
"@nrwl/nx/enforce-module-boundaries": [
"error",
{
"allowCircularSelfDependency": true, -> This may solve the lint error.
"allow": ["@account/**"], -> // White list the lint error.
...
}
- Whitelist die Ordner: Füge "erlauben": [@foldername] hinzu
"@nrwl/nx/enforce-module-boundaries": [
"error",
{
"allow": ["@account/**"], -> // White list the lint error.
...
}
Das sollte es beheben.
