reactjs - Hur man gör valfria peer-dependencies verkligen valfria
Jag har ett NPM-paket som erbjuder två saker: Kärnfunktionalitet i form av React-hooks och UI-komponenter som använder dessa kärnfunktionaliteter.
Min idé var ursprungligen att skapa två paket, ett för kärnfunktionerna och ett för komponenterna. Så att om du inte vill använda komponenterna direkt, skulle du fortfarande kunna använda bibliotekets kärnfunktioner. Efter att ha arbetat med biblioteket fann jag att det var överdrivet att göra två paket, eftersom kärnfunktionaliteten i princip är 2 Hooks med mindre än 200 rader kod.
Så jag gick vägen att lägga till UI-komponenternas beroenden som peer-beroenden, och förväntade mig att när jag markerar dem som valfria, skulle du inte behöva installera dem om du inte behövde UI-delarna. Med att markera dem som valfria menar jag:
"peerDependenciesMeta": {
"@material-ui/core": {
"optional": true
},
}
Nu är problemet att även om jag inte importerar UI-delarna från mitt bibliotek till ett testprojekt jag har satt upp, så kraschar appen eftersom den försöker leta efter de valfria beroendena.
Mina frågor:
- Är det här förväntat beteende?
- Vad är valfritt med dessa peer-beroenden, om appen kraschar när de moduler som mitt bibliotek beror på inte finns?
- Finns det inga alternativ för mig annat än att göra ett separat paket för komponenterna?
Förhoppningsvis kan någon kasta lite ljus i mörkret för mig.
Svar #1
Det verkar som att den enda verkliga lösningen på detta är att verkligen separera kärnfunktionaliteten från UI-delarna. Annars kommer det alltid att finnas beroenden installerade som en användare kanske inte vill ha.
Svar #2
peerDependencies är inte valfria, det är paket som biblioteket använder men de är inte inkluderade i bibliotekets kod.
Till exempel, om du har ett React-komponentbibliotek, är react och react-dom peerDependencies, vilket betyder att biblioteket behöver dem för att fungera men de ska inte bundlas med bibliotekets komponenter.
Så när du använder biblioteket i din app använder det React-paketet från appen, inte från själva biblioteket.