uni-app image和rich-text组件图片过长时导致APP闪退

发布于 1周前 作者 wuwangju 来自 Uni-App

uni-app image和rich-text组件图片过长时导致APP闪退

信息类别 详细信息
产品分类 uniapp/App
PC开发环境 Windows
PC版本号 win10
HBuilderX 正式
HBuilderX版本号 3.4.7
手机系统 Android
手机系统版本号 Android 12
手机厂商 华为
手机机型 nova6
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码:

图片

操作步骤:

当图片过大或者过长时,使用image标签或rich-text会导致APP闪退

预期结果:

正常展示

实际结果:

APP闪退

bug描述:

当图片过长时,使用image标签或rich-text会导致APP闪退,测试可使用这张图片“http://file.wujisj.cn/uploads/admin/20210605/95d8876e5fa48c268089b3888af5eabc.jpg

App下载地址或H5网址:

H5网址


5 回复

24M的一个图片要命了。


即使压缩到3M也会闪退

请问解决了吗

即使图片只有1M但是像素很大,也会造成闪退

uni-app 中使用 imagerich-text 组件时,如果图片过大或过长,可能会导致应用内存占用过高,从而引发闪退问题。以下是一些解决方案和优化建议:

1. 图片压缩

在将图片上传到服务器之前,先对图片进行压缩处理,减小图片的文件大小。可以使用一些图片压缩工具或库,如 TinyPNGImageOptim 等。

2. 使用合适的图片格式

选择合适的图片格式可以显著减小图片文件大小。例如,使用 WebP 格式代替 PNGJPEG,因为 WebP 格式在保持较高画质的同时,文件大小更小。

3. 图片懒加载

对于长列表或大量图片的场景,可以使用图片懒加载技术,只有当图片进入可视区域时才加载图片。uni-app 提供了 lazy-load 属性,可以在 image 组件中使用:

<image src="your-image-url" lazy-load></image>

4. 限制图片尺寸

在显示图片时,可以通过设置 image 组件的 mode 属性来限制图片的显示尺寸,避免图片过大导致内存占用过高。例如:

<image src="your-image-url" mode="widthFix"></image>

mode="widthFix" 会根据宽度自动调整高度,保持图片的宽高比。

5. 分页加载

对于 rich-text 组件中的大量图片,可以考虑将内容分页加载,避免一次性加载过多图片导致内存溢出。

6. 使用 CDN 加速

将图片存储在 CDN 上,利用 CDN 的缓存和加速功能,减少图片加载时间,降低服务器压力。

7. 图片预加载

对于需要提前加载的图片,可以使用 uni.preloadImage 方法进行预加载,避免在显示时出现卡顿或闪退:

uni.preloadImage({
  urls: ['your-image-url'],
  success: () => {
    console.log('图片预加载成功');
  },
  fail: (err) => {
    console.log('图片预加载失败', err);
  }
});

8. 优化 rich-text 使用

rich-text 组件中,尽量避免直接嵌入大尺寸图片。可以将图片单独处理,使用 image 组件来显示,并通过 CSS 控制图片的尺寸和布局。

9. 监控内存使用

在开发过程中,可以使用 uni-app 提供的性能监控工具,或者使用第三方工具来监控应用的内存使用情况,及时发现和解决内存泄漏或内存占用过高的问题。

10. 使用 webview 加载复杂内容

对于非常复杂的富文本内容,可以考虑使用 webview 组件来加载,将内容放在一个独立的网页中,通过 webview 来显示,这样可以减少主应用的内存压力。

示例代码

以下是一个优化后的示例代码:

<template>
  <view>
    <image src="compressed-image-url" mode="widthFix" lazy-load></image>
    <rich-text :nodes="processedContent"></rich-text>
  </view>
</template>

<script>
export default {
  data() {
    return {
      processedContent: '<p>Your processed content with optimized images</p>'
    };
  },
  onLoad() {
    uni.preloadImage({
      urls: ['compressed-image-url'],
      success: () => {
        console.log('图片预加载成功');
      },
      fail: (err) => {
        console.log('图片预加载失败', err);
      }
    });
  }
};
</script>

<style>
/* 添加必要的样式 */
</style>
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!