Svg dosyaları typcript'te içe aktarılamıyor


130

Gelen typescript(*.tsx)dosyalar bu ifadeye svg dosyası alamıyor:

import logo from './logo.svg';

Transpiler diyor ki: [ts] cannot find module './logo.svg'. svg dosyam sadece <svg>...</svg>.

Ancak .jsdosyada, aynı ithalat beyanıyla herhangi bir sorun olmadan onu içe aktarabiliyorum. Sanırım ts transpiler için bir şekilde ayarlanması gereken svg dosyası türüyle ilgisi var.

Bunun nasıl çalıştığını ts dosyalarında paylaşır mısınız?


2
svg dosyaları javascript değildir ve javascript modülleri gibi kullanılamaz. Bu dosyaları bunun yerine bir http isteği kullanarak yüklemelisiniz.
toskv

2
Webpack kullanıyor musunuz? Böyle bir importifadeyi anladığım tek şey bu . Belki Webpack, JavaScript'inizde buna izin veren şeydir, ancak TypeScript dosyalarında aynı sihri yapmıyor. (TypeScript'in burada ne yapılacağını bildiğini sanmıyorum.)
user94559

1
Webpack kullanıyorsanız, daha fazla yardım almak için muhtemelen Webpack yapılandırmanızı paylaşmanız gerekecektir.
user94559

2
Bunun hakkında biraz daha fazla const logo = require("./logo.svg");okuduğunuzda, muhtemelen hatayı yapabilir veya basitçe görmezden gelebilirsiniz. (TS'nin hala doğru kodu çıkardığına inanıyorum.)
user94559

1
neden, Webpack / React işleri karmaşıklaştırmak zorunda kaldı? Herhangi bir şeyi içeri aktarmak daha kolay olmaz mıydı import. Benim gibi bir acemi için bu şeyler cesaretimi kırıyor. 2020'de "otomatik konfigürasyonun" bir norm olması gereken yerde değil miyiz?
SimpleGuy

Yanıtlar:


211

Web paketi kullanıyorsanız, bunu özel bir tür dosyası oluşturarak yapabilirsiniz.

Aşağıdaki içeriğe sahip custom.d.ts adlı bir dosya oluşturun :

declare module "*.svg" {
  const content: any;
  export default content;
}

Ekle custom.d.tsiçin tsconfig.jsonaşağıda

"include": ["src/components", "src/custom.d.ts"]

Kaynak: https://webpack.js.org/guides/typescript/#importing-other-assets


38
Muhtemelen, tsconfig.json'dakiinclude bölüme eklemeniz gerekir .
Frederik Krautwald

12
Teşekkürler! Bir yere dahil edilmesi gerektiğini biliyordum ama nerede olduğunu hayal edemiyorum. Hatta tsconfig.json içinde olduğunu düşündüm ama nasıl yapılacağını bilmiyordum. Yorumunuz için teşekkürler. Bir arama yaptım ve şunu buldum:"files": [ "custom.d.ts" ]
Shil Nevado

6
İçeriği yazarak JSX bileşeni için tür denetimi alabilirsiniz:const content: React.FunctionComponent<React.SVGAttributes<SVGElement>>;
RedMatt

1
custom.d.tsSVG'nin custom.d.tsdosyadan farklı bir dizinde olması için dosyanın global olarak çalışması mümkün müdür ? Aynı dizinde olmadığı sürece "modül bulunamıyor" hatası alıyorum.
Nic Scozzaro

1
Bu, dosyanın içeriğini Angular'da içe aktarmaz, dosya adını bir dize olarak içe aktarır. İçeriğe ihtiyacım var. Dosyanın içeriğini nasıl elde ederiz?
Routhinator

38

Kullanımı işaret ettiğiniz için teşekkürler smarxrequire() . Benim durumumda şöyle olmalı:

const logo = require("./logo.svg") as string;

* .tsx dosyalarında sorunsuz çalışan


7
logodaha iyi adlandırılabilir logoPath, çünkü bu hale gelir.
DharmaTurtle

2
@DharmaTurtle Bunun tartışılabileceğini düşünüyorum. Ayrıca, logosoruda denir , bu nedenle bu belirli soruya olduğu gibi daha iyi bir cevaptır.
ArneHugo

@DharmaTurtle dürüst olmak gerekirse dostum, değişkenin adı çok önemli değil, neden bu kadar önemsiz bir şey yüzünden dikkatin dağıldı?
ELI7VH

19

custom.d.tsDoğru türde ( RedMatt sayesinde) bir dosya ekleyin (bunu src dizininin kök yolunda oluşturdum ):

declare module '*.svg' {
  const content: React.FunctionComponent<React.SVGAttributes<SVGElement>>;
  export default content;
}

Svg-react-loader veya başka bir şey yükleyin , ardından:

  • Ana svg yükleyici olarak kullanın
  • Veya bir kod tabanını taşıyorsanız ve çalışan parçaya (JS) dokunmak istemiyorsanız, içe aktarmada yükleyiciyi belirtin:
import MySVG from '-!svg-react-loader!src/assets/images/name.svg'

Sonra bunu bir JSX etiketi olarak kullanın:

function f() { 
  return (<MySVG />); 
}

7

Bulduğum çözüm: ReactJS projesinde, react-app-env.d.ts dosyasında aşağıdaki gibi yorumdaki alanı kaldırmanız yeterli:

Önce

// / <reference types="react-scripts" />

Sonra

/// <reference types="react-scripts" />

Sana yardım etmeyi umuyorum


Create-react-app kullanan ve eslint'i yapılandıran kişiler için bu, sorunu çözebilir
Daniel Chin

4

Bir REACT + typcript öğreticisini denerken aynı sorunu yaşadım.
Benim için işe yarayan aşağıdaki ithalat ifadesiydi.

import * as logo from 'logo.svg'

İşte package.json'daki bağımlılıklarım.

  "dependencies": {
    "react": "^16.8.4",
    "react-dom": "^16.8.4",
    "react-scripts-ts": "3.1.0"
  },

Umarım birine yardımcı olur.


2

Bunu yapmanın uyguladığımız alternatif bir yolu var: SVG bileşenlerinizi oluşturun. Bunu yaptım çünkü e-postalarımın requireyanında ortak JS ifadeleri kullandığım için beni rahatsız etti import.


2

TypeScript ile n kod üzerinde varlık kullanmak için, bu içe aktarmalar için türü ertelememiz gerekir . Bu, projemizde TypeScript için özel tanımları belirten bir custom.d.ts dosyası gerektirir .

.Svg dosyaları için bir bildirim oluşturalım:

custom.d.ts

declare module "*.svg" {
  const content: any;
  export default content;
}

Burada, .svg ile biten herhangi bir içe aktarmayı belirterek ve modül içeriğini herhangi biri olarak tanımlayarak SVG'ler için yeni bir modül bildiriyoruz.


0
    // eslint-disable-next-line spaced-comment
/// <reference types="react-scripts" />

puglin slint kullanıyorsanız, bir yorum olduğunu düşünerek devre dışı bırakmış olabilir, ancak svg'yi okumamak için bu tür komut dosyası modülüne ihtiyacınız var, sadece satırı devre dışı bırakın ve mutlu olun


-2

*.svgAşağıdakileri yaparak iş yapabildim :

Yüklemek next-images

cd /to/ur/root
npm install --save next-images

Güncelleme next.config.js

next.config.jsDosyanız yoksa , kök dizininde bir tane oluşturun. Sonra Ekle:

const withImages = require('next-images')
module.exports = withImages()

standart içe aktarma şimdi çalışmalı

import icon from './icons/thaticon.svg';

Bunun reddedildiğini görüyorum. Bu yanıtla ilgili herhangi bir geri bildiriminiz varsa lütfen bize bildirin, buna göre ayarlayabilirim.
Harley Lang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.