如何使用webpack编译React app,其中对SVG /图像及其输出位置的引用遵循特定的文件结构?

时间:2018-08-07 03:34:11

标签: javascript reactjs webpack

当前正在处理一个基于Redux的React并使用webpack的项目(都是新功能!)。我一直在寻找SVG问题的可能解决方案,这些问题一旦编译就不会呈现,但我认为问题在于正在编译的路径并不一定是我上载时使用的路径。

我正在使用webpack编译文件。目前,当我编译时,我在dist文件夹中得到了典型的index.html和main.js文件。

/dist
  index.html
  main.js
/src
  /components
    Categories.js
  /images
    /icons
      ...
      movers.svg
  App.css
  App.js
  index.js
  index.html

但是,我有要尝试工作的svg。目前,我无法加载它们。我尝试了许多不同的方法(以下是我偶然发现stackoverflow的一种方法),但没有获得任何成功。

此外,我正在上传到我们公司使用的平台,该平台要求上传的文件结构如下:

/app
  /public
    /images
    /javascripts
    /data
    /stylesheets
    index.html

但是,我可以将main.js放在javascript文件夹中,而不必放置任何样式表(因为编译后的文件具有全部功能并且可以工作)。但是我无法获取svgs或图像资产路径或引用以某种方式进行编译,即它在main.js文件中是1.还是在2.我可以在上面的/ images文件夹中拥有这些资产,并且当我上传到平台时,有我的main.js文件引用

我已经到了我的SVG也作为数字路径(例如8997987974974.js)文件夹输出到我的/ dist中的位置,但是一旦移动到javascript文件夹中的应用程序结构中,(因为我认为这是因为该结构在一个文件夹中或未加载的图像中具有索引,主文件和svg的所有三种类型。

我的React组件引用了svgs:

import React, { Component } from 'react';
const svgs = require.context('../images/icons', true, /\.svg$/)

const svgsObj = svgs.keys()
    .reduce((images, key) => {
        images[key] = svgs(key)
        return images
    }, {})

console.log(svgsObj)

const findSvgSrc = (category) => {
    const svgPath = Object.keys(svgsObj).filter((item) => {
        return item.indexOf(category) > -1
    })
    return svgsObj[svgPath]
}

class CategoryList extends Component {


    render() {
        const { categories, setCategory, cName } = this.props
        // console.log(categories)

        return (
            <div className={cName}>
            <div className="category-list">
            <ul>
                {categories.list.map((category) => (
                      <li className="category-list-item" key={category} onClick={() => (setCategory(category.toLowerCase()))}>
                      <img className="category-icon" src={findSvgSrc(category.toLowerCase())}></img>
                      <span className="font-color-white category-name">{category}</span>
                      </li>

                    ))}
            </ul>
            </div>
            </div>
        )
    }
}

export default CategoryList;

我的webpack.config文件

const HtmlWebPackPlugin = require("html-webpack-plugin");
const path = require("path");

const htmlWebpackPluginDev = new HtmlWebPackPlugin({
  template: "./src/index.html",
  filename: "./index.html"
});



module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
        }
      },
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"]
      },
      {
        test: /.(jpg|jpeg|png|svg)$/,
        use: ['file-loader'],
      },
    ]
  },
  plugins: [htmlWebpackPluginDev]
};

SVG示例(当单独放置在页面上时可以使用,但是可能出问题了吗?)

<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     viewBox="0 0 25 25" style="enable-background:new 0 0 25 25;" xml:space="preserve">
<style type="text/css">
    .st0{fill:#F01446;}
    .st1{fill:#FFFFFF;}
</style>
<circle class="st0" cx="12.5" cy="12.5" r="12.3"/>
<path class="st1" d="M5.4,16.8c-0.1,0-0.1-0.1-0.2-0.1c0,0.1,0,0.2,0.1,0.2c0.1,0,0.1,0,0.2,0C5.5,16.9,5.4,16.8,5.4,16.8z
     M6.2,16.3c0-0.3-0.2-0.5-0.5-0.5c-0.3,0-0.5,0.2-0.5,0.5c0,0.3,0.2,0.5,0.5,0.5C6,16.8,6.2,16.6,6.2,16.3z M5.7,16.6
    c-0.2,0-0.3-0.1-0.3-0.3c0-0.2,0.1-0.3,0.3-0.3C5.9,16,6,16.1,6,16.3C6,16.5,5.9,16.6,5.7,16.6z M20.2,16.3c0-0.3-0.2-0.5-0.5-0.5
    c-0.3,0-0.5,0.2-0.5,0.5c0,0.3,0.2,0.5,0.5,0.5C20,16.8,20.2,16.6,20.2,16.3z M19.8,16.6c-0.2,0-0.3-0.1-0.3-0.3
    c0-0.2,0.1-0.3,0.3-0.3c0.2,0,0.3,0.1,0.3,0.3C20.1,16.5,19.9,16.6,19.8,16.6z M6.1,16.8c-0.1,0-0.1,0.1-0.1,0.1c0.1,0,0.1,0,0.2,0
    c0.1,0,0.1-0.1,0.1-0.2C6.2,16.7,6.1,16.8,6.1,16.8z M6.3,16.1c0,0.1,0,0.1,0.1,0.2c0.1-0.1,0.1-0.1,0.1-0.2c0-0.1-0.1-0.1-0.2-0.1
    C6.2,16,6.3,16,6.3,16.1z M5,16c0,0.1,0,0.2,0.1,0.2c0,0,0.1-0.1,0.1-0.2c0-0.1,0-0.1,0-0.2C5.1,15.9,5,16,5,16z M23.9,15L23.9,15
    L23.9,15L23.9,15l-0.1-0.1l0,0h-2.5v0l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0,0.2l0,0.2l0,0.2l0,0.1l0,0.1l0,0l0,0l0,0l0,0l0,0l1.8,0
    l0,0l0,0l0,0l0,0l0,0l0,0l0-0.2l0-0.1l0-0.1l0-0.1l0-0.1l0-0.1l0-0.1l0-0.2L23.9,15z M3.4,14.7c0.5-0.8,1.4-1.3,2.3-1.3
    c0.9,0,1.8,0.5,2.3,1.3h6.7c0,0,0,0,0,0V7.4c0,0,0-0.1-0.1-0.1H2.3c0,0-0.1,0-0.1,0.1v7.3c0,0,0,0,0,0H3.4z M5.9,15.6
    c0-0.1-0.1-0.1-0.2-0.1c-0.1,0-0.1,0.1-0.2,0.1c0,0,0.1,0,0.2,0C5.8,15.7,5.8,15.7,5.9,15.6z M19.1,16c0,0.1,0,0.2,0.1,0.2
    c0,0,0.1-0.1,0.1-0.2c0-0.1,0-0.1,0-0.2C19.1,15.9,19.1,16,19.1,16z M19.4,16.8c-0.1,0-0.1-0.1-0.2-0.1c0,0.1,0,0.2,0.1,0.2
    c0.1,0,0.1,0,0.2,0C19.5,16.9,19.5,16.8,19.4,16.8z M20.3,16.1c0,0.1,0,0.1,0.1,0.2c0.1-0.1,0.1-0.1,0.1-0.2c0-0.1-0.1-0.1-0.2-0.1
    C20.3,16,20.3,16,20.3,16.1z M19.1,14.4l0.1,0l0.1,0l0.1,0l0.1,0l0.1,0l0.1,0l0.1,0l0.1,0l0.1,0l0.1,0l0.1,0.1l0.1,0.1l0.1,0.1
    l0.1,0.1l0,0l0,0l0,0h2.1V14h0.1c0.1,0,0.1,0,0.1-0.1c0-0.1,0-0.1-0.1-0.1h-0.1l0,0l0,0l0,0v-0.1h0.2c0.1,0,0.1,0,0.1-0.1
    s0-0.1-0.1-0.1h-0.2l0-0.1l0,0h0.2c0.1,0,0.1,0,0.1-0.1c0-0.1,0-0.1-0.1-0.1h-0.2l0-0.1l0,0h0.1c0.1,0,0.1,0,0.1-0.1
    c0-0.1,0-0.1-0.1-0.1h-0.1l0-0.1l0-0.1l0-0.1h0.1l0-0.3l0-0.1l0,0l0,0l0-0.1l0,0l0,0l-0.1,0l0-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
    l-0.3-0.1l-0.3-0.1L21,11.3l-0.3,0l-0.3,0l-0.3,0l-0.3,0l-0.1,0l-0.1,0l-0.1,0l-0.1,0l0,0v0l0-0.1l-1-1.9l0,0l0,0l0,0l0,0l0,0l0,0
    l0,0l0,0l-0.1,0l-0.5,0l-0.5,0l-0.5,0l-0.5,0l-0.5,0l-0.5,0l0,0l0,0l0,0l0,0l0,0l0,0.2l0,0.6l0,0.2l0,1l0,1l0,1v1.5h1.4v-0.1h0.3
    v0.1l0,0l0,0l0,0l0,0l0,0V15h0.7l0,0l0,0.1l0,0.2l0,0.2l0,0.2l0,0.2l0,0.2l0,0.2h0.5l0,0l0,0l0,0l0,0l0,0l0,0l0-0.1l0-0.1l0-0.1
    l0-0.1l0-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1L19.1,14.4L19.1,14.4z
     M16.2,13.1L16.2,13.1L16.2,13.1L16.2,13.1l-0.5,0l0,0l0,0l0,0v-0.5l0,0l0,0l0,0h0.5l0,0l0,0l0,0l0,0.2v0.2L16.2,13.1z M17.9,11.6
    L17.9,11.6L17.9,11.6l-0.1,0l0,0l-0.1-0.1l-0.1,0l-0.1,0l-0.1,0l-0.1,0l-0.1,0l-0.1,0l-1.1-0.1l0,0l0,0l0,0l0,0l0,0l0-1.4l0,0l0,0
    l0,0l0,0l0,0l0.6,0l0.6,0l0.6,0l0.1,0l0.1,0l0,0l0,0L17.9,11.6L17.9,11.6z M18,11.6L18,11.6L18,11.6L18,11.6l-0.1-1.8l0,0l0,0l0,0h0
    l0,0l0,0l0,0l0.2,0.4l0.2,0.5l0,0.1l0,0.1l0,0.1l0,0.1v0.4l0,0l0,0l0,0l0,0l0,0L18,11.6L18,11.6L18,11.6z M19.9,15.6
    c0-0.1-0.1-0.1-0.2-0.1c-0.1,0-0.1,0.1-0.2,0.1c0,0,0.1,0,0.2,0C19.8,15.7,19.9,15.7,19.9,15.6z M19.8,15.3c-0.5,0-0.9,0.4-0.9,1
    c0,0.5,0.4,1,0.9,1c0.5,0,0.9-0.4,0.9-1C20.7,15.8,20.3,15.3,19.8,15.3z M19.8,17.2c-0.5,0-0.8-0.4-0.8-0.9c0-0.5,0.4-0.9,0.8-0.9
    c0.5,0,0.8,0.4,0.8,0.9C20.6,16.8,20.2,17.2,19.8,17.2z M20.1,16.8c-0.1,0-0.1,0.1-0.1,0.1c0.1,0,0.1,0,0.2,0c0.1,0,0.1-0.1,0.1-0.2
    C20.2,16.7,20.2,16.8,20.1,16.8z M19.8,14.4c-1,0-1.7,0.8-1.7,1.8c0,1,0.8,1.8,1.7,1.8c1,0,1.7-0.8,1.7-1.8
    C21.5,15.3,20.7,14.4,19.8,14.4z M19.8,17.4c-0.6,0-1-0.5-1-1.1c0-0.6,0.5-1.1,1-1.1c0.6,0,1,0.5,1,1.1
    C20.8,16.9,20.3,17.4,19.8,17.4z M5.7,15.3c-0.5,0-0.9,0.4-0.9,1c0,0.5,0.4,1,0.9,1c0.5,0,0.9-0.4,0.9-1C6.6,15.8,6.2,15.3,5.7,15.3
    z M5.7,17.2c-0.5,0-0.8-0.4-0.8-0.9c0-0.5,0.4-0.9,0.8-0.9c0.5,0,0.8,0.4,0.8,0.9C6.5,16.8,6.2,17.2,5.7,17.2z M5.7,14.4
    c-1,0-1.7,0.8-1.7,1.8c0,1,0.8,1.8,1.7,1.8c1,0,1.7-0.8,1.7-1.8C7.5,15.3,6.7,14.4,5.7,14.4z M5.7,17.4c-0.6,0-1-0.5-1-1.1
    c0-0.6,0.5-1.1,1-1.1c0.6,0,1,0.5,1,1.1C6.7,16.9,6.3,17.4,5.7,17.4z M16.5,15h-1.8V15H7.9c-0.4-0.8-1.3-1.3-2.2-1.3
    c-0.9,0-1.7,0.5-2.2,1.3H2.2C2,15,1.9,15.1,2,15.3l0.2,0.4c0.2,0.4,0.6,0.7,0.9,0.7s0.6,0,0.6,0c0,0,0-0.1,0-0.1
    c0-0.5,0.2-1,0.5-1.4c0.1-0.2,0.3-0.3,0.4-0.4c0,0,0,0,0,0c0,0,0.1,0,0.1-0.1c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0
    c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0.1,0,0.1-0.1,0.2-0.1c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0c0,0,0,0,0,0
    c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0
    c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0
    c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0.1c0,0,0,0,0,0c0.1,0.1,0.2,0.2,0.4,0.3
    c0,0,0.1,0.1,0.1,0.1c0,0,0,0.1,0.1,0.1c0.3,0.4,0.4,0.8,0.4,1.3c0,0,0,0.1,0,0.1H17l0-0.3l0-0.2v0l0,0l0-0.2l0,0l0,0l0-0.2l0,0l0,0
    l0-0.2l0,0l0,0l0-0.1h-0.6V15z"/>
</svg>
  1. 如何使用SVG进行编译,从而使我可以在上面的文件结构中进行引用?我可以人工输出到app / public / images /文件中,以便在移动引用时有意义吗?
  2. 我的SVG无法正常工作是有原因的吗?

谢谢,如果需要,我会尽可能地澄清!

编辑:记录svgObject会给一个对象提供键:值对:

./movers.svg:"9fa427b3a238b5ef5d5e350ea4ed4c18.svg"

HTMl参考是:

<img class="category-icon" src="9fa427b3a238b5ef5d5e350ea4ed4c18.svg">

Dist看起来像这样:

/dist
  9fa427b3a238b5ef5d5e350ea4ed4c18.svg
  index.html
  main.js

同样,必须将文件放在以下位置:

 /app
      /public
        /images
          9fa427b3a238b5ef5d5e350ea4ed4c18.svg (maybe? Or does this need to be in javascripts? both don't work...I think the paths are in main.js)
        /javascripts
          main.js
        /data
        /stylesheets
        index.html

0 个答案:

没有答案