Configuration minimale reproductible ici: https://github.com/jamesopti/webpack_playground/tree/resolve_url_loader_issue
J'essaie d'utiliser resolve-url-loader
pour ajouter un hashname à mes chemins d'image scss url()
, mais j'ai du mal à le faire fonctionner avec webpack 4 . J'ai un tas d'images dans /static/img/**
qui sont référencées dans mon SCSS comme:
span.arrow {
background: url(/static/img/audiences.png);
}
Ce qui se retrouve dans mon css comme étant exactement la même chose (resol-url-loader ne les trouve pas)
Lorsque j'exécute la configuration suivante via Webpack, je constate que le chargeur de résolution trouve le droit url()
et son chemin, mais le mode de débogage indique NOT FOUND.
resolve-url-loader: /static/img/audiences.png
/Users/usr1/webpack_playground/src
/Users/usr1/webpack_playground/static/img
NOT FOUND
Existe-t-il une configuration de sortie incorrecte? J'ai essayé diverses combinaisons de paramètres en vain:
loader: 'resolve-url-loader',
options: {
debug: true,
root: path.join(__dirname, './static/img'),
includeRoot: true,
absolute: true,
},
Mon objectif final est que le chargeur de fichiers les transforme en version hachée/dist:
span.arrow {
background: url(/static/img/audiences-dhsye47djs82kdhe6.png);
}
// configuration des règles 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'
],
},
},
],
},
]
Il s'avère que tout ce dont j'avais besoin était file-loader
pour faire ce que je voulais.
Lorsqu'une image (correspondant aux extensions de fichier spécifiées) est rencontrée par l'un des chargeurs css/sass/style, elle est traitée via file-loader
, qui la copie dans le répertoire de sortie spécifié avec le format de nommage spécifié et renvoie le nom du chargeur sass utiliser comme nom de fichier.
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',
},
},
];
J'ai eu le même problème. Je crois que vous devezurl-loader
charger les images correctement avec Webpack 4. Cette configuration a fonctionné pour moi:
rules: [
{
test: /\.(png|jpg)$/,
loader: "url-loader",
}, {
test: /\.(scss|css)$/,
use: [
"style-loader",
"css-loader",
"sass-loader",
]
}
]