【问题标题】:react production build, assets not loading反应生产构建,资产未加载
【发布时间】:2018-09-18 10:11:17
【问题描述】:

我遇到了烦人的问题,当我在开发环境中运行我的 react 应用程序时一切正常,但是当我尝试构建到生产环境时,所有链接都是错误的。

假设这棵树:

  • 主目录

    • 公开/
      • svg/
        • some_img.svg
    • 源/
      • 组件/
        • some_component.jsx
      • App.js
      • index.js

现在在some_component.jsx 我以这种方式引用 svg 文件:

src="/public/svg/some_img.svg"

然而,在构建到生产环境之后,这个路径没有改变,因此无法再访问文件,因为我需要将它更改为:

src="svg/some_img.svg"

我在 webpack 配置文件中玩,我想可能是通过设置:

publicPath: "/"

到:

publicPath: "/public/"

会解决问题,但它唯一做的就是在应用程序启动期间出错:

CANNOT GET/

我的 webpack 配置:

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

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

module.exports = {
  output: {
    filename: "main.[hash:8].js",
    publicPath: "/"
  },
  module: {
    rules: [
      {
        test: /\.jsx$/,
        exclude: /node_modules/,
        loader: "babel-loader?presets[]=react"
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader"
        }
      },
      {
        test: /\.(sass|scss)$/,
        use: ["style-loader", "css-loader", "sass-loader", "postcss-loader"]
      },
      {
        test: /\.svg$/,
        loader: "svg-sprite-loader"
      }
    ]
  },
  plugins: [htmlPlugin],
  devServer: {
    historyApiFallback: {
      rewrites: [{ from: /^\/$/, to: "/index.html" }]
    }
  },
  resolve: {
    extensions: [".js", ".jsx", ".json"]
  }
};

如何解决这个问题,以便统一开发和生产路径?

【问题讨论】:

    标签: javascript node.js reactjs webpack


    【解决方案1】:

    如何导入 svg 然后引用导入的变量:

    import someImg from "../../public/svg/some_img.svg"
    
    src={someImg}
    

    【讨论】:

    • 这无论如何都没有帮助,我有额外的模块用于 svg 处理并且不会像那样工作,我需要的是为它配置 webpack 的方法。
    • 据我所知,这种方法是普遍接受的用webpack加载图片的方法。
    • 这(如果有的话)只会解决在 jsx 组件中导入 svg 文件的问题,以及我应该如何处理 css 中图像的路径?开发路径看起来与生产路径不同
    • css 中的路径,您也可以处理。您的 css 所在位置的相对路径。 sass/css 加载器会为您修复该问题并将路径转换为正确的路径。在你的 jsx 上,你不应该那样导入。
    • 在 jsx 上使用 import mysvg from '../../path/to/wherever/it/is',在 css 上使用 url('../../mysvg')
    【解决方案2】:

    这是问题的解决方案,指定路径所需的配置:

    module: {
        ...
        rules: [
            {
                test: /\.(png|jpg|gif|svg|ico)$/,
                loader: 'file-loader',
                query:{
                    outputPath: './img/',
                    name: '[name].[ext]?[hash]'
                }
            }
            ...
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 2016-10-26
      • 2017-02-06
      • 2020-07-06
      相关资源
      最近更新 更多