Tworzę małą aplikację reagowania, a moje obrazy lokalne się nie ładują. Obrazy jak placehold.it/200x200
ładunki. Pomyślałem, że może to może być coś z serwerem?
Oto moja 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')
);
i 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');
});
javascript
reactjs
Petrba
źródło
źródło
require()
. np. src = {require ("image path")}Odpowiedzi:
Korzystając z Webpacka, potrzebujesz
require
obrazów, aby Webpack mógł je przetworzyć, co wyjaśniałoby, dlaczego obrazy zewnętrzne ładują się, a wewnętrzne nie, więc zamiast tego<img src={"/images/resto.png"} />
musisz<img src={require('/images/image-name.png')} />
zastąpić image-name.png poprawną nazwą obrazu dla każdego z nich. W ten sposób Webpack może przetwarzać i zastępować źródłowy img.źródło
import {require} from 'browserify'
. Ale to nie działa.require
. Jest dostarczany jako częśćcommonjs
. Zobacz stackoverflow.com/a/33251937/4103908 i viget.com/articles/gulp-browserify-starter-faq, aby uzyskać dalsze informacje, które mogą pomóc w korzystaniu z require i browserify za pomocą Gulp.Module not found: Error: Can't resolve 'MyPNG.png' in 'C:...\app\components\images'
. Ścieżka do pliku wygląda dobrze !.Zacząłem budować swoją aplikację za pomocą aplikacji create-react-app (zobacz zakładkę „Utwórz nową aplikację”). Dołączony plik README.md zawiera następujący przykład:
To zadziałało idealnie dla mnie. Oto link do głównego dokumentu tego README , który wyjaśnia (fragment):
źródło
Unexpected character '�' (1:0) > 1 | �PNG | ^ 2 | 3 | 4 | IHDR��r~ipHYs���o�d��IDATx^�}���Ü�d7�w¿½ï¿½ ��JzH!�K�ï
...Inny sposób:
Najpierw należy zainstalować te moduły:
url-loader
,file-loader
Korzystanie z npm:
npm install --save-dev url-loader file-loader
Następnie dodaj to do konfiguracji Webpacka:
limit
: Limit bajtów do plików wbudowanych jako adres URL danychMusisz zainstalować oba moduły:
url-loader
ifile-loader
Wreszcie możesz:
Możesz dokładniej zbadać te programy ładujące tutaj:
url-loader: https://www.npmjs.com/package/url-loader
file-loader: https://www.npmjs.com/package/file-loader
źródło
npm install --save-dev url-loader
Module build failed: SyntaxError: c:/contrivedpath/images/profile.jpg: Unexpected character '�' (1:0)
, wszystko, co musisz zrobić, to dodać powyższą konfigurację modułu ładującego url do konfiguracji pakietu webpack, npm installurl-loader
ANDfile-loader
i będziesz być funkcjonalne. Przetestowałem, aby się upewnić, i program ładujący pliki jest konieczny.ERROR in ./src/images/imagename.png Module parse failed: Unexpected character '�' (1:0)
wiadomość. Jakieś pomysły?src=[Object module]
a kiedyWłaściwie chciałbym skomentować, ale nie mam jeszcze upoważnienia. To dlatego udaje, że jest następną odpowiedzią, podczas gdy tak nie jest.
Chciałbym kontynuować tę drogę. Działa to płynnie, gdy ma się zdjęcie, które można po prostu wstawić. W moim przypadku jest to nieco bardziej złożone: muszę to zmapować kilka zdjęć. Jak dotąd jedyny możliwy sposób, aby to zrobić, jest następujący
Więc moje pytanie brzmi, czy istnieją prostsze sposoby przetwarzania tych obrazów? Nie trzeba dodawać, że w bardziej ogólnym przypadku liczba plików, które muszą być dosłownie zaimportowane, może być ogromna, podobnie jak liczba kluczy w obiekcie. (Obiekt w tym kodzie zawiera wyraźne odniesienie do nazw-jego kluczy) W moim przypadku procedury związane z wymaganiami nie zadziałały - programy ładujące generowały dziwne błędy podczas instalacji i nie wykazywały śladów działania; i wymaganie samo z siebie też nie zadziałało.
źródło
Chciałem tylko zostawić to, co uwydatnia zaakceptowaną powyżej odpowiedź.
Oprócz zaakceptowanej odpowiedzi możesz nieco ułatwić sobie życie, określając
alias
ścieżkę w programie Webpack, więc nie musisz się martwić, gdzie znajduje się obraz w stosunku do pliku, w którym aktualnie się znajdujesz. Zobacz przykład poniżej :Plik Webpack:
Posługiwać się:
źródło
Ja również chciałbym dodać do odpowiedzi @Hawkeye Parker i @Kiszuriwalilibori:
Jak odnotowano od docs tutaj , to zazwyczaj najlepiej importować obrazy, ile potrzeba.
Potrzebowałem jednak do dynamicznego ładowania wielu plików, co skłoniło mnie do umieszczenia obrazów w folderze publicznym ( również podanym w README ), z powodu poniższej rekomendacji z dokumentacji:
Mam nadzieję, że to pomoże komuś innemu! Zostaw komentarz, jeśli muszę to wyjaśnić.
źródło
Rozwijam projekt wykorzystujący SSR i teraz chcę podzielić się moim rozwiązaniem w oparciu o kilka odpowiedzi tutaj.
Moim celem jest wstępne załadowanie obrazu, aby pokazać go w trybie offline. (Może to nie jest najlepsza praktyka, ale ponieważ to działa, na razie jest w porządku) FYI, również używam ReactHooks w tym projekcie.
Aby użyć obrazu, piszę to w ten sposób
źródło
Spróbuj zmienić kod w server.js na -
źródło
Czasami możesz wpisać zamiast w lokalizacji obrazu / src: try
zamiast
źródło
Użycie atrybutu src w ten sposób oznacza, że obraz zostanie załadowany z bezwzględnej ścieżki „/images/resto.png” Twojej witryny. Katalog obrazów powinien znajdować się w katalogu głównym witryny. Przykład: http://www.example.com/images/resto.png
źródło
Oto, co zadziałało dla mnie. Najpierw zrozumiemy problem. Nie możesz użyć zmiennej jako argumentu do wymagania. Webpack musi wiedzieć, jakie pliki mają być pakowane w czasie kompilacji.
Kiedy otrzymałem błąd, pomyślałem, że może to być związane z problemem ścieżki, tak jak w przypadku wartości bezwzględnej i względnej. Więc przekazałem zakodowaną wartość, aby wymagać, jak poniżej: <img src = {require ("../ asset / images / photosnap.svg")} alt = "" />. Działało dobrze. Ale w moim przypadku wartość jest zmienną pochodzącą z rekwizytów. Próbowałem przekazać zmienną literału ciągu, jak niektórzy sugerowali. To nie działało. Próbowałem też zdefiniować metodę lokalną za pomocą przełącznika dla wszystkich 10 wartości (wiedziałem, że to nie jest najlepsze rozwiązanie, ale po prostu chciałem, aby jakoś działało). To też nie zadziałało. Wtedy dowiedziałem się, że NIE możemy przekazać zmiennej do żądania.
Aby obejść ten problem, zmodyfikowałem dane w pliku data.json, aby ograniczyć je tylko do nazwy mojego obrazu. Ta nazwa obrazu, która pochodzi z rekwizytów jako literał String. Połączyłem go z zakodowaną wartością, na przykład:
Rzeczywista wartość zawarta w logo pochodziłaby z pliku data.json i odnosiłaby się do nazwy obrazu, na przykład photosnap.svg.
źródło
Najlepszy sposób na załadowanie lokalnych obrazów w reakcji jest następujący
Na przykład zachowaj wszystkie swoje obrazy (lub wszelkie zasoby, takie jak filmy, czcionki) w folderze publicznym, jak pokazano poniżej.
Po prostu napisz,
<img src='/assets/images/Call.svg' />
aby uzyskać dostęp do obrazu Call.svg z dowolnego komponentu reagowaniaUwaga: przechowywanie zasobów w folderze publicznym zapewnia, że można uzyskać do nich dostęp z dowolnego miejsca w projekcie, po prostu podając „/ path_to_image” i nie ma potrzeby przechodzenia przez ścieżkę „../../” w ten sposób
źródło
musisz najpierw zaimportować obraz, a następnie go użyć. U mnie to zadziałało.
źródło