javascript - Kan ikke finne SVG-ressurser med Parcel i React og TS
Jeg har lagt til Parcel i et create-react-app-prosjekt som bruker Typescript-malen. Jeg prøver å legge til SVG-er i den genererte JS-filen min i henhold til anbefalingene fra dokumentasjonen deres. Jeg er ikke sikker på om det er noe som må gjøres annerledes i TS, men jeg satte opp prosjektet mitt som de foreslo i deres JSX-eksempler, og det fungerte ikke:
.parcelrc
{
"extends": "@parcel/config-default",
"transformers": {
"jsx:*.svg": ["...", "@parcel/transformer-svg-react"]
}
}
Merk: Jeg har lagt til transformer-tillegget i mine utviklingsavhengigheter.
Komponent.tsx
import BriefcaseSvg from "jsx:../../assets/briefcase.svg";
// ...later in my return statement:
<img src={BriefcaseSvg} alt="work icon" />
// I've also tried
<BriefcaseSvg/>
Hver gang jeg får følgende feil:
Cannot resolve dependency 'jsx:../../assets/briefcase.svg'Jeg har også prøvd å konvertere begge jsx-deklarasjonene til tsx.
Jeg har lagt til Parcel på toppen av det standard Webpack-byggeverktøyet du får med CRA. Webpack har ingen problemer og viser ikonet helt fint. Parcel klarte også å kjøre en bygging når jeg ikke inkluderte denne SVG-pluginen, men skrev ut SVG-en separat i sin egen fil.
Jeg vil at alt skal ende opp i én js-fil. Hvordan kan jeg oppnå dette med Parcel, React og TS?
Svar #1
Standard Parcel-konfigurasjonen definerer en SVG-transformator og optimizer, som ikke håndterer importene riktig. Du kan følge problemet på GitHub på https://github.com/parcel-bundler/parcel/issues/7587.
Som en midlertidig løsning (for enhver type import), trenger du ikke å importere en transformer.
Erstatt "jsx:" med "url:" i importen din slik:
import BriefcaseSvg from "url:../../assets/briefcase.svg";
Og bruk src-attributtet, ikke en komponent.
<img src={BriefcaseSvg} alt="work icon" />
Du kan lese mer om syntaksen på https://github.com/parcel-bundler/parcel/pull/4055. Det fungerer bare i JS og var ment å støtte import av filer som ikke er eksplisitt støttet.
