React는 로컬 이미지를로드하지 않습니다.


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
이는 일반적으로 로컬 웹 서버가 이미지를 제공하지 않거나 지정한 URL이 올바르지 않음을 의미합니다. 브라우저 콘솔을 열고 404 not found와 같은 오류가 발생하는지 확인하십시오.
Mario Tacke 2016 년

5
여러분! 그냥 사용하십시오 require(). 예 : src = {require ( "image path")}
Neeraj Sewani

답변:


268

Webpack을 사용할 때 Webpack에서 require이미지를 처리하기 위해 이미지 가 필요 합니다. 이는 내부 이미지가로드되지 않는 동안 외부 이미지가로드되는 이유를 설명하므로 대신 image-name.png를 각각의 올바른 이미지 이름으로 대체 <img src={"/images/resto.png"} />해야 <img src={require('/images/image-name.png')} />합니다. 그런 식으로 Webpack은 소스 img를 처리하고 교체 할 수 있습니다.


1
하지만 가져 오는 방법이 필요합니까? Browserify? 그렇다면 어떻게? 나는 시도했다 import {require} from 'browserify'. 하지만 작동하지 않습니다.
하기 Shubham Kushwah

1
@ShubhamKushwah 당신은 가져올 필요가 없습니다 require. 의 일부로 제공됩니다 commonjs. Gulp를 사용하여 require 및 browserify 를 사용하는 데 도움이 될 수있는 자세한 내용 은 stackoverflow.com/a/33251937/4103908viget.com/articles/gulp-browserify-starter-faq 를 참조하십시오 .
Thomas

@Thomas 문제는 내부 이미지와 외부 이미지에 있습니다. 페이지가 처음로드 될 때로드되지 않지만 새로 고치면로드됩니다. 이 문제를 어떻게 해결해야합니까? 제발 도와주세요!
Shubham Kushwah

6
오류 발생 : Module not found: Error: Can't resolve 'MyPNG.png' in 'C:...\app\components\images'. 파일 경로가 좋아 보입니다!.
reubenjohn

2
src = {require ( './ reactLogo.svg')} 오류를 방지하기 위해 현재 디렉토리에 대해 "./"로 경로를 시작합니다.
치즈 맛이 나는

53

나는 내 앱을 만들기 시작했다. create-react-app으로 만들기 ( "새 앱 만들기"탭 참조). 함께 제공되는 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에 대한 마스터 문서에 대한 링크입니다 (발췌).

... JavaScript 모듈에서 바로 파일을 가져올 수 있습니다. 이것은 Webpack에 번들에 해당 파일을 포함하도록 지시합니다. CSS 가져 오기와 달리 파일 가져 오기는 문자열 값을 제공합니다. 이 값은 코드에서 참조 할 수있는 최종 경로입니다 (예 : 이미지의 src 속성 또는 PDF 링크의 href).

서버에 대한 요청 수를 줄이기 위해 10,000 바이트 미만의 이미지를 가져 오면 경로 대신 데이터 URI가 반환됩니다. 이는 다음 파일 확장자에 적용됩니다 : bmp, gif, jpg, jpeg 및 png ...


또한 동일한 디렉토리 내에서뿐만 아니라 어디에서나 이미지를 가져올 수 있으려면 이미지를 어딘가에서 내 보내야합니다. 즉, 내 보내지 않는 경우에 해당됩니다. 가져 오는 구성 요소와 동일한 디렉토리에 있어야합니다. 예를 들어 CRA로 만든 새 React 앱의 경우 logo.svg 파일은 가져온 App.js와 동일한 디렉토리에 있습니다. React에서 이미지 가져 오기에 대한 글을 여기에 썼습니다. blog.hellojs.org/importing-images-in-react-c76f0dfcb552
Maria Campbell

위의 주석에 대한 후속 조치를 위해 위의 fandro가 보여준 것처럼 webpack url-loader를 사용하면 webpack의 테스트 확장과 일치하는 파일이 자동으로 내보내지고 Hawkeye Parker가 위에 표시된 저장 파일을 가져올 수 있습니다.
dave4jr

나는 이것이 정말 오래된 주제라는 것을 알고 있지만 여전히; 어떻게 그 일을 했습니까? 제 경우에는 프로그램이 "이미지 읽기"를 시도하고 있습니다. 결과적으로 끔찍한 오류가 발생합니다. Unexpected character '�' (1:0) > 1 | �PNG | ^ 2 | 3 | 4 | IHDR��r~ipHYs���o�d��IDATx^�}���Ü�d7�w¿½ï¿½ ��JzH!�K�ï...
V. Courtois

@ V.Courtois 죄송합니다-그 이후로이 물건으로 일하지 않았고 지금은 더 이상 세부 사항을 기억하지 못합니다 :(
Hawkeye Parker

Create-React-App 프로젝트의 공용 폴더에 내 이미지를 추가해야했습니다.
pixel 67

29

다른 방법 :

먼저 다음 모듈을 설치하십시오. url-loader,file-loader

npm 사용 : npm install --save-dev url-loader file-loader

다음으로 Webpack 구성에 다음을 추가하십시오.

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

limit: 데이터 URL로 인라인 파일에 대한 바이트 제한

당신은 설치해야 할 모듈 : url-loaderfile-loader

마지막으로 다음을 수행 할 수 있습니다.

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

여기에서 이러한 로더를 자세히 조사 할 수 있습니다.

URL 로더 : https://www.npmjs.com/package/url-loader

파일 로더 : https://www.npmjs.com/package/file-loader


1
다른 사람들에게 도움이되기를 바랍니다. 나는 이것도해야했다. URL 로더를 설치하십시오. npm install --save-dev url-loader
LUser

1
나는이 지난 밤에 어려움을 겪고되었고,이 게시물은 내 화면에 실제로 아침이었다 : 당신은 같은 것을 볼 경우 Module build failed: SyntaxError: c:/contrivedpath/images/profile.jpg: Unexpected character '�' (1:0), 당신이해야 할 모든 설치 NPM, 당신의 웹팩 설정이 위의 URL 로더 설정을 추가한다 url-loader그리고 file-loader당신 것 기능적입니다. 확인하기 위해 테스트했으며 파일 로더가 필요합니다.
agm1984

1
@ agm1984 위의 단계를 따랐지만 여전히 ERROR in ./src/images/imagename.png Module parse failed: Unexpected character '�' (1:0)메시지를 받고 있습니다. 어떤 아이디어?
David

정말 유용했지만 왜 <img src = "images / myimage.png"/>가 작동하지 않는지 이해할 수 없습니다 !! 설명해 주시겠습니까?
Mark

당신이 말한 모든 것을 다했지만 주사위는 없습니다. Webpack은 불평없이 빌드됩니다. 내 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]}/> 

제 질문은 이러한 이미지를 처리하는 더 간단한 방법이 있는지 여부입니다. 더 일반적인 경우에는 말 그대로 가져와야하는 파일의 수가 엄청날 수 있고 객체의 키도 많을 수 있습니다. (그 코드의 객체는 이름-키로 명확하게 참조됩니다.) 필자의 경우에는 관련 절차가 작동하지 않았습니다. 로더가 설치 중에 이상한 종류의 오류를 생성하고 작동 표시를 표시하지 않았습니다. 요구 자체도 효과가 없습니다.


2

나는 위의 대답을 향상시키는 다음을 남기고 싶었습니다.

허용되는 답변 외에도 aliasWebpack에서 경로를 지정하여 자신의 삶을 조금 더 쉽게 만들 수 있으므로 현재 파일과 관련하여 이미지가 어디에 있는지 걱정할 필요가 없습니다. 아래 예제를 참조하십시오. :

Webpack 파일 :

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

사용하다:

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

2

저도 @Hawkeye Parker와 @Kiszuriwalilibori의 답변에 추가하고 싶습니다.

여기 문서 에서 언급했듯이 일반적으로 필요에 따라 이미지를 가져 오는 것이 가장 좋습니다.

그러나 동적으로로드 할 파일이 많이 필요 했기 때문에 아래 문서의 권장 사항으로 인해 이미지를 공용 폴더 ( README에 명시되어 있음 ) 에 넣을 수있었습니다 .

일반적으로 JavaScript에서 스타일 시트, 이미지 및 글꼴을 가져 오는 것이 좋습니다. 공용 폴더는 일반적이지 않은 여러 경우에 대한 해결 방법으로 유용합니다.

  • manifest.webmanifest와 같이 빌드 출력에 특정 이름을 가진 파일이 필요합니다.
  • 수천 개의 이미지가 있으며 해당 경로를 동적으로 참조해야합니다.
  • 번들 코드 외부에 pace.js와 같은 작은 스크립트를 포함하려고합니다.
  • 일부 라이브러리는 Webpack과 호환되지 않을 수 있으며 태그로 포함하는 것 외에 다른 옵션이 없습니다.

다른 사람에게 도움이되기를 바랍니다! 이 문제를 해결해야하는 경우 댓글을 남겨주세요.


2

SSR을 사용하는 프로젝트를 개발 중이며 여기에 몇 가지 답변을 기반으로 솔루션을 공유하고 싶습니다.

내 목표는 인터넷 연결이 오프라인 일 때 표시 할 이미지를 미리로드하는 것입니다. (모범 사례가 아닐 수도 있지만 저에게 효과적이기 때문에 지금은 괜찮습니다) 참고로, 저는이 프로젝트에서도 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

server.js의 코드를-

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

1

때로는 이미지 위치 / src 대신 입력 할 수 있습니다.

./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

여기에 저에게 효과적이었습니다. 먼저 문제를 이해합시다. 요구할 인수로 변수를 사용할 수 없습니다. Webpack은 컴파일 타임에 어떤 파일을 묶을 지 알아야합니다.

오류가 발생했을 때 절대 대 상대와 같이 경로 문제와 관련이 있다고 생각했습니다. 그래서 다음과 같이 요구하도록 하드 코딩 된 값을 전달했습니다. <img src = {require ( "../ assets / images / photosnap.svg")} alt = ""/>. 잘 작동했습니다. 하지만 제 경우에는 값이 소품에서 오는 변수입니다. 일부 제안 된대로 문자열 리터럴 변수를 전달하려고했습니다. 그것은 작동하지 않았다. 또한 10 개의 값 모두에 대해 스위치 케이스를 사용하여 로컬 메서드를 정의하려고했습니다 (최상의 솔루션이 아니라는 것을 알고 있었지만 어떻게 든 작동하기를 원했습니다). 그것도 작동하지 않았습니다. 그런 다음 요구 사항에 변수를 전달할 수 없다는 것을 알게되었습니다.

해결 방법으로 data.json 파일의 데이터를 수정하여 내 이미지 이름으로 만 제한했습니다. 이 이미지 이름은 소품에서 문자열 리터럴로 제공됩니다. 다음과 같이 하드 코딩 된 값에 연결했습니다.

import React from "react";

function JobCard(props) {  

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

로고에 포함 된 실제 값은 data.json 파일에서 가져 오며 photosnap.svg와 같은 일부 이미지 이름을 참조합니다.


0

반응에서 로컬 이미지를로드하는 가장 좋은 방법은 다음과 같습니다.

예를 들어 모든 이미지 (또는 비디오, 글꼴과 같은 자산)를 아래와 같이 공용 폴더에 보관합니다.

여기에 이미지 설명 입력

간단히 쓰기 <img src='/assets/images/Call.svg' />반응 구성 요소에서 Call.svg 이미지에 액세스하기 위해 하기 됩니다.

참고 : 자산을 공용 폴더에 보관하면 '/ path_to_image'만 제공하고 이와 같은 경로 순회 '../../'를 사용하지 않아도되므로 프로젝트 어디에서나 액세스 할 수 있습니다.


PNG 이미지가 작동하지 않습니까? Bcuz 내가 정확히 이것을했지만 작동하지 않았습니다.
maverick

PNG도 작동합니다. SVG가 효과가 있었나요? 파일 이름의 맞춤법 검사를 수행하고 이미지 경로가 올바른지 확인하십시오.
mokesh moha

1
이 실수에 대해 사과드립니다. 나는 반응이 처음이었고 구성 요소 파일이 대문자로 시작해야한다는 것을 몰랐습니다. 그 후 작동했습니다.
maverick

0

먼저 이미지를 가져온 다음 사용해야합니다. 그것은 나를 위해 일했습니다.


import image from '../image.png'

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.