react-native只保留3x图原理解析

 更新时间:2023年01月13日 11:20:57   作者:lcwlucky  
这篇文章主要为大家介绍了react-native只保留3x图原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

我们的react-native项目中,一张图片一般会存在1x, 1.5x, 2x, 3x几种尺寸(1.5x是android特有的),以便在不同屏幕尺寸的手机加载对应尺寸的图片。

1. 输出构建产物

如果我们在代码中引入了一张图片,例如

// index.js
import bg from './bg.png';
.
├── index.js
├── bg.png
├── bg@1.5x.png
├── bg@2x.png
└── bg@3x.png

通过以下命令构建bundle

ios

react-native bundle --entry-file ./index.ts --platform ios --bundle-output ios.js --assets-dest ./ios

android

react-native bundle --entry-file ./index.ts --platform android --bundle-output android.js --assets-dest ./android

打包出来的图片资源如下

drawable-mdpi: 1x

drawable-hdpi: 1.5x

drawable-xhdpi: 2x

drawable-xxhdpi: 3x

可以看到,ios会将图片都放入同一个文件夹,通过scale后缀区分。而android则将不同的scale文件分别放入对应的scale文件夹,文件名都是一样的。

如果当前图片只存在3x图,打包出来的文件夹结构如下

2. RN如何决定加载哪张scale图片?

那么RN是如何决定加载哪张scale图片呢?

// react-native/Libraries/Image/AssetUtils.js
// metro打包时会检查当前图片存在哪些scale,将它们从小到大排序组成一个scales数组
// 比如上面的bg.png对应的scales为[1, 1.5, 2, 3]
export function pickScale(scales: Array<number>, deviceScale?: number): number {
  if (deviceScale == null) {
    deviceScale = PixelRatio.get();
  }
  // Packager guarantees that `scales` array is sorted
  for (let i = 0; i < scales.length; i++) {
    if (scales[i] >= deviceScale) {
      return scales[i];
    }
  }
  // If nothing matches, device scale is larger than any available
  // scales, so we return the biggest one. Unless the array is empty,
  // in which case we default to 1
  return scales[scales.length - 1] || 1;
}

通过源码得知,RN根据当前手机的ratio加载对应的scale图片。如果当前手机的ratio没有匹配到正确的scale图片,则会获取第一个大于当前手机ratio的scale图片。

例如当前手机的scale为2,如果存在2x图片,则返回2x图片。如果没有2x图,则会向上获取3x图。

3. repo中是否可以只保留3x图?

既然如此,那么我们能否在repo中仅仅保留3x图呢?这样打包出来的assets资源就可以变小了。

如果是低ratio的手机,当不存在低scale图片时,RN也会加载到3x图。

3.1 资源上传

在我们项目打包构建bundle和生成对应的assets资源后,需要将它们都上传cdn。

在上传之前,会先将bundle和不同的scale图片分别压缩到对应zip中

android 直接将不同的drawable文件夹压缩,比如 drawable-xxhdpi > hash.1.5x.zip

ios会从assets目录中找出所有同样的scale图片进行压缩。 比如

a@3x.png, b@3x.png > hash.3x.zip

然后将1x.zip, 1.5x.zip, 2x.zip, 3x.zip都上传cdn。

3.2 资源下载

native侧发现有新的RN更新时会下载对应的zip。这里我们native侧做了一个优化,他们不是下载全量的scale.zip, 而是根据当前手机的ratio下载对应的scale.zip。即如果当前手机ratio为2,则只会下载2x.zip(根据手机屏幕ratio下载,资源更小,下载速度更快,占用内存更小)。

所以假如我们在repo中只保留3x图,那么打包后上传cdn时,只有3x.zip存在图片资源,其他scale zip是空的。那么假如用户当前手机的ratio为2, 那么只会下载2x.zip, 而RN此时加载一张图片时,发现找不到对应的2x图,就会尝试加载3x图,然而native并没有下载3x图,导致在ratio为2的手机中加载图片失败。

如上分析,如果repo只保留3x图,对于ratio为3的手机其实没有影响,只影响低ratio的手机

4. 结论

终上所述在repo中我们不能仅仅只保留3x图(除非不支持低ratio的手机,或者native全量下载图片资源)。

更多阅读: react-native 图片解析流程

以上就是react-native只保留3x图原理解析的详细内容,更多关于react-native保留3x图的资料请关注脚本之家其它相关文章!

相关文章

  • Redux saga异步管理与生成器详解

    Redux saga异步管理与生成器详解

    这篇文章主要介绍了Redux saga异步管理与生成器,工作中使用了redux-saga这个redux中间件,如果不明白内部原理使用起来会让人摸不着头脑,阅读源码后特意对其原理做下总结
    2023-02-02
  • react搭建环境时执行npm start报错start: 'react-scripts start'的解决

    react搭建环境时执行npm start报错start: 'react-scripts&

    这篇文章主要介绍了react搭建环境时执行npm start报错start: 'react-scripts start'的解决方案,具有很好的参考价值,希望杜对大家有所帮助,
    2023-10-10
  • React封装弹出框组件的方法

    React封装弹出框组件的方法

    这篇文章主要为大家详细介绍了React封装弹出框组件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • React 组件传 children 的各种案例方案详解

    React 组件传 children 的各种案例方案详解

    自定义组件的时候往往需要传 children,由于写法比较多样,我就总结了一下,要自定义的组件其中包含一个 title 和一个 children,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-10-10
  • React Component存在的几种形式详解

    React Component存在的几种形式详解

    这篇文章主要给大家介绍了关于React Component存在的几种形式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • React router动态加载组件之适配器模式的应用详解

    React router动态加载组件之适配器模式的应用详解

    这篇文章主要介绍了React router动态加载组件之适配器模式的应用 ,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • react电商商品列表的实现流程详解

    react电商商品列表的实现流程详解

    这篇文章主要介绍了react实现电商商品列表的流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • React Native react-navigation 导航使用详解

    React Native react-navigation 导航使用详解

    本篇文章主要介绍了React Native react-navigation 导航使用详解,详解的介绍了react-navigation导航的使用,具有一定的参考价值,有兴趣的可以了解一下
    2017-12-12
  • 浅谈React多个setState会调用几次

    浅谈React多个setState会调用几次

    在React的生命周期钩子和合成事件中,多次执行setState,会被调用几次,本文就详细的介绍一下,感兴趣的可以了解一下
    2021-11-11
  • react 实现图片正在加载中 加载完成 加载失败三个阶段的原理解析

    react 实现图片正在加载中 加载完成 加载失败三个阶段的原理解析

    这篇文章主要介绍了react 实现图片正在加载中 加载完成 加载失败三个阶段的,通过使用loading的图片来占位,具体原理解析及实现代码跟随小编一起通过本文学习吧
    2021-05-05

最新评论