【问题标题】:Webpack file-loader not loading assets folder in production buildWebpack 文件加载器未在生产构建中加载资产文件夹
【发布时间】:2020-08-06 02:09:45
【问题描述】:

我已经在 netlify 中部署了我在 Webpack 中构建的 react 应用程序。我看到 CSS、字体和其他所有内容都加载正常,但不是 assets/images 文件夹下的图像。

这是我在实时站点源路径中的文件夹结构:

我的 webpack.config.js:

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    entry: ['./src/index.js', '@babel/polyfill'],
    module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-react', '@babel/preset-env'],
                    },
                },
            },
            {
                test: /\.css$/i,
                exclude: /node_modules/,
                use: [
                    'style-loader',
                    {
                        loader: 'css-loader',
                        options: {
                            modules: true,
                        },
                    },
                ],
            },
            {
                test: /\.(gif|png|jpe?g)$/,
                use: [
                    {
                        loader: 'file-loader',
                        options: {
                            // name: '[name].[ext]',
                            // name: '[path][name].[hash].[ext]',
                            name: '/src/assets/images/[hash].[ext]',
                            // outputPath: 'src/assets/images/',
                        },
                    },
                ],
            },
            
        ],
        
    },
    devServer: {
        host: '192.168.1.10', //your ip address,
        historyApiFallback: true,
        contentBase: './build',
        disableHostCheck: true,
    },
    resolve: {
        extensions: ['*', '.js', '.jsx'],
    },
    output: {
        path: path.resolve(__dirname, '/dist'),
        filename: 'bundle.js',
        publicPath: '/',
    },
    plugins: [
        new webpack.HotModuleReplacementPlugin(),
        new HtmlWebpackPlugin({
            filename: 'index.html',
            inject: true,
            template: path.resolve(__dirname, 'index.html'),
        }),
    ],
    devServer: {
        contentBase: './build',
        hot: true,
    },
};

我尝试像这样在 JSX 中访问我的图像 -

import { HeaderLogo } from '../../assets/images/image_name.png';

当我检查元素并将路径从/assets/images/image-name.png 更改为/src/assets/images/image-name.png 时,它会在实时站点中显示图像。

这是我在本地的文件夹结构:

在本地也可以正常工作。不确定是什么导致产品出现问题。我知道我的文件加载器路径有问题。但不知道在哪里更正。

有什么建议吗?

【问题讨论】:

  • 您的配置看起来不错。您是否仅在您的服务器中部署静态文件?
  • 如果我没弄错的话,我会在 src/assets/images 中添加所有图像文件并构建它。我正在从那里访问图像,而不是从任何其他服务器。在生成的 ./dist 文件夹中,我看到了资产。但不是通过 netlify 部署时
  • 我的意思是您是否在您的服务器中通过dist/index.html 为您的网站提供服务?这意味着服务器根目录是dist 目录,因此当您请求具有公共路径的资产时,就像yourDomain/assets/image/logo.png 一样。
  • 是的,我看到该站点是从 dist/index.html 提供的。但是,我不想将所有图像 src 路径更改为 yourDomain/assets/image/logo.png,这是一个痛苦的过程。我怀疑是否某些东西在本地使用相同的路径,配置中的一些更改会使它在产品中工作吗?或者每次部署时,我应该将其更改为公共路径吗?
  • 这里是我目前面临这个问题的网站 - frosty-colden-75f287.netlify.app/#

标签: javascript reactjs webpack netlify webpack-file-loader


【解决方案1】:

您需要将镜像文件复制到构建目录。

为此,请安装 webpack 复制插件:copy-webpack-plugin

npm install copy-webpack-plugin --save-dev

而 webpack 配置应该是:

// import copy plugin
const CopyPlugin = require('copy-webpack-plugin');

module.exports = {
    entry: ['./src/index.js', '@babel/polyfill'],
    module: {

       ...

    },
    plugins: [

        ...

        new CopyPlugin({
            patterns: [
                {
                    from: path.resolve(__dirname, '/src/assets/images'),
                    to: path.resolve(__dirname, 'dist')
                }
            ]
        }),
     ]
};

更多详情https://www.npmjs.com/package/copy-webpack-plugin

【讨论】:

  • 那也没有解决它。我仍然看不到 dist 文件夹下的资产。您可以在frosty-colden-75f287.netlify.app/# 找到最新构建的项目
  • 这是最新的配置更改 - 输出:{ path: path.join(__dirname, "/dist"), filename: "bundle.js", publicPath: "/", }, plugins: [ new webpack.HotModuleReplacementPlugin(), new HtmlWebpackPlugin({ template: path.resolve("./dist/index.html"), }), new CopyPlugin({ patterns: [ { from: path.resolve(__dirname, "/src /assets/images"), to: path.resolve(__dirname, "dist"), }, ], }), ],
  • 你弄明白了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多