此处可复制的设置最少:https://github.com/jamesopti/webpack_playground/tree/resolve_url_loader_issue
我正在尝试使用resolve-url-loader
向我的scss url()
图像路径添加哈希名称,但是我花了一点时间才能使其与Webpack 4一起使用。
我在/static/img/**
中有一堆图像,这些图像在我的SCSS中被引用为:
span.arrow {
background: url(/static/img/audiences.png);
}
最终以完全相同的结果出现在我的CSS中(resolve-url-loader无法找到它们)
当我通过webpack运行以下配置时,我看到resolve loader正在找到正确的
url()
及其路径,但是 Debug模式会显示NOT FOUND。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'
],
},
},
],
},
]
最佳答案
事实证明,我所需要做的就是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',
},
},
];