ここで最小限の再現可能なセットアップ: 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を使用して次の構成を実行すると、解決ローダーが正しい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'
],
},
},
],
},
]
_
必要なのは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',
},
},
];
同じ問題がありました。 必要url-loader
は、Webpack 4で画像を適切にロードします。このセットアップは、私にとってはうまくいきました。
rules: [
{
test: /\.(png|jpg)$/,
loader: "url-loader",
}, {
test: /\.(scss|css)$/,
use: [
"style-loader",
"css-loader",
"sass-loader",
]
}
]
実際には、resolve-url-loaderがまだ必要ですsometimes...内部にインポートされたファイルからurl()呼び出しを解決できるかどうかによって異なりますSassコンパイル。これがないと、この場合URLが破損します。
ただし、マルチファイルscssビルドを使用しない場合(たとえば、各コンポーネントにローカルのscssファイルが1つしかない場合、共有ライブラリscssコードまたは何らかのパーシャルを呼び出さない場合)-resolve-url-は必要ありませんローダ。
もちろん、url-loader(インライン機能を備えたfile-loderをラップする)またはfile-loader(アセットをdistフォルダーに直接コピーするため)がまだ必要です。
resolve-url-loaderは、sassによって発行されたソースマップから元のファイルを再加工することで機能し、sart-loaderは、Dart-sassの実装で作業するときにソースマップに問題があります。この場合、ソースマップソースは誤ってファイル名の代わりに標準入力になります issue 671 を参照してください PR 681
これは今日(2019年7月)の時点で未リリースの修正であり、唯一のオプションはnode-sassを使用するか、未リリースのsass-loaderを使用することです