javascript - Eslint-regel/Vscode-inställning för att förhindra import av mappar utan index
Fråga :
Finns det en ESLint-regel för att tvinga användning av */index vid imports.
Exempel :
Filstruktur:
utils/
- index.js
- a.js
- b.js
main.js
main.js
// WRONG
import utils from "./utils";
// OK
import utils from "./utils/index";
Varför
Jag behöver detta eftersom mitt projekt använder tscpaths för att ersätta absoluta sökvägar med relativa sökvägar efter TypeScript-kompilering, men av någon anledning ersätter det inte när */index inte är närvarande.
Alternativ
Om regeln inte finns, finns det en VSCode-inställning som automatiskt skulle lägga till index i automatiska importer?
Svar #1
Alternativ 1, omstrukturera ditt projekt så att det inte finns någon index.js att importera. Den historiska anledningen till att det kallas index var att innehålla ett index över innehållet i den mappen, för att samla de typiskt exporterade sakerna i ett snyggt paket så att folk inte behöver titta på detaljerna i mappen. Om det inte är vad du behöver ska du helt enkelt inte kalla det index. Du kan förmodligen bara byta namn på alla till main.js, göra en mass-sök-och-ersätt på importerna och framtida automatiska importer från ditt IDE kommer att fungera.
Alternativ 2, Om det inte finns för många mappar där detta är ett problem kan du skriva en konfiguration för no-internal-imports-regeln så att importering av en mapp med namn betraktas som en "intern referens". Detta är förmodligen den sämsta lösningen eftersom det inte finns någon automatisk rättelse och att lägga till nya mappar kräver att eslint-konfigurationen uppdateras, men detta kan vara bra att nämna som ett alternativ.
Alternativ 3, skapa en modifierad version av no-useless-path-segments-regeln som gör detta, den har för närvarande motsatt logik jämfört med vad du vill, så du skulle modifiera koden runt raderna 95-108 för att kontrollera om importen inte är en indeximport men löses till en, föreslå fixen:
// assuming your rule has an option called enforceIndex
if (options && options.enforceIndex && !regexUnnecessaryIndex.test(importPath)) {
// if the import path is not pointing to an index file check if it resolves to a path that looks like an index file
const resolved_path = resolve(importPath, context);
if(regexUnnecessaryIndex.test(resolved_path)){
// if the resolved_path resolves to something that looks like an index then suggest adding /index
return reportWithProposedPath(`${importPath}/index`);
}
}
Men det faktum att det finns en ESLint-regel som tvingar fram exakt motsatt logik än den du vill ha bör vara en ganska tydlig indikator på att det du frågar efter inte riktigt anses vara bra form.
