W typescript(*.tsx)
plikach nie mogę zaimportować pliku SVG z tym oświadczeniem:
import logo from './logo.svg';
Transpiler mówi: [ts] cannot find module './logo.svg'.
Mój plik SVG jest po prostu <svg>...</svg>
.
Ale w .js
pliku mogę go zaimportować bez żadnych problemów z dokładnie tą samą instrukcją importu. Przypuszczam, że ma to coś wspólnego z typem pliku svg, który musi być jakoś ustawiony dla transpilera ts.
Czy mógłbyś podzielić się, jak to działa w plikach ts?
typescript
svg
AngryBoy
źródło
źródło
import
stwierdzenie. Być może Webpack pozwala na to w twoim JavaScript, ale nie robi tej samej magii w plikach TypeScript. (Nie sądzę, żeby sam TypeScript wiedział, co tu robić.)const logo = require("./logo.svg");
lub po prostu zignorować błąd. (Uważam, że TS powinien nadalimport
. Dla nowicjusza takiego jak ja te rzeczy mnie zniechęcają. Czy nie jesteśmy w 2020 roku, w którym „autokonfiguracja” powinna być normą?Odpowiedzi:
Jeśli używasz pakietu webpack, możesz to zrobić, tworząc plik typów niestandardowych.
Utwórz plik o nazwie custom.d.ts z następującą zawartością:
declare module "*.svg" { const content: any; export default content; }
Dodaj
custom.d.ts
dotsconfig.json
jak poniżej"include": ["src/components", "src/custom.d.ts"]
Źródło: https://webpack.js.org/guides/typescript/#importing-other-assets
źródło
include
sekcji w tsconfig.json ."files": [ "custom.d.ts" ]
const content: React.FunctionComponent<React.SVGAttributes<SVGElement>>;
custom.d.ts
plik działał globalnie, aby plik SVG mógł znajdować się w innym katalogu niżcustom.d.ts
plik? Wyświetlany jest błąd „nie można znaleźć modułu”, chyba że znajduje się on w tym samym katalogu.Dzięki smarx za wskazanie użycia
require()
. Więc w moim przypadku powinno to być:const logo = require("./logo.svg") as string;
który działa dobrze w plikach * .tsx
źródło
logo
mogłaby być lepiej nazwanalogoPath
, bo tak właśnie się staje.logo
w pytaniu, więc jest lepszą odpowiedzią na to konkretne pytanie.Dodaj
custom.d.ts
plik (utworzyłem go na ścieżce głównej mojego katalogu src) z odpowiednim typem (dzięki RedMatt ):declare module '*.svg' { const content: React.FunctionComponent<React.SVGAttributes<SVGElement>>; export default content; }
Zainstaluj svg-react-loader lub inny , a następnie:
import MySVG from '-!svg-react-loader!src/assets/images/name.svg'
Następnie użyj go jako tagu JSX:
function f() { return (<MySVG />); }
źródło
Rozwiązanie, które znalazłem: W projekcie ReactJS w pliku React-app-env.d.ts po prostu usuwasz spację w komentarzu np .:
Przed
// / <reference types="react-scripts" />
Po
/// <reference types="react-scripts" />
Mam nadzieję, że ci pomogę
źródło
Miałem ten sam problem podczas wypróbowywania samouczka na maszynie REACT +.
U mnie zadziałało następujące oświadczenie dotyczące importu.
import * as logo from 'logo.svg'
Oto moje zależności w package.json.
"dependencies": { "react": "^16.8.4", "react-dom": "^16.8.4", "react-scripts-ts": "3.1.0" },
Mam nadzieję, że to komuś pomoże.
źródło
Wdrożyliśmy alternatywny sposób: utwórz komponenty SVG. Zrobiłem to, ponieważ denerwowało mnie, że używam zwykłych
require
instrukcji JS obok moichimport
.źródło
Aby użyć n zasobów w kodzie z TypeScript , musimy odroczyć typ tych importów . Wymaga to pliku custom.d.ts , który oznacza niestandardowe definicje dla języka TypeScript w naszym projekcie.
Ustawmy deklarację dla plików .svg:
custom.d.ts
declare module "*.svg" { const content: any; export default content; }
Tutaj deklarujemy nowy moduł dla plików SVG, określając dowolny import, który kończy się na .svg i definiując zawartość modułu jako dowolną.
źródło
// eslint-disable-next-line spaced-comment /// <reference types="react-scripts" />
jeśli używasz puglin slint może być tak, że wyłączył myślenie, że to komentarz, ale nie chcesz czytać svg, potrzebujesz tego modułu skryptu typu po prostu wyłącz linię i bądź szczęśliwy
źródło
Udało mi się to zrobić
*.svg
, wykonując następujące czynności:zainstalować
next-images
aktualizacja
next.config.js
Jeśli nie masz
next.config.js
pliku, utwórz go w katalogu głównym. Następnie dodaj:const withImages = require('next-images') module.exports = withImages()
standardowy import powinien teraz działać
import icon from './icons/thaticon.svg';
źródło