node.js - 如何使用 Node 和 Webpack 正确加载照片?

标签 node.js reactjs express webpack webpack-file-loader

我应该通过导入相对路径还是引用文件 URL 来加载 Node 中的照片,以及如何正确地从相对路径加载照片?

目前我正在使用 Express 提供静态文件:

server.use(express.static(__dirname + '/../public'));

并通过引用文件 URL 加载照片:

  <img src='/images/tom.jpg'/>

我有一个 webpack 配置设置为在 (png|jpg|gif) 上使用文件加载器,并且 webpack 文档说,使用文件加载器,您可以从相对路径 ( https://webpack.js.org/loaders/file-loader/#src/components/Sidebar/Sidebar.jsx ) 导入照片:

import img from './file.png'

使用此配置(这是我正在使用的配置):

module.exports = {
  module: {
    rules: [
      {
        test: /\.(png|jpg|gif)$/,
        use: [
          {
            loader: 'file-loader',
            options: {}  
          }
        ]
      }
    ]
  }
}

但是,当我尝试从相对路径导入图像时:

//import   
import img from '../../public/images/tom.jpg';

//render
<img src={img}/>

我收到此错误:

/Users/ryan/Desktop/Df/Coding/ryanchacon.io/node_modules/babel-core/lib/transformation/file/index.js:590 throw err; ^

SyntaxError: /Users/ryan/Desktop/Df/Coding/ryanchacon.io/public/images/tom.jpg: Unexpected character '�' (1:0)

1 | ����

但是,如果我发出“从相对路径导入”,启动我的服务器,然后添加相对导入,图像将从其相对路径加载。但是,如果我重新启动服务器,错误会再次抛出。

因此,我引用文件 URL 来解决此错误,但我不确定如何使用 webpack/node 配置从文件的相对路径正确加载文件。

目前,我正在运行 Node v8.6.0、webpack v3.6.0、express v4.15.4、file-loader v1.1.5 和 React v16.0.0。

最佳答案

在您的 server.js 文件中,您正在使用服务器端渲染(这很棒):ReactDOMServer.renderToString( <App /> )App在服务器端渲染的组件通过 import App from './src/App'; 导入陈述。在 App.js 文件中,您有 JPG 导入语句:import img from '../public/hermes.jpg'; .

请注意,在这种情况下,您的 Node.js 不知道项目中的任何 Webpack 包,并且 Node 实际上会尝试导入 '../public/hermes.jpg'文件,这会导致您面临的错误( Node 只能加载 JS 模块)。

所以问题实际上是如何使用file-loader以通用/同构的方式。您可以看一下这个示例项目:https://github.com/webpack/react-webpack-server-side-example显示了服务器和客户端代码的 webpack 配置。理论上,如果您通过 webpack 捆绑服务器代码,那么当您运行它时,JPG 导入语句已经由文件加载器处理,并且不会导致任何问题。我必须承认,我个人认为捆绑服务器代码不是一个好主意(捆绑解决了与服务器端并不真正相关的客户端问题)。

如果您坚持使用file-loader并将图像文件捆绑到客户端代码中,使用服务器端 webpack 可能是一个不错的解决方案。如果没有,您可以简单地从 /public 加载图像。文件夹。

就其值(value)而言,我相信使用 URL 加载图像不仅更简单,而且更快 - 浏览器将下载更轻的 JS 包(它更轻,因为它不包含编码的图像文件),并且您的代码将提前开始运行,以并行、异步的方式从 HTTP 下载图像。

关于node.js - 如何使用 Node 和 Webpack 正确加载照片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46615821/

相关文章:

node.js - Nodejs 使用 require() 函数在所有路由文件中包含所需的包

javascript - 使用electron-builder时如何修改app.asar的文件夹结构?

javascript - function.querySnapshot 不是函数

twitter-bootstrap - 如何在reactjs应用程序中包含bootstrap css和js?

android - ionic 运行 android - 错误 : Cannot find module 'internal/fs' - windows

node.js - "Caller does not have permission"尝试使用 Firebase Admin SDK 创建自定义 token

javascript - 如何在 React 中创建带有登录组件的多页面应用程序?

javascript - module exports = mongoose 模型在 NodeJs 中做什么

mongodb - node.js - 无法让 mongodb 工作,可能安装错误?

node.js - web3 对象什么时候被注入(inject)到网页中?