Không thể nhập các tệp svg trong bảng chữ


108

Trong typescript(*.tsx)các tệp, tôi không thể nhập tệp svg với câu lệnh này:

import logo from './logo.svg';

Transpiler nói: [ts] cannot find module './logo.svg'. Tập tin svg của tôi chỉ là <svg>...</svg>.

Nhưng trong .jstệp, tôi có thể nhập nó mà không gặp bất kỳ vấn đề nào với cùng một câu lệnh nhập. Tôi cho rằng nó có liên quan đến loại tệp svg phải được đặt bằng cách nào đó cho trình chuyển đổi ts.

Bạn có thể vui lòng chia sẻ làm thế nào để làm cho điều này hoạt động trong tệp ts?


2
các tệp svg không phải là javascript và không thể được sử dụng như các mô-đun javascript. Thay vào đó, bạn nên tải các tệp đó bằng yêu cầu http.
toskv

1
Bạn đang sử dụng Webpack? Đó là điều duy nhất tôi đã thấy hiểu một importtuyên bố như vậy . Có lẽ Webpack là thứ cho phép điều này trong JavaScript của bạn, nhưng nó không làm điều kỳ diệu tương tự trong các tệp TypeScript. (Tôi không nghĩ rằng bản thân TypeScript biết phải làm gì ở đây.)
user94559

1
Nếu bạn đang sử dụng Webpack, có thể bạn sẽ cần chia sẻ cấu hình Webpack của mình để nhận thêm trợ giúp.
user94559

2
Đọc thêm một chút về điều này, bạn có thể làm được const logo = require("./logo.svg");hoặc đơn giản là bỏ qua lỗi. (Tôi tin rằng TS vẫn nên được xuất ra mã đúng.)
user94559

Cảm ơn rât nhiều! yêu cầu hoạt động tốt! Trong trường hợp của tôi nó phải được const logo = require("./logo.svg") as string;
AngryBoy

Câu trả lời:


184

Nếu sử dụng webpack, bạn có thể thực hiện việc này bằng cách tạo tệp loại tùy chỉnh.

Tạo một tệp có tên custom.d.ts với nội dung sau:

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

Thêm custom.d.tsvào tsconfig.jsonnhư bên dưới

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

Nguồn: https://webpack.js.org/guides/typescript/#importing-other-assets


36
Có thể, bạn cần thêm nó vào includephần trong tsconfig.json .
Frederik Krautwald

12
Cảm ơn! Tôi biết nó phải được bao gồm ở đâu đó nhưng tôi không thể hình dung ở đâu. Ngay cả khi tôi nghĩ rằng nó là trong tsconfig.json nhưng tôi không biết làm thế nào để làm điều đó. Cảm ơn bình luận của bạn. Tôi đã làm một tìm kiếm và tôi thấy:"files": [ "custom.d.ts" ]
Shil Nevado

5
Bạn có thể nhận loại kiểm tra cho thành phần JSX bằng cách gõ nội dung:const content: React.FunctionComponent<React.SVGAttributes<SVGElement>>;
RedMatt

Có thể có custom.d.tstệp hoạt động trên toàn cầu để SVG có thể nằm trong một thư mục khác với custom.d.tstệp không? Tôi gặp lỗi "không thể tìm thấy mô-đun" trừ khi nó nằm trong cùng một thư mục.
Nic Scozzaro

1
Thao tác này không nhập nội dung của tệp trong Angular, nó nhập tên tệp dưới dạng chuỗi. Tôi cần nội dung. Làm thế nào để chúng tôi có được nội dung của tệp?
Routhinator

37

Cảm ơn smarx đã chỉ ra cách sử dụng require(). Vì vậy, trong trường hợp của tôi, nó phải là:

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

hoạt động tốt trong các tệp * .tsx


5
logocó thể được đặt tên tốt hơn logoPath, bởi vì đó là những gì nó trở thành.
DharmaTurtle

2
@DharmaTurtle Tôi nghĩ rằng điều đó có thể được tranh luận. Ngoài ra, nó được gọi logotrong câu hỏi, vì vậy nó là một câu trả lời tốt hơn cho câu hỏi cụ thể này.
ArneHugo

17

Thêm một custom.d.tstệp (tôi đã tạo nó trên đường dẫn gốc của dir src của tôi) với đúng loại (nhờ RedMatt ):

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

Cài đặt svg-react-loader hoặc một số khác , sau đó:

  • Sử dụng nó làm trình tải svg chính
  • Hoặc nếu bạn đang di chuyển cơ sở mã và không muốn chạm vào phần đang làm việc (JS), hãy chỉ định trình tải khi nhập:
import MySVG from '-!svg-react-loader!src/assets/images/name.svg'

Sau đó, chỉ cần sử dụng nó như một thẻ JSX:

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

4

Giải pháp mà tôi tìm thấy: Trong dự án ReactJS, trong tệp react-app-env.d.ts, bạn chỉ cần xóa khoảng trống trong nhận xét như:

Trước

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

Sau

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

Tôi hy vọng sẽ giúp bạn


Đối với những người đang sử dụng ứng dụng tạo và ứng dụng đã định cấu hình, điều này có thể giải quyết vấn đề
Daniel Chin

2

Tôi đã gặp vấn đề tương tự khi thử hướng dẫn REACT + sắp chữ.
Điều làm việc cho tôi là câu lệnh nhập sau đây.

import * as logo from 'logo.svg'

Đây là các phụ thuộc của tôi trong package.json.

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

Hy vọng nó sẽ giúp một ai đó.


1

Để sử dụng n nội dung trên mã với TypeScript , chúng ta cần hoãn loại cho những lần nhập này . Điều này yêu cầu tệp custom.d.ts biểu thị các định nghĩa tùy chỉnh cho TypeScript trong dự án của chúng tôi.

Hãy thiết lập một khai báo cho các tệp .svg:

custom.d.ts

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

Ở đây chúng tôi khai báo một mô-đun mới cho SVG bằng cách chỉ định bất kỳ lần nhập nào kết thúc bằng .svg và xác định nội dung của mô-đun là bất kỳ.


0

Có một cách khác để làm điều này mà chúng tôi đã triển khai: tạo các thành phần SVGs của bạn. Tôi đã làm điều này bởi vì nó làm tôi nghe trộm rằng tôi đang sử dụng requirecâu lệnh commonJS cùng với imports của tôi .


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

Nếu bạn đang sử dụng puglin slint, có thể anh ta đã vô hiệu hóa việc nghĩ rằng đó là một nhận xét nhưng không đọc được svg bạn cần mô-đun tập lệnh loại này chỉ cần tắt dòng và vui vẻ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.