@TuMko

Почему webpack 5 использует неправильные src изображений?

Делаю сборку webpack 5 со следующей структурой:
-dist
  -assets
    -img
  index.html
-src
  -assets
    -img
  -js
  -styles
  index.html
webpack.common
webpack.dev
webpack.prod

В index.html прописана картинка с путем assets/img/1.png, но она не отображается из-за неверного пути. Если картинке прописать путь src/assets/img/1.png, тогда она появится, но при продакшн сборке не будет отображаться эта картинка из-за неверного пути к ней (в папке dist не предусмотрена папка src, там сразу будет папка assets, а в ней уже папка img с картинкой). Т.е. получается index.html из папки src берет пути к файлам, как будто сам он находится в корне проекта. Как это исправить, чтобы не выносить папку assets из src и не создавать папку src в dist?

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

const dirNode = 'node_modules';
const dirJs = path.join(__dirname, 'src/js');
const dirStyles = path.join(__dirname, 'src/styles');
const dirAssets = path.join(__dirname, 'src/assets');

/**
 * Webpack Configuration
 */
module.exports = env => {
    // Is the current build a development build
    const IS_DEV = !!env.dev;

    return {
       
        entry: {
            main: path.join(dirJs, 'index')
        },

        resolve: {
            extensions: ['.js'],
            modules: [
                dirNode,
                dirJs,
                dirStyles,
                dirAssets
            ]
        },

        plugins: [
            new webpack.DefinePlugin({ IS_DEV }),

            new HtmlWebpackPlugin({
                template: 'src/index.html'
            })
        ],

        module: {
            rules: [
                // BABEL
                {
                    test: /\.m?js$/,
                    exclude: /(node_modules)/,
                    use: {
                        loader: 'babel-loader',
                        options: {
                            compact: true
                        }
                    }
                },

                // STYLES
                {
                    test: /\.css$/,
                    use: [
                        'style-loader',
                        {
                            loader: 'css-loader',
                            options: {
                                sourceMap: IS_DEV
                            }
                        },
                    ]
                },

                // CSS / SASS
                {
                    test: /\.scss/,
                    use: [
                        'style-loader',
                        {
                            loader: 'css-loader',
                            options: {
                                sourceMap: IS_DEV
                            }
                        },
                        {
                            loader: 'sass-loader',
                            options: {
                                sourceMap: IS_DEV,
                                sassOptions: {
                                    includePaths: [dirAssets]
                                }
                            }
                        }
                    ]
                },

                // IMAGES
                {
                    test: /\.(png|jpe?g|gif)$/i,
                    use: {
                        loader: 'file-loader',
                        options: {
                            name: '[path][name].[ext]'
                        }
                    }
                }
            ]
        },

        optimization: {
            runtimeChunk: 'single'
        }
    };
};


webpack.dev:
const { merge } = require('webpack-merge');
const common = require('./webpack.common');

module.exports = env => {
    return merge(common(env), {
        mode: 'development',
        // Use eval-cheap-source-map for accurate line numbers, eval has best build performance
        devtool: 'eval',
        output: {
            pathinfo: true,
            publicPath: '/',
            filename: '[name].bundle.js'
        },
        devServer: {
            open: true,
            port: 3000,
        }
    });
};


webpack.prod:
const path = require('path');
const { merge } = require('webpack-merge');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const CopyPlugin = require('copy-webpack-plugin');
const common = require('./webpack.common');

module.exports = env => {
    return merge(common(env), {
        mode: 'production',
        // IMPORTANT: Configure server to disallow access to source maps from public!
        devtool: 'source-map',
        output: {
            path: path.resolve(__dirname, 'dist'),
            filename: '[name].bundle.js'
        },
        plugins: [
            new CleanWebpackPlugin(),

            new CopyPlugin({
                patterns: [
                    { from: path.join(__dirname, 'src/assets'), to: 'assets' }
                ]
            })
        ]
    });
};
  • Вопрос задан
  • 750 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы