Вставить изображения с [contenthash], сгенерированные webpack

#webpack #webpack-file-loader #pug-loader

#webpack #webpack-загрузчик файлов #pug-загрузчик

Вопрос:

Я хочу добавить хэш содержимого к изображениям, сгенерированным в моей конфигурации webpack. Файлы выводятся с хэшем, но я не уверен, как вставить их в мой html. HTML с генерируется с помощью pug и HtmlWebpackPlugin.

Соответствующие фрагменты webpack.config.js:

     {
        test: /.(jpeg|jpg|png|gif)$/,
        use: [
            'file-loader?name=images/[name].[contenthash:4].[ext]',
            {
                loader: 'image-webpack-loader',
                options: {
                    mozjpeg: {
                        progressive: true,
                        quality: 65
                    }
                }
            }
        ]
    },

    new HtmlWebpackPlugin({
        template: './src/pug/index.pug',
        filename: 'index.htm',
        inject: true
    })
  

Изображение в pug, где я хочу вывести правильное имя файла:

 img(src='/images/logo.png') <-- this needs to be img(src='/images/logo.64fd.png')
  

Ответ №1:

У меня возник тот же вопрос; ниже приведены примеры кода из разработанного мной решения.

Главное, что мне помогло, — это загрузчик pug README.md Раздел «Встроенные ресурсы»: «Попробуйте использовать require для всех ваших встроенных ресурсов, чтобы обработать их с помощью webpack».

До тех пор, пока вам требуются ваши файлы должным образом, Webpack добавит их в свой график зависимостей и обработает их в соответствии с правилами конфигурации, которые вы определяете для каждого типа расширения файла. Эта обработка включает добавление contenthash имен файлов к вашим изображениям в выходных данных HTML в соответствии с методом, который вы указываете в объекте конфигурации загрузчика файлов options.name .

Конфигурация Webpack:

 // webpack.common.js
// (edited/trimmed for clarity)
module.exports = {
    module: {
        rules: [{
            test: /.(jpeg|jpg|png|gif)$/,
            use: [
                {
                    loader: "file-loader",
                    /**
                     * use `name` to specify how and where images should be outputted
                     *
                     * 1. use the image's filepath to set the URL path from which it's served
                     * 2. use the image's filename and contenthash to set its URL filename
                     */
                    options: {
                        name: "[path][name].[contenthash].[ext]",
                        // you may need to set `outputPath` too if you want
                        // to specify how/where images should be outputted
                    },
                },
                {
                    loader: 'image-webpack-loader'
                },
            ],
        }],
    },
    plugins: [
        new HtmlWebpackPlugin({
            // set the base path that will be prepended on all relative-path tag attributes
            // ex: <img src/>, <link href/>, <script src/>, etc.
            publicPath: "/",
        }),
    ],
}
  

Шаблон Pug:

 // page.pug
// (edited/trimmed for clarity)
img(
    alt="Accessible alternate text"
    src=require("./images/image.jpg").default
)
  

Я также перечислил свои версии зависимостей ниже; могут быть различия в конфигурации из-за управления версиями пакета, но должны применяться те же общие принципы. Удачи!

 // package.json
// (edited/trimmed for clarity)
"devDependencies": {
    "file-loader": "^6.2.0",
    "html-webpack-plugin": "^5.1.0",
    "image-webpack-loader": "^7.0.1",
    "pug": "^3.0.0",
    "pug-loader": "^2.4.0",
    "webpack": "^5.22.0",
    "webpack-cli": "^4.5.0",
    "webpack-dev-server": "^3.11.2",
    "webpack-merge": "^5.7.3"
}