доступ к изображениям из общедоступной папки reactjs

#css #reactjs

#css #reactjs

Вопрос:

Я пытаюсь получить доступ к about-bg.jpg находится в папках frontend-> public-> img из styles.css, но независимо от того, как я пытался вставить ‘.. / .. /’ или ‘.. /’ или ‘.. / .. / .. /’, похоже, это не сработало. Как мне решить эту проблему? Заранее большое спасибо и с благодарностью за любую помощь

Вот структура каталогов приложения react

введите описание изображения здесь

введите описание изображения здесь

Комментарии:

1. что вы используете для начальной загрузки своего проекта? create-react-app ? nextjs ? gatsby ?

2. @Roj, я использую приложение Create React. Спасибо

3. хорошо. Тогда я опубликую свой ответ

Ответ №1:

Для create-react-app рекомендуется импортировать таблицы стилей, изображения и шрифты из JavaScript и использовать только public в этих случаях:

  • Вам нужен файл с определенным именем в выходных данных сборки, например manifest .веб-манифест.
  • У вас есть тысячи изображений, и вам необходимо динамически ссылаться на их пути.
  • Вы хотите включить небольшой скрипт, например pace.js за пределами связанного кода.
  • Некоторые библиотеки могут быть несовместимы с webpack, и у вас нет другого выбора, кроме как включить их в качестве тега.

вы все равно можете получить доступ к этому, используя process.env.PUBLIC следующее

 render() {
  // Note: this is an escape hatch and should be used sparingly!
  // Normally we recommend using `import` for getting asset URLs
  // as described in “Adding Images and Fonts” above this section.
  return <img src={process.env.PUBLIC_URL   '/img/logo.png'} />;
}
 

вы можете прочитать больше здесь: https://create-react-app.dev/docs/using-the-public-folder /

при этом правильным способом было бы иметь папку assets в корне вашего приложения. вы можете называть это как угодно, это не обязательно assets

введите описание изображения здесь

и затем вы можете ссылаться на него в своем css

 <div className="logo" alt="logo" />

.logo {
  height: 200px;
  width: 200px;
  pointer-events: none;
  background-image: url('./assets/logo.svg');
  background-size: cover;
  background-position: center;
}
 

это результат

введите описание изображения здесь

если у вас возникли проблемы с вводом относительных путей, т.Е. ../../../assets По мере увеличения размера вашего приложения вы можете использовать стороннюю библиотеку, например react-app-rewired , для настройки относительных путей. Вот статья, в которой описывается, как это сделать с create-react-app помощью или вы можете использовать абсолютный импорт, настроив jsconfig.json , вот статья для абсолютного пути

Ответ №2:

Причина, по которой это не работает, заключается в том, что у вас нет сервера, на котором размещаются файлы. Изображения запрашиваются не с локального диска, а с веб-сервера, который обслуживает приложение react. Я настоятельно рекомендую вам создать экспресс-сервер, на котором размещается dist каталог и public каталог, в котором существуют эти изображения. Вы также можете использовать nginx для этого. В любом случае вам понадобится какой-либо веб-сервер для размещения всего приложения.

Вот пример сервера Express, который я использовал для разработки своего последнего приложения.

 const express = require('express')
const compression = require('compression')
const path = require('path')
const wwwhisper = require('connect-wwwhisper')
const dotenv = require('dotenv')
dotenv.config()

const app = express()
const port = process.env.PORT || 3000

app.use(compression())

// serve files from dist
app.use(express.static(path.resolve(__dirname, '../../client/dist')))

// serve files from static
app.use('/cards', express.static(__dirname   '/../static/cards'))

// spa catch all
app.get('*', (request, response) => {
    response.sendFile(path.join(__dirname, '../../client/dist/index.html'))
})

app.listen(port, () => console.log(`Server started on port ${port}.`))
 

Это размещается на heroku, следовательно const port = process.env.PORT || 3000 . Если вы знаете порт, на который будет отображаться приложение live в контейнере, вам это не понадобится.

Вы просто захотите повторно сопоставить абсолютный путь express.static с тем, где находятся ваши изображения и где создается ваш каталог dist.