React, yerel görüntüleri yüklemeyecek


123

Küçük bir tepki uygulaması oluşturuyorum ve yerel resimlerim yüklenmiyor. placehold.it/200x200Yükler gibi görüntüler . Sunucuyla ilgili bir şey olabileceğini düşündüm.

İşte benim 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')
);

ve 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
Bu genellikle yerel web sunucunuzun görüntüleri sunmadığı veya belirttiğiniz url'nin yanlış olduğu anlamına gelir. Tarayıcı konsolunuzu açın ve 404 bulunamadı gibi herhangi bir hata alıp almadığınızı kontrol edin.
Mario Tacke

5
Millet! sadece kullan require(). ör. src = {
required

Yanıtlar:


271

WebPack kullanırken yapmanız gerekenler requirearasında neden harici resimler yük ise iç yapamaz, bunun yerine açıklıyor, WebPack bunları işlemek için sırayla görüntüleri <img src={"/images/resto.png"} />kullanmak gerekir <img src={require('/images/image-name.png')} />bunların her biri için doğru resim adıyla görüntü name.png değiştirilmesi. Bu şekilde Webpack, kaynak img dosyasını işleyebilir ve değiştirebilir.


1
Ama nasıl ithalat gerekir? Browserify? Cevabınız evet ise nasıl? Denedim import {require} from 'browserify'. Ama işe yaramıyor.
Shubham Kushwah

1
@ShubhamKushwah İçe aktarmanız gerekmemelidir require. Parçası olarak sağlanır commonjs. Gulp kullanarak gereksinim ve tarayıcıyı doğrulamanıza yardımcı olabilecek daha fazla ayrıntı için stackoverflow.com/a/33251937/4103908 ve viget.com/articles/gulp-browserify-starter-faq sayfalarına bakın .
Thomas

@Thomas Sorun hem dahili hem de harici görsellerle ilgili, sayfa ilk yüklendiğinde yüklenmeyecekler, ancak yenilersem yüklenecekler. Peki bunu nasıl çözmeliyim - Lütfen yardım edin!
Shubham Kushwah

6
Hatayla: Module not found: Error: Can't resolve 'MyPNG.png' in 'C:...\app\components\images'. Dosyanın yolu iyi görünüyor !.
reubenjohn

2
src = {require ('./ reactLogo.svg')}, hataları önlemek için mevcut dizin için "./" ile yolunuza başlayın.
cheesey

53

Uygulamamı oluştur-react- app ile oluşturmaya başladım (bkz. "Yeni Bir Uygulama Oluşturma" sekmesi). Onunla birlikte gelen README.md şu örneği verir:

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;

Bu benim için mükemmel çalıştı. İşte söz konusu README için ana dokümana bağlantı (alıntı):

... Bir dosyayı doğrudan bir JavaScript modülüne aktarabilirsiniz. Bu, Webpack'e bu dosyayı pakete dahil etmesini söyler. CSS içe aktarmalarından farklı olarak, bir dosyayı içe aktarmak size bir dize değeri verir. Bu değer, kodunuzda başvurabileceğiniz son yoldur, örneğin bir görüntünün src niteliği veya bir PDF bağlantısının href'i olarak.

Sunucuya gönderilen isteklerin sayısını azaltmak için, 10.000 bayttan az olan görüntüleri içe aktarmak, yol yerine bir veri URI'si döndürür. Bu, aşağıdaki dosya uzantıları için geçerlidir: bmp, gif, jpg, jpeg ve png ...


Ek olarak, görüntüleri sadece aynı dizinden değil, herhangi bir yerden içe aktarabilmek için bir yerden de dışa aktarmanız gerekir, Bu, dışa aktarılmasalardı durum böyle olurdu. İçeri aktarıldıkları bileşenle aynı dizinde bulunmaları gerekirdi. Örneğin, CRA ile oluşturulan herhangi bir yeni React uygulamasında logo.svg dosyasının içe aktarıldığı App.js ile aynı dizinde bulunduğunu fark edeceksiniz. React'te
Maria Campbell

Yukarıdaki yorumu takip etmek için, yukarıda fandro'nun gösterdiği gibi web paketi url yükleyicisini kullanırsanız, web paketindeki test uzantılarıyla eşleşen dosyalarınız otomatik olarak dışa aktarılır ve bunları, Hawkeye Parker'ın yukarıda gösterilen tasarrufunu içe aktarmak için kullanılabilir hale getirir.
dave4jr

Bunun gerçekten eski bir konu olduğunu biliyorum ama yine de; bunu nasıl çalıştırdın? Benim durumumda, program "görüntüyü okumaya" çalışıyor ... korkunç bir hatayla sonuçlanıyor: Unexpected character '�' (1:0) > 1 | �PNG | ^ 2 | 3 | 4 | IHDR��r~ipHYs���o�d��IDATx^�}���Ü�d7�w¿½ï¿½ ��JzH!�K�ï...
V. Courtois

@ V.Courtois üzgünüm - O zamandan beri bu şeylerle çalışmadım ve şu anda daha fazla ayrıntı hatırlamıyorum :(
Hawkeye Parker

Resimlerimi Create-React-App projesindeki ortak klasöre eklemem gerekiyordu.
pixel 67

29

Yapmanın başka bir yolu:

İlk olarak, bu modüller yükleyin: url-loader,file-loader

Npm kullanma: npm install --save-dev url-loader file-loader

Sonra, bunu Webpack yapılandırmanıza ekleyin:

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

limit: Veri URL'si olarak satır içi dosyalar için bayt sınırı

Her iki modülü de kurmanız gerekiyor : url-loadervefile-loader

Son olarak şunları yapabilirsiniz:

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

Bu yükleyicileri burada daha ayrıntılı inceleyebilirsiniz:

url yükleyici: https://www.npmjs.com/package/url-loader

dosya yükleyici: https://www.npmjs.com/package/file-loader


1
Umarım başkalarına yardımcı olur. Bunu ben de yapmalıydım; Url yükleyiciyi yükleyin. npm install --save-dev url-loader
LUser

1
Bunu dün gece ile mücadele edildi ve bu yazı benim ekranda aslında bu sabah :) gibi bir şey görürseniz Module build failed: SyntaxError: c:/contrivedpath/images/profile.jpg: Unexpected character '�' (1:0), yapmanız gereken tek şey yüklemek npm, sizin webpack config bu yukarıdaki url-yükleyici yapılandırma eklemek edilir url-loaderVE file-loaderve yapacaksın işlevsel olun. Emin olmak için test ettim ve dosya yükleyici gerekli.
agm1984

1
@ agm1984 Yukarıdaki adımları takip ettim ve hala ERROR in ./src/images/imagename.png Module parse failed: Unexpected character '�' (1:0)mesajı alıyorum . Herhangi bir fikir?
David

gerçekten yararlıydı ancak <img src = "images / myimage.png" /> neden çalışmayacağını anlayamıyorum !! Lütfen açıklar mısın?
Mark

Söylediğin her şeyi yaptım ama zar atmadın. Webpack şikayet etmeden oluşturuyor, PNG resmimin çıktı dizinine taşındığını görebiliyorum, ancak resim sayfaya yüklenmiyor. Kodu incelediğimde sadece diyor src=[Object module]ve
faremin üzerine geldiğimde

4

Aslında yorum yapmak istiyorum ama henüz yetkim yok. Bu yüzden, öyle değilken bir sonraki cevap bu gibi davranıyor.

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" />;

Bu yola devam etmek isterim. Bu, birinin basit bir ekleyebileceği bir resim olduğunda sorunsuz çalışır. Benim durumumda bu biraz daha karmaşık: Birkaç resmi eşleştirmem gerekiyor. Şimdiye kadar bulduğum bunu yapmanın tek uygulanabilir yolu aşağıdaki gibidir

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]}/> 

Öyleyse sorum, bu görüntüleri işlemenin daha basit yolları olup olmadığıdır. Daha genel bir durumda, kelimenin tam anlamıyla içe aktarılması gereken dosya sayısının çok büyük olabileceğini ve nesnedeki anahtar sayısının da olabileceğini söylemeye gerek yok. (Bu koddaki nesne, isimlerle-anahtarlarıyla açıkça başvurmakla ilgilidir) Benim durumumda, gereksinimle ilgili prosedürler işe yaramadı - yükleyiciler, kurulum sırasında garip türden hatalar üretti ve hiçbir çalışma işareti göstermedi; ve gerek kendi başına ne işe yaramadı.


2

Yukarıda kabul edilen cevabı güçlendiren aşağıdakileri bırakmak istedim.

Kabul edilen cevaba ek olarak, aliasWebpack'te bir yol belirleyerek kendi hayatınızı biraz daha kolaylaştırabilirsiniz , böylece şu anda bulunduğunuz dosyaya göre görüntünün nerede bulunduğu konusunda endişelenmenize gerek kalmaz. Lütfen aşağıdaki örneğe bakın :

Webpack dosyası:

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

kullanın:

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

2

Ben de @Hawkeye Parker ve @Kiszuriwalilibori'nin cevaplarına eklemek istiyorum:

Buradaki belgelerden de belirtildiği gibi, genellikle en iyisi görüntüleri gerektiği gibi içe aktarmaktır.

Ancak, dinamik olarak yüklenecek birçok dosyaya ihtiyacım vardı , bu da belgeleri genel klasöre koymamı sağladı ( ayrıca README'de de belirtilmiştir ), çünkü aşağıdaki dokümantasyondaki tavsiye:

Normalde JavaScript'ten stil sayfalarını, resimleri ve yazı tiplerini içe aktarmanızı öneririz. Ortak klasör, daha az yaygın birkaç durum için bir geçici çözüm olarak kullanışlıdır:

  • Derleme çıktısında manifest.webmanifest gibi belirli bir ada sahip bir dosyaya ihtiyacınız var.
  • Binlerce görüntünüz var ve bunların yollarına dinamik olarak başvurmanız gerekiyor.
  • Paketlenmiş kodun dışına pace.js gibi küçük bir komut dosyası eklemek istiyorsunuz.
  • Bazı kitaplıklar Webpack ile uyumsuz olabilir ve bunu bir etiket olarak eklemekten başka seçeneğiniz yoktur.

Umarım bu başka birine yardımcı olur! Bunlardan herhangi birini temizlemem gerekirse bana bir yorum bırakın.


2

SSR kullanan bir proje geliştiriyorum ve şimdi burada bazı cevaplara dayanarak çözümümü paylaşmak istiyorum.

Hedeflerim, internet bağlantısı çevrimdışı olduğunda göstermek için bir resmi önceden yüklemek. (En iyi uygulama olmayabilir, ancak benim için işe yaradığı için şimdilik sorun değil) Bilginize, bu projede ReactHooks da kullanıyorum.

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

Görseli kullanmak için böyle yazıyorum

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

1

Server.js'deki kodu - olarak değiştirmeyi deneyin

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

1

Bazen resim konumunuz / src yerine girebilirsiniz: deneyin

./assets/images/picture.jpg

onun yerine

../assets/images/picture.jpg

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

Src özniteliğinin bu şekilde kullanılması, resminizin siteniz için mutlak yoldan "/images/resto.png" yükleneceği anlamına gelir. Görseller dizini sitenizin kök dizininde yer almalıdır. Örnek: http://www.example.com/images/resto.png


1

İşte benim için işe yarayan şey. Önce sorunu anlayalım. Bir değişkeni zorunlu kılmak için bağımsız değişken olarak kullanamazsınız. Webpack'in derleme sırasında hangi dosyaların paketleneceğini bilmesi gerekir.

Hatayı aldığımda, mutlak ve göreceli olduğu gibi yol sorunuyla ilgili olabileceğini düşündüm. Bu yüzden, aşağıdaki gibi zorunlu kılınmış bir değer geçtim: <img src = {require ("../ assets / images / photosnap.svg")} alt = "" />. İyi çalışıyordu. Ama benim durumumda değer, proplardan gelen bir değişkendir. Bazılarının önerdiği gibi bir dize değişmez değişkeni geçirmeye çalıştım. İşe yaramadı. Ayrıca 10 değerin tümü için anahtar durumu kullanarak yerel bir yöntem tanımlamaya çalıştım (bunun en iyi çözüm olmadığını biliyordum, ancak bir şekilde çalışmasını istedim). Bu da işe yaramadı. Sonra değişkeni ihtiyaca aktaramayacağımızı öğrendim.

Geçici bir çözüm olarak, data.json dosyasındaki verileri yalnızca resmimin adıyla sınırlandırmak için değiştirdim. Props'dan bir String değişmezi olarak gelen bu görüntü adı. Bunu sabit kodlanmış değere birleştirdim, şöyle:

import React from "react";

function JobCard(props) {  

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

Logoda bulunan gerçek değer data.json dosyasından gelir ve photosnap.svg gibi bazı resim adlarına atıfta bulunur.


0

React'te yerel görüntüleri yüklemenin en iyi yolu aşağıdaki gibidir

Örneğin, tüm resimlerinizi (veya videolar, yazı tipleri gibi varlıkları) aşağıda gösterildiği gibi ortak klasörde tutun.

görüntü açıklamasını buraya girin

<img src='/assets/images/Call.svg' />Herhangi bir tepki bileşeninizden Call.svg görüntüsüne erişmek için yazmanız yeterlidir

Not: Varlıklarınızı ortak klasörde tutmak, sadece '/ yol_görüntü' vererek ve bunun gibi herhangi bir yol geçişine '../../' gerek kalmadan projenin herhangi bir yerinden erişebilmenizi sağlar.


PNG görüntüsü bunun üzerinde çalışmayacak mı? Bcuz Ben tam olarak bunu yaptım ve işe yaramadı.
maverick

PNG de çalışacaktır. SVG sizin için çalışıyor mu? Lütfen dosya adında yazım denetimi yapın ve görüntü yolunun doğru olduğundan emin olun.
mokesh moha

1
bu hata için özür dilerim. Tepki vermek için yeniydim ve bileşen dosyasının büyük harflerle başlaması gerektiğini bilmiyordum. Bundan sonra çalıştı.
maverick

0

önce görüntüyü içe aktarmalı sonra kullanmalısınız. Benim için çalıştı.


import image from '../image.png'

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

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.