Webpack5实战笔记----10.file-loader处理图片

问题: 

新建img文件夹放入图片资源。

在js文件夹里新建image.js,内容如下:

function packImg() {
    //创建一个容器
    const oe = document.createElement('div')
        //创建img标签,设置src属性
    const oImg = document.createElement('img')
    //加default是为了兼容webpack5
    oImg.src = require('../img/webpack5.jpg').default
    oe.appendChild(oImg)
    return oe
}

document.body.appendChild(packImg())

在index.js中添加如下命令行导入。

import './js/image.js'

 运行npm run build报错。

问题分析:

 图片并没有打包成功。

解决:

安装file-loader:

npm i file-loader -D

修改webpack.config.js:

const path = require('path')
module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'build.js',
        //output必须设置绝对路径,所以这里导入path模块
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        rules: [
            {
                //简写方式
                test: /\.css$/,
                //先执行style-loader再执行css-loader
                //顺序规则,从右往左,从下往上,因为兼容性处理要在css调用之前,所以需要将postcss-loader的配置放在css-loader右边
                use: ['style-loader', {
                    loader: 'css-loader',
                    options: {
                        // 往前找一个,即追回到postcss-loader
                        importLoaders: 1
                    }
                }, 'postcss-loader']
            },
            {
                //简写方式
                test: /\.less$/,
                //先执行style-loader再执行css-loader
                //顺序规则,从右往左,从下往上
                use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader']
            },
            {
                test: /\.(png|svg|gif|jpe?g)$/,
                use: ['file-loader']
            }
        ]
    }
}

注意:

//静态资源加载例如图片加载需要配置路径

publicPath: "./dist/"

命令npm run dev运行得结果如下:

因为图片需要配置大小,所以需要对webpack.config.js与image.js重新配置大小。

image.js如下:

function packImg() {
    //创建一个容器
    const oe = document.createElement('div')
        //创建img标签,设置src属性
    const oImg = document.createElement('img')
//设置宽度
    oImg.width = 400
    oImg.src = require('../img/webpack5.jpg')

    oe.appendChild(oImg)
    return oe
}

document.body.appendChild(packImg())

webpack.config.js如下:

const path = require('path')
module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'build.js',
        //output必须设置绝对路径,所以这里导入path模块
        path: path.resolve(__dirname, 'dist'),
        //静态资源加载例如图片加载需要配置路径
        publicPath: "./dist/"
    },
    module: {
        rules: [
            {
                //简写方式
                test: /\.css$/,
                //先执行style-loader再执行css-loader
                //顺序规则,从右往左,从下往上,因为兼容性处理要在css调用之前,所以需要将postcss-loader的配置放在css-loader右边
                use: ['style-loader', {
                    loader: 'css-loader',
                    options: {
                        // 往前找一个,即追回到postcss-loader
                        importLoaders: 1
                    }
                }, 'postcss-loader']
            },
            {
                //简写方式
                test: /\.less$/,
                //先执行style-loader再执行css-loader
                //顺序规则,从右往左,从下往上
                use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader']
            },
            {
                test: /\.(png|svg|gif|jpe?g)$/,
                // use: ['file-loader']
                use: [{
                    loader: 'file-loader',
                    options: {
                        esModule: false //不转为esModule
                    }
                }]
            }
        ]
    }
}

 设置成功:

 也可以按照如下方式配置:

//image.js
import oImgSrc from '../img/webpack5.jpg'

function packImg() {
    //创建一个容器
    const oe = document.createElement('div')
        //创建img标签,设置src属性
    const oImg = document.createElement('img')
    oImg.width = 700
        // oImg.src = require('../img/webpack5.jpg')
    oImg.src = oImgSrc
    oe.appendChild(oImg)
    return oe
}

document.body.appendChild(packImg())
//webpack.config.js
const path = require('path')
module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'build.js',
        //output必须设置绝对路径,所以这里导入path模块
        path: path.resolve(__dirname, 'dist'),
        //静态资源加载例如图片加载需要配置路径
        publicPath: "./dist/"
    },
    module: {
        rules: [
            {
                //简写方式
                test: /\.css$/,
                //先执行style-loader再执行css-loader
                //顺序规则,从右往左,从下往上,因为兼容性处理要在css调用之前,所以需要将postcss-loader的配置放在css-loader右边
                use: ['style-loader', {
                    loader: 'css-loader',
                    options: {
                        // 往前找一个,即追回到postcss-loader
                        importLoaders: 1
                    }
                }, 'postcss-loader']
            },
            {
                //简写方式
                test: /\.less$/,
                //先执行style-loader再执行css-loader
                //顺序规则,从右往左,从下往上
                use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader']
            },
            {
                test: /\.(png|svg|gif|jpe?g)$/,
                use: ['file-loader']

            }
        ]
    }
}

方法二:采用background url处理:

在css目录下新建image.css,内容如下:

.bgBox {
    width: 240px;
    height: 310px;
    border: 1px solid orange;
    background-image: url('../img/webpack5.jpg');
}

在image.js里导入

import '../css/img.css'

import oImgSrc from '../img/webpack5.jpg'
import '../css/img.css'

function packImg() {
    //创建一个容器
    const oe = document.createElement('div')
        //创建img标签,设置src属性
    const oImg = document.createElement('img')
    oImg.width = 700
        // oImg.src = require('../img/webpack5.jpg')
    oImg.src = oImgSrc
    oe.appendChild(oImg)

    //创建背景图片
    const obImg = document.createElement('div')
    obImg.className = 'bgBox'
    oe.appendChild(obImg)

    return oe
}

document.body.appendChild(packImg())

/**
 * 两种设置图片的方式:
 * 1.使用img src:
 *      +使用require导入图片,此时如果不配置esModule:false ,则需.defalut导出
 *      +采用import xxx from 图片资源,此时可以直接使用 xxxx
 * 2.background url
 * 
 */

运行之后发现边框出现,图片没有出现,需要在webpack.config.js里面配置。

const path = require('path')
module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'build.js',
        //output必须设置绝对路径,所以这里导入path模块
        path: path.resolve(__dirname, 'dist'),
        //静态资源加载例如图片加载需要配置路径
        publicPath: "./dist/"
    },
    module: {
        rules: [
            // {
            //     //test一般就是一个正则表达式,用于匹配我们需要处理的文件类型
            //     test:/\.css$/,
            //     //use
            //     use:[
            //         {
            //             loader:'css-loader'
            //         }
            //     ]
            // },
            {
                //简写方式
                test: /\.css$/,
                //先执行style-loader再执行css-loader
                //顺序规则,从右往左,从下往上,因为兼容性处理要在css调用之前,所以需要将postcss-loader的配置放在css-loader右边
                use: ['style-loader', {
                    loader: 'css-loader',
                    options: {
                        // 往前找一个,即追回到postcss-loader
                        importLoaders: 1,
                        //解决图片加载不出的问题
                        esModule: false
                    }
                }, 'postcss-loader']
            },
            {
                //简写方式
                test: /\.less$/,
                //先执行style-loader再执行css-loader
                //顺序规则,从右往左,从下往上
                use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader']
            },
            {
                test: /\.(png|svg|gif|jpe?g)$/,
                use: ['file-loader']
                    // use: [{
                    //     loader: 'file-loader',
                    //     options: {
                    //         esModule: false //不转为esModule
                    //     }
                    // }]
            }
        ]
    }
}

运行成功。

源代码:webpack5的案例演示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值