返回

Vue3+EGG 实现媒体资源直传七牛云(附CDN刷新、资源预览)

前端

动机

对于前端开发者来说,项目中的一些图片,尤其是超高清图片,往往会大幅增加项目包体积,影响项目的构建和部署速度,尤其是小程序开发,包体积大于 2M 时,项目甚至无法构建成功。常规解决方案是将这些图片分发至 CDN,但这要求给每个项目配置 CDN 账号,易造成账号管理上的混乱。此外,日常开发中,开发者还常有以下需求:

  • 快速预览已传图片 :有些图片项目上线前无法在本地预览,只能拿到图片链接后进行预览。
  • CDN 刷新 :根据 CDN 刷新策略,部分图片可能需要尽快刷新至 CDN 节点以供用户及时使用。
  • 图片质量控制 :有的图片在 CDN 侧需要做一些处理,如水印添加、裁剪和压缩等。

为解决以上问题,前端开发者往往会编写一些脚本来自行解决,但这些脚本往往功能单一,并且需要单独维护,难以复用到其他项目中。因此,我们编写了一个媒体资源直传七牛云的工具,支持快速预览、CDN 刷新、图片处理等功能,可在前端项目中直接使用,方便开发者随时处理媒体资源问题。

实现

工具使用开源图片云服务七牛云,提供基本的一键图片处理操作,并且能快速将资源直接分发到七牛云的 CDN 节点,然后根据 CDN 的刷新策略,这些图片可在几分钟内刷新至 CDN 节点,以供用户使用。

工具提供了如下的主要功能:

  • 图片直传 :支持图片批量直传七牛云,并预览直传成功后的资源效果;
  • CDN 刷新 :支持设置 CDN 刷新策略,快速刷新至 CDN 节点;
  • 图片处理 :提供图片裁剪、水印添加、图片质量压缩等操作;

使用

  1. 安装依赖包

    工具使用 Egg 作为应用框架,需要先安装其依赖包:

    yarn add egg-vue3
    
  2. 创建项目

    安装依赖包后,创建新的项目:

    mkdir my-app && cd $_
    npx egg-vue3
    
  3. 配置项目

    在新建项目的 package.json 中添加七牛云的相关配置,具体如下:

    {
      "accessKey": "your-access-key",
      "secretKey": "your-secret-key",
      "bucket": "your-bucket"
    }
    
  4. 开发和调试

    项目创建完成后,使用 yarn start 命令,项目便开始运行,可直接在浏览器中进行开发和调试。

  5. 预览已传图片

    在项目中使用 @vue/preview 插件,可实现对七牛云上图片进行预览,具体用法如下:

    <template>
      <div>
        <img :src="imageUrl" @click="previewImage" />
      </div>
    </template>
    
    <script>
    import { usePreview } from '@vue/preview'
    export default {
      data () {
        return {
          imageUrl: 'https://your-image-url.com'
        }
      },
      methods: {
        async previewImage () {
          // 图片预览
          usePreview(this.imageUrl)
        }
      }
    }
    </script>
    
  6. CDN 刷新

    通过编辑 public/proxy.json 文件,可对 CDN 刷新进行配置,具体如下:

    {
      cdnRefresh: {
        // 是否刷新所有资源
        all: false,
        // 刷新特定资源
        resources: [
          'https://your-image-url-1.com',
          'https://your-image-url-2.com',
          'https://your-image-url-3.com'
        ]
      }
    }
    

    配置好后,可以通过 yarn proxy 命令来刷新 CDN。

  7. 图片处理

    在项目中,可以通过 @vue/image-processor 插件对七牛云上的图片进行处理,具体如下:

    <template>
      <div>
        <img :src="imageUrl" @click="processImage" />
      </div>
    </template>
    
    <script>
    import { useImageProcessor } from '@vue/image-processor'
    export default {
      data () {
        return {
          imageUrl: 'https://your-image-url.com'
        }
      },
      methods: {
        async processImage () {
          // 处理图片
          useImageProcessor(this.imageUrl, {
            processor: 'facedetection', // 处理器名称,目前仅支持 `facedetection`
            options: {} // 处理器配置
          })
        }
      }
    }
    </script>
    

更多用法和具体配置,请查看 项目 GitHub 代码

结语

该工具的目的是让开发者能够专心于开发项目,而不用花时间在媒体资源的配置和处理上,以提升开发者生产力。希望这个工具能够为更多开发者提供帮助,帮助大家更好地处理项目中的媒体资源。