ReactJS e imagens em pasta pública

103

Sou novo no ReactJS e desejo importar imagens em um componente. Essas imagens estão dentro da pasta pública e não sei como acessar a pasta do componente react.

Alguma ideia ?

EDITAR

Quero importar uma imagem dentro de Bottom.js ou Header.js

A pasta de estrutura é:

insira a descrição da imagem aqui

Eu não uso webpack. Eu devo ?

Editar 2

Quero usar o webpack para carregar as imagens e o resto dos ativos. Portanto, na minha pasta de configuração, tenho os próximos arquivos:

insira a descrição da imagem aqui

Onde preciso adicionar os caminhos das imagens e como?

obrigado

Aceconhielo
fonte
1
esta pasta é pública para o quê? qual é a estrutura do seu projeto? Você também está agrupando imagens com o webpack ou isso está excluído? etc etc etc contexto contextual
Joel Harkes
@JoelHarkes editado.
Aceconhielo
parece que não está embalado. você já tentou src="/images/logofooter.png":?
Joel Harkes
Desculpe, isso não é relevante para a pergunta, mas qual tema de ícone você usa?
Nermin
Tente criar uma pasta dentro de src, armazene seus ativos nela e importe-a usando o caminho relativo. Isso é melhor por vários motivos. Apenas uma sugestão!
Aditya Patnaik

Respostas:

86

Para referenciar imagens em público, há duas maneiras de fazer isso de maneira direta. Um é como acima de Homam Bahrani.

usando

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

E como isso funciona, você realmente não precisa de mais nada, mas isso também funciona ...

    <img src={window.location.origin + '/yourPathHere.jpg'} />
Gerard
fonte
1
Não está mostrando nenhum erro no console, mas a imagem está aparecendo como um ícone de imagem padrão, não o que importei. Eu tentei ambos os casos que você mencionou. Por favor, me ajude. Obrigado !
Prakhar Mittal
161

Você não precisa de nenhuma configuração de webpack para isso ..

Em seu componente apenas forneça o caminho da imagem. Por padrão, o react saberá seu diretório público.

<img src="/image.jpg" alt="image" />
Bimal Grg
fonte
2
Isso funcionou para mim. Apenas copiei as imagens para o diretório público. O React resolveu o caminho automaticamente.
Vineeth Bhaskaran
2
E se as imagens estiverem em alguma pasta dentro da pasta pública, reagirá saberá para encontrá-la?
Yuval Levy
2
Sim @YuvalLevy.
Oliver Voutat
este é o melhor método porque process.env.PUBLIC_URL é uma rota relativa e funcionará incorretamente para rotas aninhadas. O melhor é usar a rota absoluta começando com barra conforme especificado na resposta ...
Baraja Swargiary
12

os documentos react explicam isso muito bem na documentação, você deve usar process.env.PUBLIC_URLcom imagens colocadas na pasta pública. Veja aqui para mais informações

return <img src={process.env.PUBLIC_URL + '/img/logo.png'} />;
Homam Bahrani
fonte
Sim, para imagens dinâmicas fora da hierarquia src dir. Os estáticos, como um logotipo ou um fundo, podem ser obtidos com o método de importação.
Juan Lanus
1
também, isso é para aplicativos desenvolvidos com criar app
react
1
Não está mostrando nenhum erro no console, mas a imagem está aparecendo como um ícone de imagem padrão, não o que importei. Por favor, me ajude.
Prakhar Mittal
3

1- É bom se você usar o webpack para configurações, mas você pode simplesmente usar o caminho da imagem e reagir descobrirá que está no diretório público.

<img src="/image.jpg">

2- Se você quiser usar o webpack que é uma prática padrão no React. Você pode usar essas regras em seu arquivo webpack.config.dev.js.

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

então você pode importar o arquivo de imagem em componentes react e usá-lo.

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

<img src={image}/>
Hassan Ajaz
fonte
2

Você deve usar o webpack aqui para facilitar sua vida. Adicione a regra abaixo em sua configuração:

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

Depois disso, você pode simplesmente importar as imagens para os componentes de reação:

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

Use myImage como abaixo:

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

ou se a imagem é importada para o estado local do componente

<div><img src={this.state.myImage}/></div> 
Umesh
fonte
Tenho dúvidas se você precisa do webpack para poder fazer a importação de um recurso.
Siya
@fshock, eu disse que tornará mais fácil realizar a tarefa.
Umesh
@Umesh Eu prefiro fazer isso com o Webpack. Então você disse que eu tenho que adicionar a regra na configuração, mas qual arquivo? Tenho path.js, polyfills.js, webpack.config.dev.js, webpack.config.prod.js e webpackDevServer.config.js. Vou editar a pergunta para que todos vocês possam ver a estrutura. Obrigado
Aceconhielo
@Aceconhielo, você deve incluí-lo em webpack.config.dev.js e webpack.config.prod.js
Umesh
2

Sabemos que React é SPA. Tudo é renderizado a partir do componente raiz, expandindo para o HTML apropriado do JSX.

Portanto, não importa onde você deseja usar as imagens. A prática recomendada é usar um caminho absoluto (com referência ao público). Não se preocupe com os caminhos relativos.

No seu caso, isso deve funcionar em qualquer lugar:

"./images/logofooter.png"

Karthik Sagar
fonte
-1

Você também pode usar isso .. funciona assumindo que 'yourimage.jpg' está na sua pasta pública.

<img src={'./yourimage.jpg'}/>
smoothVibes
fonte