Webpack 4 с Sass-loader & resolve-url-loader-пути Изображения не найдены
минимально воспроизводимая настройка здесь: https://github.com/jamesopti/webpack_playground/tree/resolve_url_loader_issue
Im пытается использовать resolve-url-loader
добавить hashname на мой СКС url()
пути изображения, но у меня есть чертовски много времени, чтобы заставить его работать с webpack 4.
У меня есть куча изображений в /static/img/**
на которые ссылаются в моем SCSS, как:
span.arrow {
background: url(/static/img/audiences.png);
}
который заканчивается в моем css как точно то же самое (resolve-url-loader не находит их)
когда я запускаю следующую конфигурацию через webpack, я вижу, что resolve loader находит правильный url()
и его путь, но режим отладки говорит, что не найден.
resolve-url-loader: /static/img/audiences.png
/Users/usr1/webpack_playground/src
/Users/usr1/webpack_playground/static/img
NOT FOUND
есть ли какая-то выходная конфигурация, которая не верна? Я пробовал различные комбинации настроек безрезультатно:
loader: 'resolve-url-loader',
options: {
debug: true,
root: path.join(__dirname, './static/img'),
includeRoot: true,
absolute: true,
},
моя конечная цель состоит в том, чтобы файл-загрузчик преобразовал их в хэшированную версию /dist:
span.arrow {
background: url(/static/img/audiences-dhsye47djs82kdhe6.png);
}
// Конфигурация правил Webpack
rules: [
{
test: /.(png|jpg|gif)$/,
include: [
path.resolve(__dirname, './static/img'),
],
use: {
loader: 'file-loader',
options: {
name: '[name]-[hash].[ext]',
},
},
},
{
test: /.svg$/,
use: {
loader: 'svg-inline-loader',
options: {
name: '[name]-[hash].[ext]',
},
},
},
{ test: //src/js/(?:.*).css$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader' } ] },
{
test: [/.scss$/, /.sass$/],
use: [
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
sourceMap: true,
},
},
{
loader: 'resolve-url-loader',
options: {
debug: true,
root: './static/img',
includeRoot: true,
},
},
{
loader: 'sass-loader',
options: {
outputStyle: 'compressed',
sourceMap: true,
includePaths: [
'./src'
],
},
},
],
},
]
2 ответов
у меня была та же проблема. Я верю вам нужно url-loader
для правильной загрузки изображений с помощью Webpack 4. Эта настройка сработала для меня:
rules: [
{
test: /\.(png|jpg)$/,
loader: "url-loader",
}, {
test: /\.(scss|css)$/,
use: [
"style-loader",
"css-loader",
"sass-loader",
]
}
]
оказывается, все, что мне было нужно, это file-loader
делать то, что я хотел.
когда изображение (соответствующее моим указанным расширениями файлов) встречается любым из загрузчиков css/sass/style, его обрабатывают через file-loader
, который копирует его в выходной каталог, указанный с указанным форматом именования, и возвращает имя загрузчика sass для использования в качестве имени файла.
rules: [
{
test: /\.(png|jpg|gif|svg)$/,
exclude: [
path.resolve(__dirname, './node_modules'),
],
use: {
loader: 'file-loader',
options: {
name: '[path][name]-[hash].[ext]',
outputPath: '../',
publicPath: '/dist',
},
},
},
{
test: /\.svg$/,
include: [
path.resolve(__dirname, './node_modules'),
],
use: {
loader: 'svg-inline-loader',
options: {
name: '[name]-[hash].[ext]',
},
},
},
{ test: /\/src\/js\/(?:.*)\.css$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader' } ] },
{
test: [/\.scss$/, /\.sass$/],
use: [
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
sourceMap: true,
root: path.resolve(__dirname),
},
},
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: () => [
autoprefixer({
'browsers': ['last 2 versions', 'ie >= 10'],
}),
],
sourceMap: true,
},
},
{
loader: 'sass-loader',
options: {
outputStyle: 'compressed',
sourceMap: true,
includePaths: [
'./src/scss',
],
},
},
],
},
{
test: /\.html$/,
use: [
{
loader: 'html-loader',
options: {
root: path.resolve(__dirname),
},
},
],
},
{
test: [
/\/bundles\/(?:.*)\.js$/,
],
use: {
loader: 'babel-loader',
},
},
];