webpack打包后,css中的background:url(url)不能正常显示。

[问题描述]
1、在html文件中使用img标签图片显示正常。
2、在html标签中,使用style="background:url()",图片显示正常。
3、在css文件中,使用background:#f00,背景颜色显示正常。
4、在css文件中,使用background:url,打包成功,但是打开网页后,html元素正常,但css未正确加载,而且js也无法运行。
5、尝试使用file-loader url-loader均无效。
6、曾出现过图片文件名加了哈希,但是打包后css中的图片引用却还是没有加hash的。
[代码如下]

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin'); 
const uglify = require('uglifyjs-webpack-plugin'); 
const glob = require('glob');
const webpack = require('webpack')


const proDir = 'jzjy-wechat-build'; 


let config = {
    entry: {},
    output: {
        filename: '[name].[chunkhash:8].js',
        path: path.resolve(__dirname, proDir + '/js')
    },
    module: {
        rules: [{
            test: /\.css$/,
            use: ['style-loader', 'css-loader','resolve-url-loader']
        }, {
            test: /\.(jpg|png|gif)$/,
            use: [
                {
                    loader: 'file-loader',
                    options: {
                        name: '../img/[name].[ext]'
                    }
                },
            ]
        } , {
            test: /\.html$/,
            loader: 'html-loader'
        }, {
            test: /\.js$/,
            exclude: /(node_modules|bower_components)/,
            use: {
                loader: 'babel-loader',
                options: {
                    presets: ['babel-preset-env']
                }
            }
        }]
    },
    plugins: [
        new CleanWebpackPlugin([proDir])
    ],
    devtool: 'inline-source-map',
    externals: {
    },
    optimization: {},
    resolve: {
        alias: {
            '@': path.resolve('src/js/common/common-dev')
        }
    },
    watch: true
};



let ens = getEntry('./src/js/**/*.js');
for (let i in ens) {
    config.entry[i] = ens[i]
}


function getEntry(globPath) {
    let files = glob.sync(globPath);
    let entries = {},
        entry, dirname, basename, pathname, extname;
    for (let i = 0; i < files.length; i++) {

        entry = files[i];
        dirname = path.dirname(entry); 
        extname = path.extname(entry);
        basename = path.basename(entry, extname);
        pathname = path.join(dirname, basename); 
        entries[basename] = entry;
    }
    return entries;
}




let css = getEntry('./src/css/**/*.css');
for (let i in css) {
    if (i in config.entry) {
        let _tmp = [];
        _tmp.push(config.entry[i]);
        _tmp.push(css[i]);
        config.entry[i] = _tmp
    } else {
        config.entry[i] = css[i]
    }
}



let htmls = getEntry('./src/htmls/**/*.html');
for (let i in htmls) {
    let conf = {
        filename: path.resolve(__dirname, proDir + '/' + htmls[i].replace('./src', '')),
        template: path.resolve(__dirname, htmls[i]),
        inject: 'true', //js插入的位置,true/'head'/'body'/false
        chunks: ['common1', i],
        hash: true,
    };
    if (i in config.entry) {
        conf.inject = 'true';
        conf.chunks = ['vendors', 'common1', i];
        conf.hash = true;
    }
    config.plugins.push(new HtmlWebpackPlugin(conf));
}


let files = getEntry('./src/files/*.*');
for (let i in files) {
    let conf = {
        from: path.join(__dirname, files[i]),
        to: path.join(__dirname, proDir + '/files/')
    };
    config.plugins.push(new CopyWebpackPlugin([conf]));
}


config.optimization = {
    splitChunks: {
        chunks: "all",
        minSize: 0,
        cacheGroups: {
            common1: {
                minChunks: 2,
                priority: -1,
                name: 'common1'
            }
        }
    },
    minimizer: [new uglify()]
}


module.exports = config;

目录结构如下:
project

|-node_modules
|-src 开发目录
    |-css
        |-common 公共css
    |-js
        |-common 公共js
    |-htmls
    |-img
    |-files
|-jzjy-wechat-build 打包目录
    |-img 打包后的img
    |-js 打包后的js
    |-htmls 打包后的html
    |-files 没什么用

整了半天实在是毫无头绪,求解答。

阅读 3.6k
2 个回答
新手上路,请多包涵

可能是版本问题,安装下低版本呢,例如2.2.x

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题