带有 sass-loader 和 resolve-url-loader 的 Webpack 4 - 找不到图像路径
Webpack 4 with sass-loader & resolve-url-loader - Image paths not being found
此处可重现性最低的设置: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 中是完全相同的东西(解析-url-loader 没有找到它们)
当我通过 webpack 运行 下面的配置时,我看到 resolve loader 找到了正确的 url()
和它的路径,但是调试模式说 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'
],
},
},
],
},
]
我遇到了同样的问题。我相信 you need 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
进行处理,它们都会将其复制到以命名格式指定的输出目录指定 returns 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',
},
},
];
其实resolve-url-loader还是需要的有时...
这取决于您是否希望能够从 sass 编译中导入的文件解析 url() 调用。没有它 urls 在这种情况下会被破坏。
但是如果你不使用多文件 scss 构建(例如,如果每个组件只有 1 个本地 scss 文件而不调用共享库 scss 代码或某种类型的部分) - 那么你就不会需要解析-url-loader.
当然,您仍然需要 url-loader(使用内联功能包装 file-loder)或 file-loader(用于将资产直接复制到 dist 文件夹)
resolve-url-loader 通过重新处理 sass 发出的 sourcemap 中的原始文件来工作
sass-loader 在使用 dart-sass 实现时确实存在源映射问题。在这种情况下,sourcemap sources 会被错误地用 stdin 代替文件名
见 issue 671 and fix that came in PR 681
截至今天(2019 年 7 月),这仍然是未发布的修复程序,唯一的选择是使用 node-sass 或使用未发布的 sass-loader
此处可重现性最低的设置: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 中是完全相同的东西(解析-url-loader 没有找到它们)
当我通过 webpack 运行 下面的配置时,我看到 resolve loader 找到了正确的 url()
和它的路径,但是调试模式说 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'
],
},
},
],
},
]
我遇到了同样的问题。我相信 you need 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
进行处理,它们都会将其复制到以命名格式指定的输出目录指定 returns 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',
},
},
];
其实resolve-url-loader还是需要的有时... 这取决于您是否希望能够从 sass 编译中导入的文件解析 url() 调用。没有它 urls 在这种情况下会被破坏。
但是如果你不使用多文件 scss 构建(例如,如果每个组件只有 1 个本地 scss 文件而不调用共享库 scss 代码或某种类型的部分) - 那么你就不会需要解析-url-loader.
当然,您仍然需要 url-loader(使用内联功能包装 file-loder)或 file-loader(用于将资产直接复制到 dist 文件夹)
resolve-url-loader 通过重新处理 sass 发出的 sourcemap 中的原始文件来工作 sass-loader 在使用 dart-sass 实现时确实存在源映射问题。在这种情况下,sourcemap sources 会被错误地用 stdin 代替文件名 见 issue 671 and fix that came in PR 681
截至今天(2019 年 7 月),这仍然是未发布的修复程序,唯一的选择是使用 node-sass 或使用未发布的 sass-loader