私はかなりwebpackに慣れていませんが、css-loaderまたはfile-loaderに問題があります。
背景画像を読み込もうとしていますが、うまくいきません。 devtoolsはbackground-image
スタイルを表示しますが、背景画像は表示されません。
background-image
スタイルをelement.style
ブロックにコピーすると、すべて正常に動作します。私はどこかで愚かな間違いを犯していますか?
Bodyタグには背景画像が必要です。開発者ツールにスタイルが表示され、エラーはありません。
ファイル5a09e4424f2ccffb6a33915700f5cb12.jpg
をロードできますが、本文には背景がありません。
DevToolsのelement.style
にcss行を手動でコピーして貼り付けると、すべてが機能します。
これは、webpack-dev-server
またはwebpack
を使用してChromeとFirefoxの両方でバンドルした場合に発生します。
body { background-color: red }
などの他のスタイルは正常に機能します。
これはwebpack.config.jsです:
const path = require('path');
module.exports = {
"entry": [
'./src/index.js'
],
"output": {
"path": path.join(__dirname, 'build'),
"filename": "bundle.js"
},
devtool: "source-map",
"module": {
"loaders": [
{
"test": /\.scss$/,
"loaders": ["style", "css?sourceMap", "sass?sourceMap"]
},
{
test: /\.jpg$/,
loader: "file-loader"
}
]
},
devServer: {
contentBase: './build'
}
};
現在、css-loaderでsourceMapを使用する際にバグがあります。 CSSローダーからsourceMapを削除すると修正されます。
"module": {
"loaders": [
{
"test": /\.scss$/,
"loaders": ["style", "css", "sass?sourceMap"]
},
{
test: /\.jpg$/,
loader: "file-loader"
}
]
}
問題は以下に関連しています: https://github.com/webpack/css-loader/issues/296
ブラウザは、bodyタグの背景画像への相対パスを好まないようです。 ( CSSバックグラウンドイメージが読み込まれない および cssバックグラウンドイメージが正しく機能しない も参照)
コードを少し変更するだけでうまくいくようです。
background-image: url(http://localhost:8080/5a09e4424f2ccffb6a33915700f5cb12.jpg)
に変更します。これはほとんど理想的ではありません。<body class="foo">
.foo {
background-image: url('../img/test.jpg');
}
これらのどちらも本当の問題を解決するものではありませんが、行き詰まってしまいます。
1日この問題に苦労した後、私は最終的にpostcssを使用してCSS内のURLを書き換える方法を見つけました
webpack.config.js
const _ = require('lodash');
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const argv = {
verbose: _.includes(process.argv, '-v') || _.includes(process.argv, '--verbose'),
json: _.includes(process.argv, '--json'),
production: _.includes(process.argv, '--production'),
};
module.exports = {
cache: true,
devtool: argv.production ? "source-maps" : "eval",
output: {
path: 'public/build',
filename: '[name].js',
publicPath: "/build/",
pathinfo: true // use with devtool: "eval",
},
resolve: {
modulesDirectories: ['node_modules'],
extensions: ['', '.js', '.jsx']
},
module: {
loaders: [
{
test: /\.less$/,
loader: argv.production
? ExtractTextPlugin.extract('style-loader?sourceMap=1', [
'css-loader?sourceMap=1&importLoaders=1',
'postcss-loader?sourceMap=1',
'less-loader?sourceMap=1'
]) : [
'style-loader?sourceMap=1',
'css-loader?sourceMap=1&importLoaders=1',
'postcss-loader?sourceMap=1',
'less-loader?sourceMap=1'
].join('!')
},
{
test: /\.css$/,
loader: argv.production
? ExtractTextPlugin.extract('style-loader?sourceMap=1', [
'css-loader?sourceMap=1&importLoaders=1',
'postcss-loader?sourceMap=1',
]) : [
'style-loader?sourceMap=1',
'css-loader?sourceMap=1&importLoaders=1',
'postcss-loader?sourceMap=1',
].join('!')
},
]
}
}
postcss.config.js
const argv = {
verbose: _.includes(process.argv, '-v') || _.includes(process.argv, '--verbose'),
json: _.includes(process.argv, '--json'),
production: _.includes(process.argv, '--production'),
};
module.exports = {
plugins: [
require('autoprefixer')({
browsers: [
"> 5%", // https://www.netmarketshare.com/browser-market-share.aspx?qprid=2&qpcustomd=0
"last 2 versions", // http://caniuse.com/
]
}),
require('postcss-url-mapper')(function(url) {
return argv.production ? url : url.replace(new RegExp('^/'), 'http://localhost:3000/');
})
]
};
出力のpublicPathエントリはどこにありますか?例えば:
publicPath: ' http:// localhost:5000 / '、//ソースマップで動作するcss内の画像の絶対パス要件。 LANでアクセスするには、実際の数値IPである必要があります。
https://github.com/webpack/docs/wiki/configuration#outputpublicpath
Webpackはcssを生成し、<link>
urlを介してblob:
sします。これにより、背景画像の読み込みで問題が発生するようです。
開発回避策
開発中のファイルローダーを介して画像をインライン化します(cssに大きなbase64文字列を作成します)
しかし、ホットリロードは可能です。
生産回避策
CSSを通常のファイルとして提供するには、 ExtractTextPlugin を使用します。
以下を使用してみてください:
html {
background: url(~/Public/img/bg.jpg) no-repeat center center fixed;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
}
webpackのcss-loader:
{
test: /\.(css|eot|svg|ttf|woff|jpg|png)$/i,
use: ExtractTextPlugin.extract({
use: [{
loader: 'css-loader',
options: {
importLoaders: 1,
minimize: true
},
}],
}),
},
Bundle.cssの結果は次のとおりです。
html{background:url(/Public/img/bg-picking.jpg) no-repeat 50% fixed;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover}