231

Im new in ReactJS and I want to import images in a component. These images are inside of the public folder and I do not know how to access the folder from the react component.

Any ideas ?

EDIT

I want to import an image inside Bottom.js or Header.js

The structure folder is:

enter image description here

I do not use webpack. Should I ?

Edit 2

I want to use webpack for loading the images and the rest of assets. So in my config folder I have the next files:

enter image description here

Where I need to add the paths of the images and how?

Thanks

Aceconhielo
  • 3,316
  • 4
  • 19
  • 26

15 Answers15

400

You don't need any webpack configuration for this.

In your component just give image path. React will know its in public directory.

<img src="/image.jpg" alt="image" />
Bimal Grg
  • 7,624
  • 2
  • 24
  • 21
  • 6
    This worked for me. Only I copied images to public directory.React automatically resolved the path. – Vineeth Bhaskaran Mar 23 '19 at 12:32
  • 1
    this is the best method because process.env.PUBLIC_URL is relative route and will work wrong for nested routes. Best is to use absolute route starting with slash as specified in the answer... – Baraja Swargiary Dec 17 '20 at 04:19
  • 2
    Worked for me too. Such a simple solution, reminds me of the good old days. – Deshen Apr 11 '21 at 12:13
  • 1
    What if you want to get a reference from a scss file like this background-image:url(...); ? – Daniel Tkach Jun 04 '21 at 22:43
  • Is there any circumstance when React stops knowing that? I started getting "Cannot find module" just out of the blue. The `process.env.PUBLIC_URL` thing worked, but it was just not needed a while ago – 101is5 Nov 24 '22 at 22:02
194

To reference images in public there are two ways I know how to do it straight forward. One is like above from Homam Bahrani.

using

    <img src={process.env.PUBLIC_URL + '/yourPathHere.jpg'} /> 

And since this works you really don't need anything else but, this also works...

    <img src={window.location.origin + '/yourPathHere.jpg'} />
Gerard
  • 2,200
  • 1
  • 9
  • 6
  • 6
    It's not showing any error in the console but the image is appearing as a default image icon not what I have imported. I have tried both the cases you have mentioned. Please help me out. Thanks ! – Prakhar Mittal Mar 17 '19 at 22:58
  • Is there any way of tweaking this feature? My project was normally detecting image files like the answer above, by solely providing the image name and extension. Then overnight the only way I could render images was through this method. I feel like I've turned something off by accident. Not sure if it's relevant but I've made a deployment to gh-pages, and then this happened – 101is5 Nov 24 '22 at 22:07
35

the react docs explain this nicely in the documentation, you have to use process.env.PUBLIC_URL with images placed in the public folder. See here for more info

return <img src={process.env.PUBLIC_URL + '/img/logo.png'} />;
Hom Bahrani
  • 3,022
  • 27
  • 25
8

1- It's good if you use webpack for configurations but you can simply use image path and react will find out that that it's in public directory.

<img src="/image.jpg">

2- If you want to use webpack which is a standard practice in React. You can use these rules in your webpack.config.dev.js file.

module: {
  rules: [
    {
      test: /\.(jpe?g|gif|png|svg)$/i,
      use: [
        {
          loader: 'url-loader',
          options: {
            limit: 10000
          }
        }
      ]
    }
  ],
},

then you can import image file in react components and use it.

import image from '../../public/images/logofooter.png'

<img src={image}/>
Hassan Ajaz
  • 613
  • 8
  • 15
5

Create a folder in public ex.Assets and put your image in that folder and assign the folder_name / image_name in src

<img src = "/Assets/cardimg.svg" alt="Card image cap" width="400" />
5

Simply Use

<img src='/image.extension' />

React will automatically point toward the public directory

Sandeep Rana
  • 179
  • 2
  • 6
4

We know React is SPA. Everything is rendered from the root component by expanding to appropriate HTML from JSX.

So it does not matter where you want to use the images. Best practice is to use an absolute path (with reference to public). Do not worry about relative paths.

In your case, this should work everywhere:

"./images/logofooter.png"

Lauren Rutledge
  • 1,195
  • 5
  • 18
  • 27
Karthik Sagar
  • 424
  • 4
  • 7
3

You should use webpack here to make your life easier. Add below rule in your config:

const srcPath = path.join(__dirname, '..', 'publicfolder')

const rules = []

const includePaths = [
  srcPath
]
    // handle images
    rules.push({
      test: /\.(png|gif|jpe?g|svg|ico)$/,
      include: includePaths,
      use: [{
        loader: 'file-loader',
        options: {
          name: 'images/[name]-[hash].[ext]'
        }
      }

After this, you can simply import the images into your react components:

import myImage from 'publicfolder/images/Image1.png'

Use myImage like below:

<div><img src={myImage}/></div>

or if the image is imported into local state of component

<div><img src={this.state.myImage}/></div> 
Umesh
  • 2,704
  • 19
  • 21
  • I doubt if you need webpack to be able to do an import of a resource. – Siya Mzam Nov 09 '17 at 08:25
  • @fshock, I said it will make it easier to accomplish the task. – Umesh Nov 09 '17 at 08:28
  • @Umesh I prefer to do it with Webpack. So you said that I have to add the rule in the config but which file ? I have path.js, polyfills.js, webpack.config.dev.js , webpack.config.prod.js and webpackDevServer.config.js. I'm going to edit the question so all of you can see the structure. Thanks – Aceconhielo Nov 09 '17 at 08:33
  • @Aceconhielo, you should include it in webpack.config.dev.js and webpack.config.prod.js – Umesh Nov 10 '17 at 01:17
3

here is sure and three simple way to do that...

  1. you can make one folder in directory and access it as we do import way or

  2. you can give direct image name in src

    <img src="image__name" alt="yourpic" /> 
    

//by default react look in public folder can render image in img tag

  1. const image = window.location.origin + "/image.png"; 
    

// if your image in public directory inside folder imagecollection than you can import it in this way

  const image = window.location.origin + "/imagecollection /image.png";
 <img src={image} alt="yourpic" />
vibhu
  • 369
  • 3
  • 10
1

Try This One its easy and Simple

  1. Don't Make Image folder in src.
  2. Make an image folder in public.
  3. you work in react-bootstrap install

npm install react-bootstrap

import React from 'react';
  
import 'bootstrap/dist/css/bootstrap.min.css';
import { Image } from 'react-bootstrap';
export default function Main() {
   
   return (
     <>
          <Image src="/img/image.jpg/100px250" alt="bg image"  fluid />
     </>
    )
 }

Hope it's Done

Sarthak Raval
  • 1,001
  • 1
  • 10
  • 23
1

This is quite an old question. But anyone who needs a solution, please read.

If you are creating a react app from the scratch, without using npx create-react-app the following solution will work.

webpack: 5.75.0
node: 14.15.0
react: 18.2

  1. First place your image file in the project, may be in the public folder.
    eg. /public/assets/my-image.jpg

  2. install copy-webpack-plugin.

    npm i -D copy-webpack-plugin
    

    (my version is 11.0.0)

  3. In the webpack config file import the copy-webpack-plugin.

    const CopyPlugin = require('copy-webpack-plugin');
    
  4. In the plugins section of the webpack config file, configure like below.

    plugins: [
        new CopyPlugin({
            patterns: [
                {
                    from: path.resolve(__dirname, 'public', 'assets'),
                    to: path.join(__dirname, 'dist', 'images'),
                    noErrorOnMissing: true
                }
            ]
        })
    ]
    

    What this piece of code does is that, webpack reads image files from public/assets folder and copy them in to the dist/images folder.... (I assume here that your build folder is called dist. otherwise, change accordingly )

  5. Then in your component just reference the image in html style

    <img src="/images/my-image.jpg" alt="my image" />
    

    Just note, that the image is referenced from the dist folder.

If you plan to reference this image in the future via an open repository, then this approch is more appropriate... because you just have to change the img src url.

Hope I helped someone :) Happy coding !!!

0

A simple solution is to use paths like this /images/logoFooter.png. If the file is located directly under the public folder, do /someImage.png. You can go deeper, /x/y/z/image.png. Treat the locating part of the image as an absolute kind of location for that image.

For more information, check out https://create-react-app.dev/docs/using-the-public-folder/.

Saif Ul Islam
  • 345
  • 3
  • 14
0

if you want to add your javascript file from public folder to react, put specific file to index.html file in public folder. Your problem will be solve.

  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community May 20 '22 at 07:20
0

Easy to Get Local Image Directory

<img className='img-fluid' src={/src/assets/${item?.['poster-image']} || '/src/assets/poster1.jpg'} alt={item?.['poster-image']} loading="lazy" />

https://i.stack.imgur.com/BQU6J.png

API Image to get the only name to search image name in the directory

"poster-image": "poster3.jpg"

https://i.stack.imgur.com/czpWe.png

-3

You Could also use this.. it works assuming 'yourimage.jpg' is in your public folder.

<img src={'./yourimage.jpg'}/>
Suraj Rao
  • 29,388
  • 11
  • 94
  • 103