前端图片压缩

当代码打包完毕后,应该执行图片压缩、js上传cdn、图片上传cdn操作。
现在来实现上传图片前的图片压缩

当图片压缩后上传cdn服务器时
注意:需要修改output.publicPath 为cdn路径
如:

   output: {
       path: path.resolve(__dirname, '../dist'),
       filename: "js/[name].js",
       publicPath: publicPath
   },

如果有使用worker-loader 一定同步 woker-loader配置项publicPath

   {
       test: /\.worker\.js$/,
       loader: "worker-loader",
       options: {
           publicPath: publicPath,
       },
   },

现在来实现图片压缩

一、使用在线网站方式

在线图片压缩tinypng

二、使用代码实现

方式一:npm库 tinypng-cli
代码实现之前需要https://tinypng.com/注册 获取app-key
在这里插入图片描述
package.json 新增 tinyPng命令

  "scripts": {
    "commit": "cz",
    "tinyPng" : "tinypng assets/ -k b5hYk5TCn2snv3J4v9xW9MFvDngtMj1F"
  },

请添加图片描述
方式二:使用imagemin实现

assetsBuild.js

import {  compressImage } from "./compress.js"
import {globby} from 'globby';
import path from "node:path"
import fs from 'fs-extra'
import { isNotJunk } from 'junk';
import chalk from 'chalk';

/**
 * 获取目标文件夹中可以压缩的文件
 * @returns Array of paths to files
 */
async function getImages(output='dist/images/') {
    return  (await globby(path.resolve(process.cwd(),output),{
        expandDirectories: {
            extensions: ['jpg',"png","jpeg"]
        }
    })).filter(isNotJunk)
}



export default async function assets(options) {
    const {input,output,type="builtin"} = options ?? {}
    // 移动图片文件夹到打包路径
    fs.copySync(path.resolve(process.cwd(),input?input:"src/assets/"),path.resolve(process.cwd(),output?output:"dist/images/"));
    // 获取图片路径
    const files = await getImages(output)
    files.forEach(async(file)=>{
        const buffer = fs.readFileSync(file)
        const result= await compressImage(buffer,type)
        if (result) {
            const radio = ((1 - result.byteLength / buffer.byteLength) * 100).toFixed(2);
            fs.writeFileSync(file.trim(), result);
            console.log(chalk.green("压缩图片成功:" + file.trim(),`,压缩率:${radio}%`));
        }
    })
}

compress.js

import imagemin from "imagemin";
import imageminJpegtran from "imagemin-jpegtran-cn"
import imageminPngquant from "imagemin-pngquant-cn"
import tinify from "tinify";
tinify.key = "BJJt8s2Q4cL0B5cgD7PnxM12XPyyZjmD";

const COMPRESS_TYPE = {
	builtin: 'builtin',
	tinypng: 'tinypng',
}

export function compressImage(buffer, type = "builtin") {
	if (!COMPRESS_TYPE[type]) {
		type = COMPRESS_TYPE.builtin;
	}
	switch (type) {
		case COMPRESS_TYPE.builtin:
			return imagemin.buffer(buffer, {
				plugins: [
					imageminJpegtran(),
					imageminPngquant({
						quality: [0.6, 0.8]
					})
				]
			});
		case COMPRESS_TYPE.tinypng:
			console.log("tinypng")
			return new Promise(r=>{
				tinify.fromBuffer(buffer).toBuffer(function(err, resultData) {
					if (err) throw err;
					r(resultData)
				});
			})
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥肥呀呀呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值