प्रतिक्रिया स्थानीय छवियों को लोड नहीं करेगी


122

मैं एक छोटी प्रतिक्रिया ऐप बना रहा हूं और मेरी स्थानीय छवियां लोड नहीं होंगी। placehold.it/200x200भार जैसी छवियां । मैंने सोचा कि शायद यह सर्वर के साथ कुछ हो सकता है?

यहाँ मेरा App.js है

import React, { Component } from 'react';

class App extends Component {
    render() {
        return (
            <div className="home-container">
                <div className="home-content">
                    <div className="home-text">
                        <h1>foo</h1>
                    </div>
                    <div className="home-arrow">
                        <p className="arrow-text">
                            Vzdělání
                        </p>
                        <img src={"/images/resto.png"} />
                    </div>
                </div>
            </div>
        );
    }
}

export default App;

index.js:

import React, { Component } from 'react';
import { render } from 'react-dom';
import { Router, Route, Link } from 'react-router';
import { createHistory } from 'history';
import App from './components/app';

let history = createHistory();

render(
    <Router history={history} >
        <Route path="/" component={App} >
            <Route path="vzdelani" component="" />
            <Route path="znalosti" component="" />
            <Route path="prace" component="" />
            <Route path="kontakt" component="" />
        </Route>
        <Route path="*" component="" />
    </Router>,
    document.getElementById('app')
);

और server.js:

var path = require('path');
var express = require('express');
var webpack = require('webpack');
var config = require('./webpack.config.dev');

var app = express();
var compiler = webpack(config);

app.use(require('webpack-dev-middleware')(compiler, {
  noInfo: true,
  publicPath: config.output.publicPath
}));

app.use(require('webpack-hot-middleware')(compiler));

app.get('*', function(req, res) {
  res.sendFile(path.join(__dirname, 'index.html'));
});

app.listen(3000, 'localhost', function(err) {
  if (err) {
    console.log(err);
    return;
  }

  console.log('Listening at http://localhost:3000');
});

4
इसका आमतौर पर मतलब है कि आपका स्थानीय वेब सर्वर छवियों की सेवा नहीं कर रहा है या आपके द्वारा निर्दिष्ट यूआरएल गलत है। अपना ब्राउज़र कंसोल खोलें और जांचें कि क्या आपको कोई त्रुटि मिलती है जैसे कि 404 नहीं मिला।
२३:३५ पर मारियो टैक

5
मित्रों! बस उपयोग करें require()। उदा। src = {आवश्यकता ("छवि पथ")}
नीरज सेवा

जवाबों:


268

Webpack का उपयोग करते समय आपको requireउन्हें संसाधित करने के लिए Webpack के लिए छवियों की आवश्यकता होती है, जो यह बताती है कि बाहरी चित्र लोड क्यों करते हैं जबकि आंतरिक नहीं है, इसलिए इसके बजाय <img src={"/images/resto.png"} />आपको <img src={require('/images/image-name.png')} />उनमें से प्रत्येक के लिए सही छवि नाम के साथ image-name.png का उपयोग करने की आवश्यकता है । इस तरह से वेबपैक स्रोत img को संसाधित करने और बदलने में सक्षम है।


1
लेकिन आयात की आवश्यकता कैसे है? Browserify? यदि हाँ, तो कैसे? मैंने कोशिश की है import {require} from 'browserify'। लेकिन यह काम नहीं कर रहा है।
शुभम कुशवाह

1
@ शुभम कुशवाह आपको आयात नहीं करना चाहिए require। के भाग के रूप में प्रदान किया गया है commonjs। देखें stackoverflow.com/a/33251937/4103908 और viget.com/articles/gulp-browserify-starter-faq अधिक जानकारी है कि आप की आवश्यकता होती है और Gulp का उपयोग कर browserify का उपयोग कर मदद कर सकता है के लिए।
थॉमस

@ थोमस समस्या आंतरिक और बाहरी छवियों के साथ है, जब पृष्ठ पहले लोड नहीं होता है, तो वे लोड नहीं करेंगे, लेकिन अगर मैं इसे ताज़ा करता हूं, तो वे लोड करेंगे। तो मुझे यह कैसे हल करना चाहिए - कृपया मदद करें!
शुभम कुशवाह

6
एक त्रुटि हो रही है: Module not found: Error: Can't resolve 'MyPNG.png' in 'C:...\app\components\images'। फ़ाइल का पथ अच्छा लग रहा है!
reubenjohn

2
src = {आवश्यकता ('./ reactLogo.svg')} त्रुटियों से बचने के लिए वर्तमान निर्देशिका के लिए "./" के साथ अपना पथ प्रारंभ करें।
पनीर

53

मैंने अपना ऐप बनाना-रिएक्शन- ऐप के साथ बनाना शुरू किया (देखें "नया ऐप बनाएं" टैब)। इसके साथ आने वाला README.md इसका उदाहरण देता है:

import React from 'react';
import logo from './logo.png'; // Tell Webpack this JS file uses this image

console.log(logo); // /logo.84287d09.png

function Header() {
  // Import result is the URL of your image
  return <img src={logo} alt="Logo" />;
}

export default Header;

इसने मेरे लिए पूरी तरह से काम किया। यहां उस README के ​​लिए मास्टर डॉक का लिंक दिया गया है , जो बताता है (अंश):

... आप एक जावास्क्रिप्ट मॉड्यूल में एक फ़ाइल आयात कर सकते हैं। यह वेबपैक को उस फ़ाइल को बंडल में शामिल करने के लिए कहता है। CSS आयात के विपरीत, फ़ाइल आयात करना आपको एक स्ट्रिंग मान देता है। यह मान वह अंतिम पथ है जिसे आप अपने कोड में संदर्भित कर सकते हैं, उदाहरण के लिए किसी छवि की src विशेषता या PDF के लिंक की href।

सर्वर के लिए अनुरोधों की संख्या को कम करने के लिए, 10,000 बाइट्स से कम की छवियों को आयात करना एक पथ के बजाय एक डेटा URI देता है। यह निम्न फ़ाइल एक्सटेंशनों पर लागू होता है: bmp, gif, jpg, jpeg, और png ...


इसके अलावा, आपको छवियों को कहीं से निर्यात करना होगा ताकि वे उन्हें कहीं भी आयात करने में सक्षम हों और न केवल उसी निर्देशिका के भीतर से, जो कि निर्यात नहीं किए जाने पर मामला क्या होगा। उन्हें उसी निर्देशिका में रहना होगा, जिस घटक में उन्हें आयात किया जा रहा था। आप देखेंगे कि उदाहरण के लिए CRA के साथ बनाए गए किसी भी नए रिएक्ट ऐप के साथ, logo.svg फ़ाइल उसी निर्देशिका में रहती है, जो App.js के रूप में है, जहां यह आयात किया गया है। मैंने यहाँ React में चित्र आयात करने पर एक टुकड़ा लिखा: blog.hellojs.org/importing-images-in-react-c76f0dfcb552
मारिया कैंपबेल

ऊपर की टिप्पणी पर अनुवर्ती कार्रवाई करने के लिए, यदि आप ऊपर दिखाए गए फ़ैंड्रो शो के रूप में वेबपैक url-loader का उपयोग करते हैं, तो आप वे फ़ाइलें जो वेबपैक में परीक्षण एक्सटेंशनों से मेल खाती हैं, स्वचालित रूप से निर्यात की जाती हैं और उन्हें आयात करने के लिए उपलब्ध कराती हैं जो Hawkeye पार्कर ने ऊपर दिखाए हैं।
dave4jr

मुझे पता है कि यह एक बहुत पुराना विषय है लेकिन फिर भी; आपने वह काम कैसे किया? मेरे मामले में, कार्यक्रम "छवि को पढ़ने" की कोशिश कर रहा है ... जिसके परिणामस्वरूप एक भयानक त्रुटि हुई है: Unexpected character '�' (1:0) > 1 | �PNG | ^ 2 | 3 | 4 | IHDR��r~ipHYs���o�d��IDATx^�}���Ü�d7�w¿½ï¿½ ��JzH!�K�ï...
वी। कोर्टोइस

@ V.Courtois क्षमा करें - मैंने तब से इस सामान के साथ काम नहीं किया है, और मुझे अभी और कोई विवरण याद नहीं है :(
हॉकिए पार्कर

मुझे क्रिएट-रिएक्ट-ऐप प्रोजेक्ट में अपनी छवियों को सार्वजनिक फ़ोल्डर में जोड़ना था।
पिक्सेल 67

29

एक और तरीका है:

सबसे पहले, इन मॉड्यूल स्थापित: url-loader,file-loader

Npm का उपयोग करना: npm install --save-dev url-loader file-loader

इसके बाद, इसे अपने वेबपैक कॉन्फ़िगरेशन में जोड़ें:

module: {
    loaders: [
      { test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192' }
    ]
  }

limit: डेटा URL के रूप में इनलाइन फ़ाइलों की बाइट सीमा

आपको दोनों मॉड्यूल स्थापित करने की आवश्यकता है : url-loaderऔरfile-loader

अंत में, आप कर सकते हैं:

<img src={require('./my-path/images/my-image.png')}/>

आप यहाँ इन लोडरों की जाँच कर सकते हैं:

url-loader: https://www.npmjs.com/package/url-loader

फ़ाइल-लोडर: https://www.npmjs.com/package/file-loader


1
उम्मीद है कि यह दूसरों की मदद करे। मुझे यह भी करना था; Url-loader स्थापित करें। npm install --save-dev url-loader
ल्यूसर

1
मैं इस कल रात के साथ संघर्ष कर रहा था, और इस पोस्ट में आज सुबह मेरी स्क्रीन पर वास्तव में था :) आप की तरह कुछ दिखाई देता है तो Module build failed: SyntaxError: c:/contrivedpath/images/profile.jpg: Unexpected character '�' (1:0), तुम सब करने की जरूरत है अपने webpack config को यह ऊपर यूआरएल-लोडर config जोड़ने है, स्थापित NPM url-loaderऔर file-loaderऔर आप करेंगे कार्यशील होना। मैंने यह सुनिश्चित करने के लिए परीक्षण किया है, और फ़ाइल-लोडर आवश्यक है।
agm1984

1
@ agm1984 मैंने उपरोक्त चरणों का पालन किया और अभी भी ERROR in ./src/images/imagename.png Module parse failed: Unexpected character '�' (1:0)संदेश प्राप्त कर रहा हूं । कोई विचार?
डेविड

यह वास्तव में उपयोगी था, लेकिन मैं यह समझने में असमर्थ हूं कि क्यों <img src = "images / myimage.png" /> काम नहीं करेगा !! क्या आप समझा सकते हैं?
मार्क

क्या तुमने सब कुछ कहा लेकिन कोई पासा नहीं। वेबपैक शिकायत किए बिना बनाता है, मैं देख सकता हूं कि मेरी पीएनजी छवि आउटपुट निर्देशिका में स्थानांतरित हो गई है लेकिन छवि पृष्ठ पर लोड नहीं होती है। जब मैं कोड का निरीक्षण करता हूं तो यह कहता है src=[Object module]और जब मैं अपने माउस को
घुमाता

4

वास्तव में मैं टिप्पणी करना चाहूंगा, लेकिन मैं अभी अधिकृत नहीं हूं। इसीलिए वह उत्तर नहीं होने का दिखावा करता है।

import React from 'react';
import logo from './logo.png'; // Tell Webpack this JS file uses this image
console.log(logo); // /logo.84287d09.png

function Header() {
// Import result is the URL of your image
  return <img src={logo} alt="Logo" />;

मैं उस रास्ते को जारी रखना चाहूंगा। सुचारू रूप से काम करता है जब एक तस्वीर है एक सरल सम्मिलित कर सकते हैं। मेरे मामले में जो थोड़ा अधिक जटिल है: मुझे इसे कई चित्रों को मैप करना होगा। अब तक ऐसा करने का एकमात्र काम करने का तरीका इस प्रकार है

import upperBody from './upperBody.png';
import lowerBody from './lowerBody.png';
import aesthetics from './aesthetics.png';

let obj={upperBody:upperBody, lowerBody:lowerBody, aesthetics:aesthetics, agility:agility, endurance:endurance}

{Object.keys(skills).map((skill) => {
 return ( <img className = 'icon-size' src={obj[skill]}/> 

तो, मेरा सवाल यह है कि क्या इन छवियों को संसाधित करने के सरल तरीके हैं? यह कहने की आवश्यकता नहीं है कि अधिक सामान्य मामलों में फाइलों की संख्या जो कि वास्तव में आयात की जानी चाहिए, विशाल हो सकती है और साथ ही ऑब्जेक्ट में कुंजियों की संख्या भी हो सकती है। (उस कोड में ऑब्जेक्ट नाम -its कुंजी द्वारा संदर्भित करने के लिए स्पष्ट रूप से शामिल है) मेरे मामले में आवश्यकता से संबंधित प्रक्रियाओं ने काम नहीं किया है - लोडरों ने स्थापना के दौरान अजीब तरह की त्रुटियों को उत्पन्न किया और काम करने का कोई निशान नहीं दिखाया; और न ही खुद से काम करने की आवश्यकता है।


2

मैं सिर्फ निम्नलिखित को छोड़ना चाहता था जो ऊपर दिए गए स्वीकृत उत्तर को बढ़ाता है।

स्वीकृत उत्तर के अलावा, आप aliasवेबपैक में एक पथ निर्दिष्ट करके अपने जीवन को थोड़ा आसान बना सकते हैं , इसलिए आपको चिंता करने की ज़रूरत नहीं है कि छवि उस फ़ाइल के सापेक्ष स्थित है जहां आप वर्तमान में हैं। कृपया नीचे उदाहरण देखें। :

वेबपैक फ़ाइल:

module.exports = {
  resolve: {
    modules: ['node_modules'],
    alias: {
      public: path.join(__dirname, './public')
    }
  },
}

उपयोग:

<img src={require("public/img/resto.ong")} />

2

मैं भी @Hawkeye पार्कर और @Kiszuriwalilibori से जवाब जोड़ना चाहूंगा:

जैसा कि यहां डॉक्स से बताया गया है , आमतौर पर छवियों को आवश्यकतानुसार आयात करना सबसे अच्छा होता है।

हालाँकि, मुझे डायनेमिक रूप से लोड करने के लिए कई फाइलों की आवश्यकता थी, जिसके कारण मुझे सार्वजनिक फ़ोल्डर में छवियां डालनी पड़ीं ( README में भी कहा गया ), इस वजह से प्रलेखन से नीचे यह सिफारिश की गई है:

आम तौर पर हम जावास्क्रिप्ट से स्टाइलशीट, चित्र और फोंट आयात करने की सलाह देते हैं। सार्वजनिक फ़ोल्डर कम आम मामलों की संख्या के लिए एक समाधान के रूप में उपयोगी है:

  • आपको बिल्ड आउटपुट में एक विशिष्ट नाम के साथ एक फ़ाइल की आवश्यकता है, जैसे कि मैनिफ़ेस्ट ।webmanifest।
  • आपके पास हजारों छवियां हैं और उनके रास्तों को गतिशील रूप से संदर्भित करने की आवश्यकता है।
  • आप बंडल कोड के बाहर पेस.जैस जैसी छोटी स्क्रिप्ट शामिल करना चाहते हैं।
  • कुछ लाइब्रेरी वेबपैक के साथ असंगत हो सकती है और आपके पास इसे टैग के रूप में शामिल करने के अलावा और कोई विकल्प नहीं है।

आशा है कि किसी और की मदद करता है! मुझे एक टिप्पणी छोड़ दो अगर मुझे उस में से किसी को साफ़ करने की आवश्यकता है।


2

मैं एक परियोजना विकसित कर रहा हूं जो एसएसआर का उपयोग कर रहा है और अब मैं यहां कुछ उत्तरों के आधार पर अपना समाधान साझा करना चाहता हूं।

मेरा लक्ष्य एक छवि को प्रीलोड करना है जब इंटरनेट कनेक्शन ऑफ़लाइन हो। (यह सबसे अच्छा अभ्यास नहीं हो सकता है, लेकिन चूंकि यह मेरे लिए काम करता है, यह अभी के लिए ठीक है) FYI करें, मैं भी इस परियोजना में ReactHooks का उपयोग करता हूं।

  useEffect(() => {
    // preload image for offline network
    const ErrorFailedImg = require('../../../../assets/images/error-review-failed.jpg');
    if (typeof window !== 'undefined') {
      new Image().src = ErrorFailedImg;
    }
  }, []);

छवि का उपयोग करने के लिए, मैं इसे इस तरह से लिखता हूं

<img src="/assets/images/error-review-failed.jpg" />

1

सर्वर में कोड बदलने की कोशिश करें।

app.use(require('webpack-dev-middleware')(compiler, {
      noInfo: true,
      publicPath: config.output.path
    }));

1

कभी-कभी आप अपनी छवि स्थान / src: try के बजाय दर्ज कर सकते हैं

./assets/images/picture.jpg

के बजाय

../assets/images/picture.jpg

1
src={"/images/resto.png"}

इस तरह से src विशेषता का उपयोग करने का मतलब है, आपकी छवि आपकी साइट के लिए निरपेक्ष पथ "/images/resto.png" से लोड की जाएगी। छवियाँ निर्देशिका आपकी साइट के मूल में स्थित होनी चाहिए। उदाहरण: http://www.example.com/images/resto.png


1

यहाँ मेरे लिए क्या काम किया है। पहले, हम समस्या को समझते हैं। आप आवश्यकता के तर्क के रूप में एक चर का उपयोग नहीं कर सकते। वेबपैक को यह जानने की जरूरत है कि संकलित समय पर कौन सी फाइल को बंडल करना है।

जब मुझे त्रुटि मिली, तो मैंने सोचा कि यह पथ के मुद्दे से संबंधित हो सकता है जैसे कि पूर्ण बनाम सापेक्ष। इसलिए मैंने नीचे की तरह आवश्यकता के लिए एक हार्ड-कोडित मान पास किया: <img src = {आवश्यकता ("../ आस्तियाँ / चित्र / photosnap.svg")} alt = "" />। यह ठीक काम कर रहा था। लेकिन मेरे मामले में मूल्य प्रॉप्स से आने वाला एक वैरिएबल है। मैंने कुछ सुझाव के रूप में एक स्ट्रिंग शाब्दिक चर को पास करने की कोशिश की। काम नहीं किया। इसके अलावा, मैंने सभी 10 मूल्यों के लिए स्विच केस का उपयोग करते हुए एक स्थानीय पद्धति को परिभाषित करने की कोशिश की (मुझे पता था कि यह सबसे अच्छा समाधान नहीं था, लेकिन मैं चाहता था कि यह किसी तरह काम करे)। वह भी काम नहीं आया। तब मुझे पता चला कि हम आवश्यकता के अनुसार परिवर्तनशील नहीं हो सकते।

एक वर्कअराउंड के रूप में मैंने डेटा को संशोधित किया है। इसे अपनी छवि के नाम तक सीमित करने के लिए फाइल में रखें। यह छवि नाम जो स्ट्रिंग से शाब्दिक के रूप में आ रहा है। मैंने इसे हार्ड कोडित मान के अनुरूप कर दिया, जैसे:

import React from "react";

function JobCard(props) {  

  const { logo } = props;
  
  return (
      <div className="jobCards">
          <img src={require(`../assets/images/${logo}`)} alt="" /> 
      </div>
    )
} 
  

लोगो में निहित वास्तविक मूल्य data.json फ़ाइल से आ रहा है और कुछ छवि नाम जैसे photonap.svg को संदर्भित करेगा।


0

स्थानीय छवियों को प्रतिक्रिया में लोड करने का सबसे अच्छा तरीका इस प्रकार है

उदाहरण के लिए, नीचे दिखाए गए अनुसार अपनी सभी छवियों (या किसी भी संपत्ति जैसे वीडियो, फ़ॉन्ट) को सार्वजनिक फ़ोल्डर में रखें।

यहां छवि विवरण दर्ज करें

बस <img src='/assets/images/Call.svg' />अपने किसी भी प्रतिक्रिया घटक से Call.svg छवि का उपयोग करने के लिए लिखें

नोट: अपनी संपत्ति को सार्वजनिक फ़ोल्डर में रखना सुनिश्चित करता है कि, आप इसे परियोजना से कहीं से भी एक्सेस कर सकते हैं, केवल '/ path_to_image' देकर और किसी भी पथ-प्रदर्शक के लिए कोई ज़रूरत नहीं है '../../' इस तरह से


PNG छवि इस पर काम नहीं करेगी? Bcuz मैंने ठीक यही किया और यह काम नहीं किया।
मवरिक

पीएनजी भी काम करेगी। क्या एसवीजी आपके लिए काम कर रहा है? कृपया फ़ाइल नाम की वर्तनी जांच करें और यह सुनिश्चित करें कि छवि पथ सही है।
मोकेश मोहा

1
इस गलती के लिए माफ़ी। मैं प्रतिक्रिया करने के लिए नया था और मुझे नहीं पता था कि घटक फ़ाइल को पूंजी आवरण के साथ शुरू करना चाहिए। उसके बाद इसने काम किया।
मैवरिक

0

आपको पहले छवि आयात करनी चाहिए फिर उसका उपयोग करना चाहिए। इसने मेरे लिए काम किया।


import image from '../image.png'

const Header = () => {
   return (
     <img src={image} alt='image' />
   )
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.