টাইপ স্ক্রিপ্টে এসভিজি ফাইলগুলি আমদানি করতে অক্ষম


131

ইন typescript(*.tsx)ফাইল আমি এই বিবৃতি সঙ্গে SVG ফাইল ইম্পোর্ট পারে না:

import logo from './logo.svg';

ট্রান্সপ্লেলার বলেছেন: [ts] cannot find module './logo.svg'. আমার এসভিজি ফাইলটি ঠিক <svg>...</svg>

তবে .jsফাইলটিতে আমি ঠিক একই আমদানির বিবৃতি সহ কোনও সমস্যা ছাড়াই এটি আমদানি করতে সক্ষম। আমি মনে করি এটির সাথে svg ফাইলের কিছু আছে যা টিএস ট্রান্সপ্লেলারের জন্য কোনওভাবে সেট করা উচিত।

টিএস ফাইলগুলিতে এই কাজটি কীভাবে করা যায় দয়া করে আপনি ভাগ করে নিতে পারেন?


4
এসভিজি ফাইলগুলি জাভাস্ক্রিপ্ট নয় এবং জাভাস্ক্রিপ্ট মডিউল হিসাবে ব্যবহার করা যায় না। পরিবর্তে একটি HTTP অনুরোধ ব্যবহার করে আপনার সেই ফাইলগুলি লোড করা উচিত।
টস্কভ

4
আপনি কি ওয়েবপ্যাক ব্যবহার করছেন? আমি কেবল এই জাতীয় importবক্তব্য বুঝতে পারি । সম্ভবত ওয়েবপ্যাকটি যা আপনার জাভাস্ক্রিপ্টে এটি মঞ্জুরি দিচ্ছে তা কিন্তু টাইপস্ক্রিপ্ট ফাইলগুলিতে একই যাদু করছে না। (আমি মনে করি না যে এখানে টাইপস্ক্রিপ্ট নিজেই জানে))
ব্যবহারকারী 94559

4
আপনি যদি ওয়েবপ্যাক ব্যবহার করছেন তবে আরও সহায়তা পেতে আপনাকে সম্ভবত আপনার ওয়েবপ্যাক কনফিগারেশনটি ভাগ করতে হবে।
user94559

4
এ সম্পর্কে আরও কিছুটা পড়া, আপনি সম্ভবত const logo = require("./logo.svg");ত্রুটিটি করতে বা উপেক্ষা করতে পারেন । (আমি বিশ্বাস করি টিএস এখনও সঠিক কোড আউটপুট করা উচিত))
user94559

4
কেন, ওয়েবপ্যাক / প্রতিক্রিয়াগুলিকে জিনিসগুলিকে জটিল করতে হয়েছিল? কেবল কিছু দিয়ে আমদানি করা সহজ হবে না import। আমার মতো নবজাতকের কাছে এই জিনিসগুলি আমাকে নিরুৎসাহিত করে। আমরা কি ২০২০ সালে নেই যেখানে "অটো-কনফিগারেশন" একটি আদর্শ হওয়া উচিত?
সিম্পলগুই

উত্তর:


214

আপনি যদি ওয়েবপ্যাক ব্যবহার করেন তবে আপনি কাস্টম ধরণের ফাইল তৈরি করে এটি করতে পারেন।

নিম্নলিখিত বিষয়বস্তু দিয়ে কাস্টম.ডি.এস.এস নামে একটি ফাইল তৈরি করুন :

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

যোগ custom.d.tsকরার জন্য tsconfig.jsonনীচে

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

সূত্র: https://webpack.js.org/guides/typescript/#importing-other-assets


38
সম্ভবত, আপনার এটি tsconfig.jsoninclude বিভাগে যুক্ত করা প্রয়োজন ।
ফ্রেডেরিক ক্রাউটওয়াল্ড

12
ধন্যবাদ! আমি জানতাম এটি অবশ্যই কোথাও অন্তর্ভুক্ত করা উচিত তবে আমি কোথায় ছবি তুলতে পারি না। এমনকি আমি ভেবেছিলাম এটি tsconfig.json এ আছে তবে আমি কীভাবে এটি করব তা জানতাম না। আপনার মন্তব্য ধন্যবাদ। আমি একটি অনুসন্ধান করেছি এবং আমি পেয়েছি:"files": [ "custom.d.ts" ]
শীল নেভাডো

6
আপনি সামগ্রীটি টাইপ করে জেএসএক্স উপাদানটির জন্য টাইপ-চেকিং পেতে পারেন:const content: React.FunctionComponent<React.SVGAttributes<SVGElement>>;
রেডম্যাট

4
custom.d.tsএসভিজি custom.d.tsফাইলের চেয়ে আলাদা ডিরেক্টরিতে থাকতে পারে তাই বিশ্বব্যাপী ফাইলটির কাজ করা কি সম্ভব ? একই ডিরেক্টরিতে না থাকলে আমি একটি ত্রুটি পেয়েছি "মডিউলটি খুঁজে পাচ্ছি না"।
নিক স্কোজজারো

4
এটি Angular এ ফাইলের সামগ্রী আমদানি করে না, এটি স্ট্রিং হিসাবে ফাইলের নাম আমদানি করে। আমার বিষয়বস্তু দরকার আমরা কীভাবে ফাইলটির বিষয়বস্তু পেতে পারি?
রাউথিনেটর

38

ব্যবহার স্মার্টফোন জন্য ধন্যবাদ স্মারেক্সrequire() । সুতরাং আমার ক্ষেত্রে এটি হওয়া উচিত:

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

যা * .tsx ফাইলগুলিতে কাজ করে


7
logoআরও ভাল নামকরণ করা যেতে পারে logoPath, কারণ এটি হয়ে ওঠে।
ধর্মতর্কল

4
@ ধর্মতুর্তি আমি মনে করি এটি নিয়ে বিতর্ক হতে পারে। এছাড়াও, এটিকে logoপ্রশ্নে ডেকে আনা হয়েছে, সুতরাং এটি যেমন সুনির্দিষ্ট প্রশ্নের তত উত্তম উত্তর।
আর্নেহুগো

@ ধর্মতুর্ত সত্যই ডুড, ভেরিয়েবলের নাম অনেকটা বিষয় বাদ দিচ্ছে, কেন এতো মামুলি জিনিসের প্রতি মনোযোগ কেন?
ELI7VH

19

custom.d.tsসঠিক টাইপ ( রেডম্যাটকে ধন্যবাদ) সহ একটি ফাইল যুক্ত করুন (আমি এটি আমার এসআরসি ডিির মূল পথে তৈরি করেছি ):

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

এসভিজি-রিএ্যাক্ট-লোডার বা অন্য কিছু ইনস্টল করুন , তারপরে:

  • এটি প্রধান এসভিজি লোডার হিসাবে ব্যবহার করুন
  • অথবা আপনি যদি কোনও কোডবেস স্থানান্তরিত করেন এবং কাজের অংশটি (জেএস) স্পর্শ করতে না চান তবে আমদানিতে লোডারটি নির্দিষ্ট করুন:
import MySVG from '-!svg-react-loader!src/assets/images/name.svg'

তারপরে এটি কেবল জেএসএক্স ট্যাগ হিসাবে ব্যবহার করুন:

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

7

আমি যে সমাধানটি পেয়েছি: রিঅ্যাক্টজেএস প্রকল্পে, ফাইলটি-অ্যাপ-এনভি.ডি.এস্টে আপনি মন্তব্যটিতে স্থান সরিয়ে ফেলেন যেমন:

আগে

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

পরে

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

আমি আপনাকে সাহায্য আশা করি


যারা তৈরি-প্রতিক্রিয়া-অ্যাপ্লিকেশন এবং কনফিগার করা এসিলিন্ট ব্যবহার করছেন তাদের পক্ষে সমস্যাটি সমাধান হতে পারে
ড্যানিয়েল চিন

4

একটি REACT + টাইপসক্রিপ্ট টিউটোরিয়াল চেষ্টা করার সময় আমার একই সমস্যা ছিল।
আমার জন্য কী কাজ করেছে তা ছিল নীচের আমদানির বিবৃতি।

import * as logo from 'logo.svg'

প্যাকেজ.জসনে আমার নির্ভরতা এখানে।

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

আশা করি এটি কাউকে সাহায্য করবে।


2

এটি করার একটি বিকল্প উপায় আছে যা আমরা প্রয়োগ করেছি: আপনার এসভিজির উপাদান তৈরি করুন। আমি এটি করেছি কারণ এটি আমার কাছে বাগড হয়েছে যে আমি requireআমার importএস এর পাশাপাশি সাধারণ জেএস বিবৃতি ব্যবহার করছি ।


2

টাইপস্ক্রিপ্ট সহ এন -কোড সম্পদগুলি ব্যবহার করতে , আমাদের এই আমদানির জন্য প্রকারটি স্থগিত করতে হবে । এটির জন্য একটি কাস্টম.ডি.এস.এস ফাইল দরকার যা আমাদের প্রকল্পে টাইপস্ক্রিপ্টের জন্য কাস্টম সংজ্ঞাগুলিকে ইঙ্গিত করে।

আসুন .svg ফাইলগুলির জন্য একটি ঘোষণা সেট আপ করুন:

custom.d.ts

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

এখানে আমরা এসভিজি-র জন্য একটি নতুন মডিউল ঘোষণা করি যা .svg এ শেষ হয় এবং মডিউলের সামগ্রীটি যেকোন হিসাবে সংজ্ঞায়িত করে কোনও আমদানি নির্দিষ্ট করে।


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

আপনি যদি পগলিন স্লিন্ট ব্যবহার করছেন তবে এটি এমন হতে পারে যে এটি একটি মন্তব্য বলে মনে করে অক্ষম করেছেন তবে এসভিজিটি না পড়তে আপনার এই ধরণের স্ক্রিপ্ট মডিউল প্রয়োজন কেবল লাইনটি অক্ষম করুন এবং খুশি হোন


-2

আমি *.svgনিম্নলিখিতগুলি করে কাজগুলি করতে সক্ষম হয়েছি :

ইনস্টল next-images

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

হালনাগাদ next.config.js

আপনার যদি next.config.jsফাইল না থাকে তবে মূলে একটি তৈরি করুন। পরে যুক্ত:

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

স্ট্যান্ডার্ড আমদানি এখন কাজ করা উচিত

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

আমি দেখছি এটিকে ভোট দেওয়া হয়েছে। এই উত্তর সম্পর্কে আপনার কোনও প্রতিক্রিয়া থাকলে দয়া করে আমাকে জানান এবং আমি সে অনুযায়ী এটি সামঞ্জস্য করতে পারি।
হারলে ল্যাং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.