Подтвердить что ты не робот

Настроить webpack для вывода изображений/шрифтов в отдельные подпапки

Мне удалось настроить webpack для вывода CSS и JS в соответствующие подкаталоги, т.е. public/asests/css и public/assets/js. Однако я не знаю, как сделать то же самое для изображений и шрифтов.

Другими словами, я хочу выводить изображения в папку public/assets/images и шрифты в папку public/assets/fonts.

Вот мой конфигурационный файл webpack:

var path = require('path');
var ExtractCSS = require('extract-text-webpack-plugin');

module.exports = {
    context: path.resolve('private/js'),
    resolve: ['', '.js', '.jsx', '.es6', '.json'],
    entry: {
        homepage: './homepage'
    },
    output: {
        path: path.resolve('public/assets'),
        publicPath: '/public/assets/',
        filename: 'js/[name].js'
    },
    plugins: [
        new ExtractCSS('css/[name].css')
    ],
    devServer: {
        contentBase: 'public'
    },
    module: {
        loaders: [
            {
                test: /\.(es6|js|jsx)$/,
                exclude: /node_modules/,
                loader: 'babel-loader'
            },
            {
                test: /\.css$/,
                exclude: /node_modules/,
                loader: ExtractCSS.extract('style-loader', 'css-loader')
            },
            {
                test: /\.less$/,
                exclude: /node_modules/,
                loader: ExtractCSS.extract('style-loader', 'css-loader!less-loader')
            },
            {
                test: /\.(jpg|jpeg|gif|png|woff|woff2|eot|ttf|svg)$/,
                exclude: /node_modules/,
                loader: 'url-loader?limit=1024'
            }
        ]
    }
}
4b9b3361

Ответ 1

Я мог бы понять это, обратившись к url-loader и file-loader документации по GitHub.

Все, что мне нужно было сделать, это добавить в загрузчик параметр строки имя, чтобы указать полный путь. Я также узнал, что вы можете указать, как файлы должны быть указаны в месте вывода.

{
    test: /\.(jpg|jpeg|gif|png)$/,
    exclude: /node_modules/,
    loader:'url-loader?limit=1024&name=images/[name].[ext]'
},
{
    test: /\.(woff|woff2|eot|ttf|svg)$/,
    exclude: /node_modules/,
    loader: 'url-loader?limit=1024&name=fonts/[name].[ext]'
}

Ответ 2

{ 
    test: /\.(ttf|eot|svg|woff2?)(\?v=[a-z0-9=\.]+)?$/i,
    include: folders.npm,
    loader: 'file?name=fonts/[name].[ext]'
},
{
    test: /\.(jpe?g|png|gif|svg|ico)$/i,
    include: folders.src,
    loaders: [
        'file?name=images/[sha512:hash:base64:7].[ext]',
        'image-webpack?progressive=true&optimizationLevel=7&interlaced=true'
    ]
}

Это то, что я использую в производстве. Я часто сталкиваюсь с ситуацией, когда используются изображения *.svg и шрифты SVG для резервного копирования IE. Здесь я предполагаю, что шрифт всегда находится внутри node_modules. Я также видел, как разработчики делали test: /fonts\/[w+].(svg|eot ....).

Ответ 3

Я смог решить эту проблему с помощью загрузчика файлов. Если вы используете Webpack 4, синтаксис немного другой.

{
    test: /\.(woff|woff2|eot|ttf|otf)$/,
    use: ['file-loader', 'file-loader?name=fonts/[name].[ext]']
}