webpack 插件 转换图片格式为webp

原文链接: webpack 插件 转换图片格式为webp

上一篇: js Thunk 函数

下一篇: clip-path 绘制css常见图形 制作有趣的动画

clone 测试项目, 用vue3作为测试项目

git clone https://github.com/vuejs/vue-next-webpack-preview.git --depth=1

yarn 

新建插件项目, 并初始化

vue项目中加两个图片展示的文件

up-5ae434afd6dc2484fe022c927a954d98567.png

插件项目中执行

yarn link

up-347d38b97abb6c0eaa09ea87f4f3d919aad.png

vue中引用

webp-webpack-plugin

up-cc0c720b3eb5360af5ed1e206aaf778604a.png

插件安装依赖库, 用于写入webpack打包的二进制文件, 可以看做是一个buffer包装层

yarn add webpack-sources
const { RawSource } = require("webpack-sources");
const s = new RawSource(Buffer.from([1, 2, 3]));
console.log(s);

up-8414dca62c7cdd27435122ef750055e8db3.png

插件index.js

在将所有数据替换完毕之后在调用回调, 表示过程完成, 进行打包

写法上有很大的优化空间, 不过这个只是看看例子而已

const webp = require("webp-converter");
const { RawSource } = require("webpack-sources");

const isImage = (name = "") => {
  const reg = /\.(png|jpg)$/;
  console.log("###isImage", name, reg.test(name));
  return reg.test(name);
};

class WebpPlugin {
  constructor({ quality = 0.6, isDev = true }) {
    this.quality = quality;
    this.isDev = isDev;
    console.log("###WebpPlugin", quality, isDev);
  }

  apply(compiler) {
    compiler.hooks.emit.tapAsync("WebpPlugin", async (compilation, cb) => {
      const images = Object.keys(compilation.assets).filter(isImage);
      console.log("###images", images);
      for (let i of images) {
        console.log(
          "compilation.assets[i]",
          i,
          compilation.assets[i]._value.length
        );
        const raw = compilation.assets[i]._value;
        const data = await webp.buffer2webpbuffer(raw, "jpg", "-q 80");
        compilation.assets[i] = new RawSource(data);
        console.log(
          "===data",
          raw.length,
          data.length,
          raw.length / data.length,
          data.length / raw.length
        );
      }
      cb();
    });
  }
}
console.log("====");
module.exports = WebpPlugin;

vue中添加插件

const WebpPlugin = require("webp-converter-webpack-plugin");
module.exports = (env = {}) => ({
  plugins: [
    new WebpPlugin({
      quality: 0.8,
    }),
  ],
});

效果, 一张是vue的logo , 这个没啥能压缩的, 但也有了一半的压缩率, 一张是我相机拍照, 3M左右, 压缩了十倍

up-426fc985ea556efddaea5c210adcd3b2540.png

发布, 由于已经有了同名插件, 所以换了名字....

nrm use npm

npm login

npm whoami

npm publish

up-1989c6853a3b4485ddeb4748dccfa038b84.png

引入之前用其他项目测试下, 有三张图片

up-d9939016070618d594c4a27b4bcbb94b7d6.png

安装

yarn add webp-converter-webpack-plugin

up-2fb8b4879d59b3e715c3fd48bbf10872a06.png

配置

const WebpPlugin = require("webp-converter-webpack-plugin");
module.exports = (env = {}) => ({
  plugins: [
    new WebpPlugin({
      quality: 0.8,
    }),
  ],
});

up-211ce1ad5a0994bcb24853ac40e29fd9189.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值