使用uniapp开发微信小程序时,图片处理最佳实践

在这里插入图片描述

前言:受限于微信小程序对包体积的限制,小程序包体积优化一直是一个让人头疼的问题。其中最简单也最容易做到的就是把图片放到CDN或者服务器,就能减小包体积。

uniapp由于框架的限制存在一个问题,无法通过简单的配置,实现编译后将图片路径自动替换成CDN或者服务器连接。网上的一些通过配置全局变量实现链接替换的方式也不够优雅,于是就有了这篇文章。

一、定义全局方法或者变量

网上一般的解决方案是,定义全局方法或者变量,然后在页面中使用。

vue2中的写法
Vue.prototype.staticUrl = (img) {
  return `https://www.xxx.com/${img}`
}
vue3中的写法
app.config.globalProperties.staticUrl = (img) {
  return `https://www.xxx.com/${img}`
}
使用方法
<image :src="staticUrl('/static/images/logo.png')"></image>

这个方案虽然写起来简单,但不够灵活,一旦页面图片过多,每个路径都需要进行转换,而且写法也不够优雅,实在不是一个好的解决方案。

二、自定义loader,解析指定前缀

设置指定的前缀的,通过自定义loader的方式动态替换前缀为CDN地址。

vue2中使用
  1. 创建一个replace-image-loader.js的文件,使用正则匹配,替换所有指定的图片路径前缀。
module.exports = function(source) {
  return source.replace(/@images\//g, 'https://www.xxx.com/');
};
  1. 修改 vue.config.js的配置文件,使用你创建的loader
module.exports = {
  chainWebpack: config => {
    config.module
      .rule('replace-image')
      .test(/\.(js|vue)$/)
      .use('replace-image-loader')
      .loader(path.resolve(__dirname, 'replace-image-loader.js'))
      .end();
  }
};
vue3中使用
  1. 创建一个插件文件vite-plugin-image-replace.js的文件,使用正则匹配,替换所有指定的图片路径前缀。
export default function imageReplacePlugin() {
  return {
    name: 'vite-plugin-image-replace',
    transform(code, id) {
      // 替换为 CDN 地址
      const replacedCode = code.replace(/@images\//g, 'https://www.xxx.com/');
      
      return {
        code: replacedCode,
        map: null,
      };
    }
  };
}
  1. 修改vite.config.js
export default defineConfig({
    plugins: [imageReplacePlugin()],
});
使用方法
<image src="@images/static/images/logo.png"></image>

这个方法虽然不错,但引入了@image这个前缀,图片过多就增加了额外的成本,以后项目维护起来也麻烦。

注意:这个方案来源于网络,未经过严格验证,如果发现问题欢迎指出。

三、只通过配置实现图片链接的动态替换(推荐)

为了避免不必要的开发维护和学习成本,经过思考后,发现最佳的方式是所有的写法都不变,在配置文件中实现动态替换。

vue2中使用

uniapp中的vue2采用的是webpack编译,可以直接通过现有的插件来实现图片路径的动态替换。
vue.config.js文件中修改的配置即可。

module.exports = {
  chainWebpack: config => {

    config.module
      .rule('vue')
      .test([/.vue$/, /.nvue$/])
      .use('vue-loader')
      .tap((options) =>
        Object.assign({}, options, {
          // 配置小程序image标签的src 也进行资源路径转换
          transformAssetUrls: {
            image: 'src',
          },
        }),
      )
      .end();
      
    config.module
      .rule('images')
      .use('url-loader')
      .tap((args) => {
        return Object.assign({}, args, {
          // 配置转换规则,-1 表示任何大小的资源都不进行base64转换
          limit: -1,
          // 这里重要,publicPath 配置给url-loader 会不生效,必须配置到fallback里传递给file-loader
          fallback: {
            loader: 'file-loader',
            options: {
              publicPath(url, resourcePath, context) {
                return 'https://cdn.example.com' + path.relative(process.env.UNI_INPUT_DIR, resourcePath)
              },
              emitFile: false,
            },
          },
      })
      .end();
  }
};
vue3中使用

uniapp中的vue3采用的是vite编译,由于没有相应的插件,我自己实现了一个图片路径替换插件vite-plugin-replace-image-url来使用。

vite.config.vue中直接使用即可。

import replaceImageUrl from 'vite-plugin-replace-image-url';
export default {
  plugins: [replaceImageUrl(
    {
      publicPath: 'https://www.xxx.com/',
      sourceDir: path.resolve(__dirname, './src/static'),
      include: ['**/*.svg', '**/*.png', '**/*.jp(e)?g', '**/*.gif', '**/*.webp'],
      exclude: ['**/logo.png'],
      verbose: true,
    }
  )],
}

具体用法参考插件链接:vite-plugin-replace-image-url - npm (npmjs.com)

使用方法

这里的使用方式和正常的写法没有啥变化,需要注意的是想要地址能够成功替换,必须采用绝对路径

<image src="@/static/images/logo.png"></image>

图片转换地址到这里就告一段落了,现在还存在一个问题。每次构建打包后图片不会自动删除,每次都手动删除,实在不方便,于是又有了下面的方案。

四、将构建后的图片自动删除

vue2中使用

这里需要引入一个clean-webpack-plugin插件来实现自动删除。

const { CleanWebpackPlugin } = require('clean-webpack-plugin');
configureWebpack: (config) => {
    // 生产环境,删除部分图片资源
    if (process.env.NODE_ENV === 'production') {
        config.plugins.push(
          new CleanWebpackPlugin({
            // 清除编译后的图片资源
            cleanAfterEveryBuildPatterns: [
                'static/images/**',
                '!static/images/tabbar*'
            ]
          })
        )
    }
}

更多用法,参考插件链接:clean-webpack-plugin - npm (npmjs.com)

vue3中使用

vite插件中找了一圈,没找到现成的插件,于是我参考clean-webpack-plugin实现了一个vite-plugin-clean-build插件。

使用方法如下:

import CleanBuild from 'vite-plugin-clean-build';
export default {
  plugins: [CleanBuild(
    {
      outputDir: 'dist',
      patterns: [
        'static/images/**',
        '!static/images/tabbar*'
      ]
    }
  )],
}

到这里整个图片处理的方案都有了,开发效率又提升了不少。

如果还不知道怎么使用,可以看看我的实践方案,这个模板里采用了vue3的图片处理方案,并已经在实际开发中稳定使用。

使用uniapp+vite+vue3+uview-plus3.0 搭建的微信小程序快速开发模版 (github.com)

温馨提示:本文部分内容来源于网络,部分方案没有亲自验证过,如有问题,欢迎指出。

五、参考资料

### 使用 UniApp 开发微信小程序连接云开发数据库的方法 #### 创建和配置项目 为了使 UniApp 应用能够利用微信的小程序云开发能力,需先创建一个新的 UniApp 项目并将微信云开发项目的 APPID 复制到此新项目中[^1]。 ```javascript // 在 main.js 或 app.vue 的 created() 生命周期钩子函数内初始化云环境 import { cloud } from '@cloudbase/js-sdk'; const app = getApp(); cloud.init({ env: 'your-env-id', // 替换成自己的云开发环境 ID appId: app.globalData.appId, // 获取全局数据中的 appId }); ``` #### 实现对云数据库的操作 完成上述设置之后,就可以开始编写代码来执行增删改查等基本的数据处理动作了。下面是一个简单的例子,展示了怎样向云端集合添加一条记录: ```javascript async function addRecordToCloudDatabase(collectionName, data) { try { const db = uniCloud.database(); // 初始化数据库实例 await db.collection(collectionName).add(data); // 向指定集合增加一项 console.log('成功插入:', collectionName); } catch (error) { console.error('错误发生:', error.message); } } ``` 对于查询操作,则可以通过 `get()` 方法获取符合条件的结果集;更新则可通过 `update()` 来修改已存在的条目;删除则是调用 `remove()` 完成相应工作。 #### 注意事项 当涉及到敏感信息,务必遵循安全最佳实践指南,并确保应用程序的安全性和隐私保护措施到位。此外,在实际部署前应充分测试各项功能以确认其稳定可靠运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值