Webpack-les images d'arrière-plan ne se chargent pas

je suis assez nouveau sur webpack mais j'ai quelques problèmes avec CSS-loader ou file-loader.

j'essaie de charger une image de fond mais ça ne marche pas très bien. L'image de fond n'est pas montrée, même si les devtools montrent le style background-image .

si je copie le style background-image dans le bloc element.style , tout fonctionne très bien. Est-ce que je fais une erreur stupide quelque part?

l'étiquette du corps doit avoir un image d'arrière-plan. Le style apparaît dans les outils de développement et il n'y a pas d'erreurs:

1

je peux charger le fichier 5a09e4424f2ccffb6a33915700f5cb12.jpg , mais le corps n'a pas de fond.

si je copie et colle manuellement la ligne css à element.style dans les DevTools, tout fonctionne:

2

cela se produit si je Package en utilisant webpack-dev-server ou tout simplement webpack et dans les deux Chrome et Firefox.

autres styles,tels que body { background-color: red } amende de travail.

C'est le 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'
    }
};
21
demandé sur Eric 2016-05-18 04:47:33

7 réponses

il y a actuellement un bug lors de l'utilisation de sourceMap avec CSS-loader. Retirer sourceMap de votre chargeur css devrait le corriger.

"module": {
    "loaders": [
        {
            "test": /\.scss$/,
            "loaders": ["style", "css", "sass?sourceMap"]
        },
        { 
            test: /\.jpg$/, 
            loader: "file-loader" 
        }
    ]
}

question liée à: https://github.com/webpack/css-loader/issues/296

26
répondu Sonny 2016-07-05 00:51:26

après avoir lutté avec ce problème pendant une journée, j'ai finalement compris comment réécrire les urls dans css en utilisant postcss

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/');
        })
    ]
};
3
répondu James McGuigan 2017-01-26 17:50:14

il semble que les navigateurs ne sont pas friands de chemins relatifs aux images de fond sur l'étiquette de corps. (voir aussi image d'arrière-plan CSS ne se chargent pas et css background-image ne fonctionne pas correctement )

changer légèrement le code semble faire l'affaire:

  • changez l'URL en une URL absolue: background-image: url(http://localhost:8080/5a09e4424f2ccffb6a33915700f5cb12.jpg) . Ce n'est pas l'idéal.
  • ajouter une catégorie au corps, et changer les styles pour faire référence à cette classe:
<body class="foo">

.foo {
    background-image: url('../img/test.jpg');
}

ni l'un Ni l'résoudre la question, mais ne vous obtenir décoller.

2
répondu robrich 2017-05-23 12:34:50

Webpack génère le css et <link> s eux via blob: urls, qui semble causer des problèmes avec le chargement des images de fond.

aide au développement

Inline les images via le fichier-chargeur de développement (crée de grandes base64 chaîne dans le css)

Mais permet de recharger à chaud.

contournement de la Production

Utilisez le ExtractTextPlugin pour servir le css comme fichier normal.

2
répondu Bob Fanger 2016-06-20 10:29:42

Où est votre entrée publicPath en sortie? par exemple:

publicPath: ' http://localhost:5000/ ', // chemin absolu req ici pour les images dans les css pour travailler avec sourcemaps. Doit être une adresse ip numérique réelle pour accéder au réseau local.

https://github.com/webpack/docs/wiki/configuration#outputpublicpath

2
répondu Dan Brown 2016-07-06 18:06:02

veuillez essayer d'utiliser, par exemple:

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;
}

css-loader dans webpack:

{
    test: /\.(css|eot|svg|ttf|woff|jpg|png)$/i,
    use: ExtractTextPlugin.extract({
        use: [{
            loader: 'css-loader',
            options: {
                importLoaders: 1,
                minimize: true
            },
        }],
    }),
},

résultat en paquet.css est:

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}
0
répondu Daniel Rocha 2018-06-01 16:49:16

vous pouvez également essayer d'utiliser le ~ devant vos fichiers de sorte que le webpack retombe aux chargeurs require pour résoudre l'url.

background-url: (~assets/image/myimagefile);
-1
répondu Nico 2017-03-01 17:22:44