最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2023年01月13日 11:20:57   作者:lcwlucky  
這篇文章主要為大家介紹了react-native只保留3x圖原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

我們的react-native項(xiàng)目中,一張圖片一般會(huì)存在1x, 1.5x, 2x, 3x幾種尺寸(1.5x是android特有的),以便在不同屏幕尺寸的手機(jī)加載對(duì)應(yīng)尺寸的圖片。

1. 輸出構(gòu)建產(chǎn)物

如果我們?cè)诖a中引入了一張圖片,例如

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

通過(guò)以下命令構(gòu)建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

打包出來(lái)的圖片資源如下

drawable-mdpi: 1x

drawable-hdpi: 1.5x

drawable-xhdpi: 2x

drawable-xxhdpi: 3x

可以看到,ios會(huì)將圖片都放入同一個(gè)文件夾,通過(guò)scale后綴區(qū)分。而android則將不同的scale文件分別放入對(duì)應(yīng)的scale文件夾,文件名都是一樣的。

如果當(dāng)前圖片只存在3x圖,打包出來(lái)的文件夾結(jié)構(gòu)如下

2. RN如何決定加載哪張scale圖片?

那么RN是如何決定加載哪張scale圖片呢?

// react-native/Libraries/Image/AssetUtils.js
// metro打包時(shí)會(huì)檢查當(dāng)前圖片存在哪些scale,將它們從小到大排序組成一個(gè)scales數(shù)組
// 比如上面的bg.png對(duì)應(yīng)的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;
}

通過(guò)源碼得知,RN根據(jù)當(dāng)前手機(jī)的ratio加載對(duì)應(yīng)的scale圖片。如果當(dāng)前手機(jī)的ratio沒(méi)有匹配到正確的scale圖片,則會(huì)獲取第一個(gè)大于當(dāng)前手機(jī)ratio的scale圖片。

例如當(dāng)前手機(jī)的scale為2,如果存在2x圖片,則返回2x圖片。如果沒(méi)有2x圖,則會(huì)向上獲取3x圖。

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

既然如此,那么我們能否在repo中僅僅保留3x圖呢?這樣打包出來(lái)的assets資源就可以變小了。

如果是低ratio的手機(jī),當(dāng)不存在低scale圖片時(shí),RN也會(huì)加載到3x圖。

3.1 資源上傳

在我們項(xiàng)目打包構(gòu)建bundle和生成對(duì)應(yīng)的assets資源后,需要將它們都上傳cdn。

在上傳之前,會(huì)先將bundle和不同的scale圖片分別壓縮到對(duì)應(yīng)zip中

android 直接將不同的drawable文件夾壓縮,比如 drawable-xxhdpi > hash.1.5x.zip

ios會(huì)從assets目錄中找出所有同樣的scale圖片進(jìn)行壓縮。 比如

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

然后將1x.zip, 1.5x.zip, 2x.zip, 3x.zip都上傳cdn。

3.2 資源下載

native側(cè)發(fā)現(xiàn)有新的RN更新時(shí)會(huì)下載對(duì)應(yīng)的zip。這里我們native側(cè)做了一個(gè)優(yōu)化,他們不是下載全量的scale.zip, 而是根據(jù)當(dāng)前手機(jī)的ratio下載對(duì)應(yīng)的scale.zip。即如果當(dāng)前手機(jī)ratio為2,則只會(huì)下載2x.zip(根據(jù)手機(jī)屏幕ratio下載,資源更小,下載速度更快,占用內(nèi)存更?。?/p>

所以假如我們?cè)趓epo中只保留3x圖,那么打包后上傳cdn時(shí),只有3x.zip存在圖片資源,其他scale zip是空的。那么假如用戶當(dāng)前手機(jī)的ratio為2, 那么只會(huì)下載2x.zip, 而RN此時(shí)加載一張圖片時(shí),發(fā)現(xiàn)找不到對(duì)應(yīng)的2x圖,就會(huì)嘗試加載3x圖,然而native并沒(méi)有下載3x圖,導(dǎo)致在ratio為2的手機(jī)中加載圖片失敗。

如上分析,如果repo只保留3x圖,對(duì)于ratio為3的手機(jī)其實(shí)沒(méi)有影響,只影響低ratio的手機(jī)

4. 結(jié)論

終上所述在repo中我們不能僅僅只保留3x圖(除非不支持低ratio的手機(jī),或者native全量下載圖片資源)。

更多閱讀: react-native 圖片解析流程

以上就是react-native只保留3x圖原理解析的詳細(xì)內(nèi)容,更多關(guān)于react-native保留3x圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React實(shí)現(xiàn)組件全屏化的操作方法

    React實(shí)現(xiàn)組件全屏化的操作方法

    開(kāi)發(fā)今天給我提了一個(gè)sql編輯器輸入框比較小,不支持放大,不太方便,下面看下我的處理方法,本文基于React+antd,給大家演示一個(gè)完整的全屏demo,感興趣的朋友一起看看吧
    2021-10-10
  • 在React中引入Tailwind?CSS的完整指南

    在React中引入Tailwind?CSS的完整指南

    在現(xiàn)代前端開(kāi)發(fā)中,使用?UI?庫(kù)可以顯著提高開(kāi)發(fā)效率,Tailwind?CSS?是一個(gè)功能類優(yōu)先的?CSS?框架,本文將詳細(xì)介紹如何在?React?項(xiàng)目中引入和使用?Tailwind?CSS,包括各種配置選項(xiàng)和最佳實(shí)踐,需要的朋友可以參考下
    2025-04-04
  • 詳解react服務(wù)端渲染(同構(gòu))的方法

    詳解react服務(wù)端渲染(同構(gòu))的方法

    這篇文章主要介紹了詳解react服務(wù)端渲染(同構(gòu))的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • react-three-fiber實(shí)現(xiàn)炫酷3D粒子效果首頁(yè)

    react-three-fiber實(shí)現(xiàn)炫酷3D粒子效果首頁(yè)

    這篇文章主要介紹了react-three-fiber實(shí)現(xiàn)3D粒子效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • react項(xiàng)目如何運(yùn)行在微信公眾號(hào)

    react項(xiàng)目如何運(yùn)行在微信公眾號(hào)

    這篇文章主要介紹了react項(xiàng)目如何運(yùn)行在微信公眾號(hào),幫助大家更好的理解和學(xué)習(xí)使用react,感興趣的朋友可以了解下
    2021-04-04
  • React Native仿美團(tuán)下拉菜單的實(shí)例代碼

    React Native仿美團(tuán)下拉菜單的實(shí)例代碼

    本篇文章主要介紹了React Native仿美團(tuán)下拉菜單的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • react項(xiàng)目中express動(dòng)態(tài)路由未能匹配造成的404問(wèn)題解決

    react項(xiàng)目中express動(dòng)態(tài)路由未能匹配造成的404問(wèn)題解決

    本文主要介紹了react項(xiàng)目中express動(dòng)態(tài)路由未能匹配造成的404問(wèn)題解決,解決了白屏的問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • React?高德地圖進(jìn)京證路線規(guī)劃問(wèn)題記錄(匯總)

    React?高德地圖進(jìn)京證路線規(guī)劃問(wèn)題記錄(匯總)

    這篇文章主要介紹了React高德地圖進(jìn)京證路線規(guī)劃問(wèn)題小記,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • React?classnames原理及測(cè)試用例

    React?classnames原理及測(cè)試用例

    這篇文章主要為大家介紹了React?classnames原理及測(cè)試用例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 深入理解React與閉包的關(guān)系

    深入理解React與閉包的關(guān)系

    本文將深入探討React與閉包之間的關(guān)系,我們將首先介紹React和閉包的基本概念,然后詳細(xì)解釋React組件中如何使用閉包來(lái)處理狀態(tài)和作用域的問(wèn)題,希望通過(guò)本文的閱讀,你將對(duì)React中閉包的概念有更深入的理解,并能夠在開(kāi)發(fā)React應(yīng)用時(shí)更好地應(yīng)用閉包
    2023-07-07

最新評(píng)論

福海县| 日土县| 册亨县| 商南县| 射阳县| 诏安县| 常州市| 宁强县| 禄劝| 榆社县| 义乌市| 赣榆县| 独山县| 东方市| 万年县| 绥江县| 历史| 行唐县| 灌阳县| 绍兴市| 平乐县| 江安县| 南城县| 威远县| 昭平县| 元氏县| 龙井市| 九台市| 肇东市| 天等县| 房山区| 固始县| 温宿县| 韩城市| 和硕县| 昌黎县| 依安县| 北安市| 葵青区| 黑河市| 开封县|