【问题标题】:How to handle images in a Rails / Webpacker / React app?如何在 Rails / Webpacker / React 应用程序中处理图像?
【发布时间】:2018-04-01 08:29:13
【问题描述】:

我正在使用带有 rails 5.1.4 的 Webpacker 来玩 React、Redux 和 react-router-dom。

我在app/javascript/src/components/ 中有一个需要显示图像的Navbar.jsx 组件,但我无法访问存储在app/assets/images/ 中的图像。

这是我尝试过的:

<img src="logo.png" alt="Logo" />
<img src="assets/logo.png" alt="Logo" />
<img src="assets/images/logo.png" alt="Logo" />

从根路径最后一次尝试有效,因为/assets/images/logo.png 确实存在,但是当我导航到/posts/:id 时,它给了我以下错误:

logo.png:1 GET http://localhost:3000/posts/assets/images/logo.png 404 (Not Found)

你能帮帮我吗?还有更多关于在那种或混合 React/Rails 应用程序中处理图像的方法是什么?

谢谢

【问题讨论】:

    标签: ruby-on-rails reactjs webpack webpacker


    【解决方案1】:

    只需编辑文件config/webpacker.yml 并替换这一行:

    resolved_paths: []
    

    有了这个:

    resolved_paths: ['app/assets']
    

    然后,将图像放入app/assets/images 文件夹并像这样加载它:

    import React from 'react'
    import MyImage from 'images/my_image.svg'
    
    const MyComponent = props => <img src={MyImage} />
    
    export default MyComponent
    

    【讨论】:

    • 我的情况一模一样,上面的方法我也试过了,但是还是继续出现图片无法解析的错误。
    • 我能够在不将app/assets 添加到resolved_paths 的情况下实施此解决方案
    • 第 11 行是什么?你能更新这个以显示整个文件吗?
    • 这在 Rails 6 中对我有用......与下面的响应不同,我需要将“app/assets”添加到 resolve_paths。我想如果我想为此使用资产文件夹,我也必须为 CSS 执行此操作。
    • 如果你使用这个方法并且在你的视图中从 image_tag 中调用图片,那么你的图片会被加载两次
    【解决方案2】:
    If we leave resolved_path as [] in webpacker.yml also it works.
    
    Example = 
    
    # Additional paths webpack should lookup modules
      # ['app/assets', 'engine/foo/app/assets']
      resolved_paths: []
    
      static_assets_extensions:
        - .jpg
        - .jpeg
        - .png
        - .gif
        - .tiff
        - .ico
        - .svg
        - .eot
        - .otf
        - .ttf
        - .woff
        - .woff2
    

    您甚至可以在组件中创建图像文件夹。将其加载到组件文件中,如下所示-

    import React from 'react;
    import MyImage from '${imagePath}/example1.png'
    
    export class MyComponent extends React.Component {
      render() {
      return (
      <React.Fragment>
       <img src={MyImage} alt="Image text"/>
      </React.Fragemnt>
      )
     }
    }
    

    Webpacker 将这些图像路径转换为包。

    【讨论】:

      【解决方案3】:

      2021 年更新(rails 6.1.4),resolved_paths 键已更改为 additional_paths

      所以,改变:

      # config/webpacker.yml
      
      default: &default
        additional_paths: []
      

      进入:

      # config/webpacker.yml
      
      default: &default
        additional_paths: ['app/assets']
      

      其余的跟随Daniel's的回答

      【讨论】:

        【解决方案4】:

        【讨论】:

        • 非常感谢,你让我很开心。这比你分享的文章中说的还要简单。我所要做的就是使用yarn install file-loader 安装文件加载器,然后需要我的图像import Logo from '../../../assets/images/logo.png'; 并使用它&lt;img src={Logo} alt="Logo" /&gt;。太好了。
        • install 已替换为 add 以添加新的依赖项。改为运行“yarn add file-loader”。
        【解决方案5】:

        对于那些可能仍然遇到此问题的人,请尝试一下:

        将您的 img 放在 app/assets/images 中。在此示例中,我的图像称为“logo.png”。

        在您的 application.html.erb 文件中,将其放在头部:

        <script type="text/javascript">
           window.logo = "<%= image_url('logo.png') %>"
        </script>
        

        现在在您的组件中,渲染图像:

        return (
          <div>
            <a href="/">
              <img src={window.logo}/>
            </a>
          </div>
        );
        

        希望这会有所帮助。

        【讨论】:

        • 虽然这可行,但在 js 中添加到 window 对象是不好的做法。它使单元测试更加困难,允许页面上的任何脚本更改您的图像,这可能会打开 xss 矢量,并且您必须为您想要的每个图像遵循该过程。
        猜你喜欢
        • 2017-09-19
        • 2018-08-06
        • 2019-10-03
        • 1970-01-01
        • 2019-12-16
        • 2022-12-15
        • 2018-03-31
        • 1970-01-01
        • 2017-07-24
        相关资源
        最近更新 更多