《Webpack5 核心原理与应用实践》学习笔记-> 图像处理

简介: 《Webpack5 核心原理与应用实践》学习笔记-> 图像处理


在web日常开发过程中,图像是最常见的装饰器,在webpack中,图像也被提升为一等公民,够像引用普通 JavaScript 模块一样通过 import/require 语句导入资源模块,这种开发模式允许我们将图像相关的处理合入统一的心智模型中,提升开发效率。


webpack4中处理图片


webpack4中只能识别标准的JavaScript对象,对于图像处理还需要借助loader来实现,例如 file-loaderurl-loaderraw-loader 等完成图像加载操作,实践中我们通常需要按资源类型选择适当加载器。


  • file-loader::将图像引用转换为 url 语句并生成相应图片文件。
  • url-loader:有两种表现,对于小于阈值 limit 的图像直接转化为 base64 编码;大于阈值的图像则调用 file-loader 进行加载。
  • raw-loader:不做任何转译,只是简单将文件内容复制到产物中,适用于 SVG 场景。


配置起来如下:


module.exports = {
    // 省略其他配置
    module: {
        rules: [
            {
                test: /.(png|jpg|bmp)$/,
                use: [
                // url-loader 内置了 file-loader,所以使用url-loader 就不需要使用 file-loader 了
                // {
                //     loader: "file-loader"
                // },
                {
                    loader: "url-loader",
                    options: {
                        limit: 1024 // 对于小于1kb的图像文件进行base64处理
                    }
                }]
            }, {
                test: /.svg$/,
                use: 'raw-loader'
            }
        ]
    }
}

webpack5中处理图片


而在webpack5中,处理图片就不需要这样做了,因为上面这些loader使用的太频繁了,于是webpack将这些loader内置了,并提供了type属性来供用户使用,配置起来如下:


module.exports = {
    // 省略其他配置
    module: {
        rules: [{
            test: /.bmp$/,
            type: "asset/resource"
        }, {
            test: /.jpg$/,
            type: "asset/source"
        }, {
            test: /.png$/,
            type: "asset/inline"
        }, {
            test: /.svg$/,
            type: "asset"
        }]
    }
}

上面为了演示效果,所以每个type属性的属性值都列举出来了。


构建的结果如下

image.png

  • type的属性值为asset/inline

image.png

  • type的属性值为asset/resource

image.png

  • type的属性值为asset/source

image.png

  • type的属性值为asset

image.png

简单的说明一下

  • file-loader 对标到 type = "asset/resource"
  • url-loader 对标到 type = "asset"type = "asset/inline"
  • raw-loader 对标到 type = "asset/source"


file-loaderurl-loaderraw-loader并不是只能处理图片,还可以是其他多媒体文件,详细参见:资源模块


如果要将上面的webpack4变成webpack5的写法应该怎么是什么样的,毕竟还有limit的配置,如下


module.exports = {
    module: {
        rules: [
            {
                test: /.(png|jpg|bmp)$/,
                type: "asset",
                parser: {
                    dataUrlCondition: {
                        maxSize: 1024
                    }
                }
            }, {
                test: /.svg$/,
                type: "asset/source"
            }
        ]
    }
}

图片优化=>压缩


图像压缩需要借助到image-webpack-loader,所以先安装依赖,npm i -D image-webpack-loader imagemin-jpegtran imagemin-svgo imagemin-gifsicle imagemin-optipng,因为image-webpack-loader依赖imagemin,所以需要额外的安装imagemin的依赖, image-webpack-loader提供了一系列的配置用来压缩不同类型的图片,如下:


  • mozjpeg:用于压缩 JPG(JPEG) 图片;
  • optipng:用于压缩 PNG 图片;
  • pngquant:同样用于压缩 PNG 图片;
  • svgo:用于压缩 SVG 图片;
  • gifsicle:用于压缩 Gif 图;
  • webp:用于将 JPG/PNG 图压缩并转化为 WebP 图片格式。


温馨提示:如果imagemin安装不成功请使用cnpm,原因是imagemin安装时会根据终端来下载一些二进制解析文件,这些文件可能会被墙,也可能不维护丢失了,情况很多,所以可以去cnpm的淘宝镜像找资源。


配置起来也很简单,如下:


module.exports = {
    module: {
        rules: [
            {
                test: /.(png|jpg|bmp)$/,
                type: "asset",
                parser: {
                    dataUrlCondition: {
                        maxSize: 1024
                    }
                },
                use: [{
                    loader: 'image-webpack-loader',
                    options: {
                        // jpeg 压缩配置
                        mozjpeg: {
                            quality: 80
                        },
                    }
                }]
            }
        ]
    }
}

图像优化:雪碧图


雪碧图没什么好说的,就是把一堆图片合并到一个图片文件中,然后使用的时候通过背景图片可以调整位置来定位到具体的图片上,这样做的好处就是利用浏览器缓存,可以减少http(s)请求。


这里使用的是webpack-spritesmith插件,npm i -D webpack-spritesmith安装 配置如下:


const path = require('path');
const SpritesmithPlugin = require('webpack-spritesmith');
module.exports = {
    plugins: [
        new SpritesmithPlugin({
            // 将根目录下的 asset 目录下的所有 .png文件合并成一个雪碧图
            src: {
                cwd: path.resolve(__dirname, './asset'), 
                glob: '*.png'
            },
            // 生成目标文件存在的路径
            target: {
                image: path.resolve(__dirname, 'src/assets/sprite.png'),
                css: path.resolve(__dirname, 'src/assets/sprite.less')
            }
        })
    ]
}

执行npx webpack构建,会在src/assets生成一个合成后的sprite.png文件,还有一个sprite.less的定位指导文件。


图像优化:响应式图片


响应式图片就是根据不同的需求,将图片转换为不同尺寸的产物进行输出,防止图片因为分辨率的问题产生的拉伸、变形、颗粒感,这里用到的loaderresponsive-loader,安装npm i -D responsive-loader sharp,配置如下:


module.exports = {
    module: {
        rules: [
            {
                test: /.(png|jpg|jpeg|bmp)$/,
                oneOf: [{
                    type: "javascript/auto",
                    resourceQuery: /sizes?/,
                    use: [{
                        loader: "responsive-loader",
                        options: {
                            adapter: require("responsive-loader/sharp"),
                        },
                    }],
                }, {
                    type: "asset/resource",
                }],
            },
        ]
    }
}

这里配置完成之后还需要使用才行,不像雪碧图直接就合成了,使用也很简单,在使用的地方加上query参数就可以了,这里我直接在main.js中引用


const logo1 = require('./asset/logo.jpeg?sizes[]=300,sizes[]=600,sizes[]=1024')

然后执行npx webpack构建就会在生成的文件中出现三张不同大小的图片啦。


总结


图片处理是有很多门道在里面的,webpack4和之前有file-loaderurl-loaderraw-loader来处理这类资源,到了webpack5专门多出一个属性来处理这类资源,同时还有其他的一些laoder和插件来优化这类资源,这一章专门针对这类资源进行配置处理,还有很多需要深入的地方,课程中没有,自己课外补习吧。


目录
相关文章
|
2月前
|
Web App开发 存储 数据处理
Chrome 下载大文件报错!用 Streamsaver.js 完美填坑
本文探讨了Chrome下载大文件报“网络错误”的原因及解决方案。由于Chrome对Blob数据有大小限制,导致大文件下载失败。通过将responseType改为ArrayBuffer可临时解决1-2G文件问题,但超3G仍会崩溃。最佳方案是使用Streamsaver.js实现流式下载,边接收边保存,避免内存溢出,完美支持超大文件下载。
702 3
|
3月前
|
机器学习/深度学习 自然语言处理 算法
小红书:通过商品标签API自动生成内容标签,优化社区推荐算法
小红书通过商品标签API自动生成内容标签,提升推荐系统精准度与用户体验。流程包括API集成、标签生成算法与推荐优化,实现高效率、智能化内容匹配,助力社交电商发展。
171 0
|
4月前
|
存储 分布式计算 调度
云计算核心技术
云计算作为IT领域的热门技术,融合网格计算与虚拟化,通过资源池和分布式存储提供高效计算与存储服务。其架构涵盖物理资源、资源池、管理中间件及SOA构建层,关键技术包括虚拟化、海量数据处理、资源调度、服务管理及云平台,旨在实现低成本、高可靠、可扩展的服务交付。
476 0
云计算核心技术
|
安全 Linux 数据处理
Linux命令shred详解:数据安全删除的艺术
`shred`是Linux下用于安全删除文件的命令,它通过多次随机覆盖确保数据无法恢复。工作原理包括默认三次的覆盖,用户可自定义次数。主要特点有:多次覆盖、可定制、灵活操作和安全删除。示例:`shred -n 5 -z -v -u file.txt`(覆盖5次,填充0,删除文件)。使用时注意确认文件、备份数据、检查权限和文件系统兼容性。最佳实践是结合`rm`使用,根据敏感度选择覆盖次数。
|
传感器
ENVI: 如何进行图像的自动配准?
ENVI: 如何进行图像的自动配准?
998 0
|
前端开发 JavaScript
前端 JS 经典:文件流下载
前端 JS 经典:文件流下载
962 1
|
移动开发 前端开发 JavaScript
Vue2 系列:vue.config.js 参数配置
Vue2 系列:vue.config.js 参数配置
1106 2
|
JavaScript 前端开发 API
Vue Router【详解】含路由配置、路由定义、路由跳转、路由传参、自动注册路由、路由守卫、页面滚动、监听路由、$route、$router、路由过渡动画等
Vue Router【详解】含路由配置、路由定义、路由跳转、路由传参、自动注册路由、路由守卫、页面滚动、监听路由、$route、$router、路由过渡动画等
3582 1
|
前端开发 JavaScript Java
基于qiankun的微前端最佳实践 -(同时加载多个微应用)
基于qiankun的微前端最佳实践 -(同时加载多个微应用)
5555 0
基于qiankun的微前端最佳实践 -(同时加载多个微应用)
Vue3-admin-template的表格合计计算
Vue3-admin-template的表格合计计算
224 0