Webpack 没有为生产 css 文件中的图像创建正确的路径
Webpack doesn't create right paths for images in production css file
要将图像添加到项目中,我正在使用内容:url() css 属性 在 sass 文件中并指定 src 文件夹的相对路径,例如content: url('/images/right-arrow.svg');
。
问题是在生产构建中我需要去掉第一个斜杠才能在捆绑的 css 文件中包含这样的路径 ('images/right-arrow.svg')
。
我可以获得所需行为的唯一方法是对 css-loader
使用 url: false
选项,并在 sass 文件中写入不带斜杠的路径:content: url('/images/right-arrow.svg')
,但是这样选项不要从 node_modules 添加必要的文件,例如字体和图像。
Webpack 配置:
return {
entry: ['babel-polyfill', './src/app.js'],
output: {
path: path.join(__dirname, 'public/'),
filename: '[name].[hash].js',
},
mode: isProduction || 'development',
module: {
rules: [
{
loader: 'babel-loader',
test: /\.js$/,
exclude: /node_modules/
},
{
test: /\.s?css$/,
use: [
isProduction ? MiniCssExtractPlugin.loader : 'style-loader',
{
loader: 'css-loader',
options: {
url: true
}
},
'sass-loader'
]
},
{
test: /\.(svg|gif|png)$/,
use: {
loader: 'file-loader',
options: {
name: '[name].[ext]',
outputPath: 'images'
}
}
},
{
test: /\.(otf|woff2|ttf|eot|woff)$/,
use: {
loader: 'file-loader',
options: {
name: '[name].[ext]',
outputPath: 'fonts/'
}
}
}
]
}
我在 webpack 配置中缺少什么来实现正确的工作路径?
检查 documentation 关于 url(...)
的问题。
它建议使用 resolve-url-loader.
也可以尝试使用copy-webpack-plugin
好的,我已经解决了这个问题。我正在使用 resolve-url-loader with no results, before @Ujin suggested to use it. After his comment I've clarified what resolve-url-loader 并正确配置它来解决我的问题。主要问题是我错过了阅读 resolve-url-loader 文档的重要段落,其中说:
source-maps required for loaders preceding resolve-url-loader (regardless of devtool).
我也没有使用 resolve-url-loader 插件的 root 选项。因此,.scss 文件的 webpack 配置如下所示:
test: /\.s?css$/,
use: [
isProduction ? MiniCssExtractPlugin.loader : 'style-loader',
'css-loader',
{
loader: 'resolve-url-loader',
options: {
root: path.join(__dirname, 'src')
}
},
{
loader: 'sass-loader',
options: {
sourceMap: true,
sourceMapContents: false
}
}
]
}
要将图像添加到项目中,我正在使用内容:url() css 属性 在 sass 文件中并指定 src 文件夹的相对路径,例如content: url('/images/right-arrow.svg');
。
问题是在生产构建中我需要去掉第一个斜杠才能在捆绑的 css 文件中包含这样的路径 ('images/right-arrow.svg')
。
我可以获得所需行为的唯一方法是对 css-loader
使用 url: false
选项,并在 sass 文件中写入不带斜杠的路径:content: url('/images/right-arrow.svg')
,但是这样选项不要从 node_modules 添加必要的文件,例如字体和图像。
Webpack 配置:
return {
entry: ['babel-polyfill', './src/app.js'],
output: {
path: path.join(__dirname, 'public/'),
filename: '[name].[hash].js',
},
mode: isProduction || 'development',
module: {
rules: [
{
loader: 'babel-loader',
test: /\.js$/,
exclude: /node_modules/
},
{
test: /\.s?css$/,
use: [
isProduction ? MiniCssExtractPlugin.loader : 'style-loader',
{
loader: 'css-loader',
options: {
url: true
}
},
'sass-loader'
]
},
{
test: /\.(svg|gif|png)$/,
use: {
loader: 'file-loader',
options: {
name: '[name].[ext]',
outputPath: 'images'
}
}
},
{
test: /\.(otf|woff2|ttf|eot|woff)$/,
use: {
loader: 'file-loader',
options: {
name: '[name].[ext]',
outputPath: 'fonts/'
}
}
}
]
}
我在 webpack 配置中缺少什么来实现正确的工作路径?
检查 documentation 关于 url(...)
的问题。
它建议使用 resolve-url-loader.
也可以尝试使用copy-webpack-plugin
好的,我已经解决了这个问题。我正在使用 resolve-url-loader with no results, before @Ujin suggested to use it. After his comment I've clarified what resolve-url-loader 并正确配置它来解决我的问题。主要问题是我错过了阅读 resolve-url-loader 文档的重要段落,其中说:
source-maps required for loaders preceding resolve-url-loader (regardless of devtool).
我也没有使用 resolve-url-loader 插件的 root 选项。因此,.scss 文件的 webpack 配置如下所示:
test: /\.s?css$/,
use: [
isProduction ? MiniCssExtractPlugin.loader : 'style-loader',
'css-loader',
{
loader: 'resolve-url-loader',
options: {
root: path.join(__dirname, 'src')
}
},
{
loader: 'sass-loader',
options: {
sourceMap: true,
sourceMapContents: false
}
}
]
}