2016-01-03 137 views
23

我正在构建一个小反应应用程序,我的本地图像将不会加载。像placehold.it/200x200加载的图像。我想也许它可能是服务器的东西?全部来源于githubReact不会加载本地图像

这里是我的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'); 
}); 
+3

这通常意味着你的本地Web服务器不是服务于图像或您指定的URL不正确。打开您的浏览器控制台,检查是否有任何错误,如404未找到。 –

回答

63

使用的WebPack需要require图像,以便为了Webpack来处理它们,这可以解释为什么外部图像加载而内部不加载,所以而不是<img src={"/images/resto.png"} />您需要使用<img src={require('/images/image-name.png')} />替换image-name.png w。他们每个人的正确形象。这样Webpack就能够处理和替换源img。

+0

就是这样。谢谢 – Petrba

+0

谢谢Thomas! –

0

尝试在server.js改变代码 -

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

另一种方式来做到:

首先,安装这些模块:url-loaderfile-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')}/> 

您可以在这里进一步调查这些装载机:

网址装载机:https://www.npmjs.com/package/url-loader

文件装载机:https://www.npmjs.com/package/file-loader

+0

希望它可以帮助别人。我也必须这样做;安装url-loader。 'NPM安装--save-dev的网址loader' – ApertureSecurity

+1

@ApertureSecurity感谢您的评论,我把它添加到答案:) – fandro

+0

我用这个昨晚挣扎,这篇文章实际上是今天早晨在我的屏幕:)如果你看到这样'模块构建失败:语法错误:C:/contrivedpath/images/profile.jpg:意外的字符“”(1:0)',所有你需要做的就是这上面的URL装载机配置添加到您的webpack配置,npm安装'url-loader'和'file-loader',你将会运行。我测试确保,文件加载器是必要的。 – agm1984

5

我开始建设我的应用程序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; 

这对我来说非常合适。这里有一个link to the master doc for that README,这也解释了(节选):

...You can import a file right in a JavaScript module. This tells Webpack to include that file in the bundle. Unlike CSS imports, importing a file gives you a string value. This value is the final path you can reference in your code, e.g. as the src attribute of an image or the href of a link to a PDF.

To reduce the number of requests to the server, importing images that are less than 10,000 bytes returns a data URI instead of a path. This applies to the following file extensions: bmp, gif, jpg, jpeg, and png...

+0

此外,您也必须是为了能够在任何地方,而不是将它们导入刚刚从同一目录,这是将是如果他们没有被导出的情况下,内出口从某处图像。他们必须与其导入的组件位于相同的目录中。例如,您会注意到,对于使用CRA创建的任何新React应用程序,logo.svg文件与App.js驻留在相同的目录中,并在其中导入。我写了一篇关于导入图像阵营的位置:https://blog.hellojs.org/importing-images-in-react-c76f0dfcb552 –

0

什么工作对我来说是插入反引号和$ {}之间的路径。因此,例如,而不是:

<img src={require("../images/resto.png")} /> 

使用:

<img src={require(`${../images/resto.png}`} /> 

这样,当代码编译正确的路径插入。