27 β Performance, New Architecture va deploy¶
β¬ οΈ Oldingi: 26 β Testlash va debugging Β· π Kitob boshi Β· Keyingi: 28 β Yakuniy loyiha β‘οΈ
Bu bobda: Ilovangiz tayyor β endi u tez ishlashi va foydalanuvchilarning telefoniga yetib borishi kerak. Avval ilovani silliq qiladigan performance (tezlik) usullarini o'rganamiz:
FlatListoptimizatsiyasi, keraksiz qayta render'ni kamaytirish, rasm keshlash va Hermes hamda New Architecture nima uchun ilovani tezroq qiladi. Keyin esa eng muhim qadamga o'tamiz β EAS yordamida ilovani bulutda yig'ish (eas build), do'konlarga yuborish (eas submit) va foydalanuvchilarga to'g'ridan-to'g'ri yangilanish jo'natish (eas updateβ OTA). Oxirida deploy uchun to'liq tekshiruv ro'yxati bilan yakunlaymiz.
Nega tezlik mobil'da ayniqsa muhim¶
Tasavvur qiling: do'konga kirdingiz, lekin kassada navbat juda sekin harakatlanyapti. Bir-ikki daqiqada toqatingiz toqqa minadi va shunchaki chiqib ketasiz. Mobil ilovalar ham xuddi shunday β foydalanuvchi sabrsiz. Tugmani bossa, javob darhol kelishini kutadi. Ro'yxatni skroll qilsa, u silliq sirpanib ketishini istaydi. Agar ilova taqillab-tutilib ishlasa, foydalanuvchi sekundlar ichida uni yopadi va boshqa ochmaydi.
Shuning uchun bitta oltin qoida bor:
Sekin ilova = o'chirilgan ilova. Foydalanuvchi sizning ilovangiz necha qator kod ekanini bilmaydi va bilishni ham xohlamaydi. U faqat bir narsani sezadi: ilova tez yoki sekin.
Mobil dasturlashda tezlik veb-saytdan ham muhimroq, chunki:
- Qurilmalar har xil. Hamma foydalanuvchida eng yangi, qimmat telefon yo'q. Ilovangiz uch yil avvalgi, kam quvvatli, kam xotirali telefonda ham silliq ishlashi kerak.
- Batareya cheklangan. Ortiqcha hisob-kitob, doimiy qayta render, og'ir animatsiya β bularning hammasi batareyani so'rib oladi. Batareyani tez tugatadigan ilovani odamlar tashlab yuboradi.
- 60 fps maqsadi. Ekran soniyasiga 60 marta (ba'zi telefonlarda 120) yangilanadi. Har bir kadr (frame) chizilishiga atigi ~16 millisekund bor. Agar JavaScript shu vaqtga ulgurmasa, kadr "tushib qoladi" (dropped frame) va ko'z bu sakrashni "lag" (kechikish) deb sezadi.
Hayotiy o'xshatish. 60 fps β bu kino lentasiga o'xshaydi: kadrlar yetarlicha tez almashsa, ko'z uzluksiz, silliq harakat ko'radi. Agar bir nechta kadr kechiksa, harakat "to'xtab-to'xtab" ko'rinadi β xuddi eski, shovqinli kino kabi. Bizning vazifamiz β har bir kadrni o'z vaqtida yetkazib berish.
Yaxshi xabar shuki, performance haqida boshidan o'ylash shart emas. Avval ishlaydigan ilova yozasiz, keyin sekin joylarni topib tuzatasiz. Quyida eng ko'p ta'sir beradigan usullardan boshlaymiz.
A QISM β PERFORMANCE¶
1. FlatList'ni to'g'ri ishlatish (eng katta foyda)¶
8-bobda biz uzun ro'yxatlar uchun ScrollView emas, balki FlatList ishlatish kerakligini o'rgangan edik. Buni qisqacha eslaylik va keyin tezlashtirish sozlamalarini qo'shamiz.
Hayotiy o'xshatish.
ScrollViewβ bu kitobning barcha sahifalarini bir vaqtda stolga yoyib qo'yishga o'xshaydi: 1000 sahifa bo'lsa, 1000 sahifani birdaniga chizib qo'yasiz β joy ham, kuch ham ko'p ketadi.FlatListesa β kitobni o'qiyotgandek: faqat ko'rinib turgan sahifalarni ochasiz, qolganlarini esa kerak bo'lganda. Shuning uchun u uzun ro'yxatda ancha tejamkor.
FlatList ko'pchilik ishni o'zi qiladi, lekin uni yanada tezlashtiradigan bir nechta muhim props bor:
// app/royxat.tsx β optimallashtirilgan FlatList
import { FlatList, View, Text, StyleSheet } from 'react-native';
import { memo, useCallback } from 'react';
type Mahsulot = { id: string; nomi: string; narxi: number };
// 1) Har bir element ALOHIDA, React.memo bilan o'ralgan komponent
const Element = memo(function Element({ item }: { item: Mahsulot }) {
return (
<View style={styles.qator}>
<Text style={styles.nomi}>{item.nomi}</Text>
<Text style={styles.narxi}>{item.narxi} so'm</Text>
</View>
);
});
export default function Royxat({ malumotlar }: { malumotlar: Mahsulot[] }) {
// 2) renderItem va keyExtractor'ni useCallback bilan barqaror qilamiz
const renderItem = useCallback(
({ item }: { item: Mahsulot }) => <Element item={item} />,
[]
);
const keyExtractor = useCallback((item: Mahsulot) => item.id, []);
return (
<FlatList
data={malumotlar}
renderItem={renderItem}
keyExtractor={keyExtractor}
// 3) Element balandligi BIR XIL bo'lsa β getItemLayout (eng kuchli sozlama)
getItemLayout={(_, index) => ({
length: 64, // har bir qatorning balandligi (dp)
offset: 64 * index, // shu qator yuqoridan qancha uzoqda
index,
})}
initialNumToRender={10} // boshda nechta element chizilsin
windowSize={5} // ekran atrofida nechta "ekran" tayyor tursin
removeClippedSubviews // ko'rinmaydiganlarni xotiradan chiqar (Android'da samarali)
/>
);
}
const styles = StyleSheet.create({
qator: { height: 64, justifyContent: 'center', paddingHorizontal: 16, borderBottomWidth: 1, borderBottomColor: '#e2e8f0' },
nomi: { fontSize: 16, fontWeight: '600', color: '#1e293b' },
narxi: { fontSize: 14, color: '#475569' },
});
Har bir sozlamani tushuntiramiz:
keyExtractorβ har elementga barqaror, takrorlanmas kalit beradi (odatdaitem.id). React shu kalit orqali qaysi element o'zgarganini aniqlaydi. Indeks (0, 1, 2) ni kalit qilib ishlatmang β element o'rni o'zgarsa chalkashlik chiqadi.React.memobilan o'ralgan element β agar elementning props'i o'zgarmasa, u qayta render bo'lmaydi. Ro'yxatda bittagina element o'zgarsa, qolgan yuzlab element tinch turadi.getItemLayoutβ agar har bir qatorning balandligi aniq bir xil bo'lsa, bu eng kuchli optimizatsiya. RN'ga "har element 64 dp" deb oldindan aytasiz β endi u har bir elementni o'lchab chiqishi shart emas, balandlikni hisoblab qo'yadi. Skroll va "filanchi elementga sakra" amallari tezlashadi.initialNumToRenderβ ilova ochilganda darhol nechta element chizilsin. Kichik son = tezroq birinchi ko'rinish.windowSizeβ ko'rinadigan ekran atrofida nechta "ekran balandligi"cha element tayyor turishi. Kattaroq = silliqroq skroll, lekin ko'proq xotira. Standart21, ko'p hollarda5β10yetadi.removeClippedSubviewsβ ekrandan chiqib ketgan elementlarni xotiradan vaqtincha olib tashlaydi. Ayniqsa Android'da yordam beradi.
Ehtiyot bo'ling
getItemLayout ni faqat barcha elementlar bir xil balandlikda bo'lganda ishlating. Agar balandlik turlicha bo'lsa (masalan, ba'zi qatorda uzun matn), getItemLayout noto'g'ri o'lchamlarni beradi va ro'yxat "sakraydi". Bunday holatda uni umuman bermang.
Maslahat
renderItem ichida inline funksiya (() => {}) yoki inline obyekt/massiv (style={{...}}) yaratmang β ular har render'da yangi qiymat bo'lib, React.memo ni "aldaydi" va element baribir qayta render bo'ladi. Stillarni StyleSheet.create bilan tashqarida e'lon qiling.
2. Keraksiz qayta render'ni kamaytirish¶
12-bobda hooklarni chuqur o'rganganimizda React.memo, useCallback va useMemo bilan tanishgan edik. Bu yerda ularning performance roliga alohida e'tibor beramiz, chunki "lag"ning eng keng tarqalgan sababi β keraksiz qayta render.
Hayotiy o'xshatish. Tasavvur qiling, ofisda bitta hujjatdagi bitta so'z o'zgardi, lekin siz butun ofisni β har bir stol, har bir papkani β qaytadan tartibga solishni boshladingiz. Bu β keraksiz qayta render. Aslida faqat o'sha bitta hujjatni yangilash kerak edi.
React.memova selektorlar aynan shuni qiladi: faqat haqiqatan o'zgargan qismni yangilaydi.
Uchta asosiy vosita:
React.memo(Komponent)β komponentni o'rab, props'i o'zgarmaganda uni qayta render qilmaydi. Ro'yxat elementlari, og'ir kartalar uchun ideal.useCallback(fn, [deps])β funksiyani "eslab qoladi" (memoizatsiya). Render orasida bir xil funksiya qaytaradi, shunda uReact.memo'lik bola komponentni ortiqcha render qilmaydi.useMemo(() => hisob, [deps])β og'ir hisob-kitob natijasini eslab qoladi. Masalan, katta massivni saralash yoki filtrlash har render'da emas, faqat ma'lumot o'zgarganda qayta bajariladi.
// Og'ir hisobni useMemo bilan eslab qolamiz
import { useMemo } from 'react';
function Royxat({ mahsulotlar, qidiruv }: { mahsulotlar: Mahsulot[]; qidiruv: string }) {
// Bu filtrlash faqat mahsulotlar yoki qidiruv o'zgargandagina qayta ishlaydi
const natija = useMemo(
() => mahsulotlar.filter((m) => m.nomi.toLowerCase().includes(qidiruv.toLowerCase())),
[mahsulotlar, qidiruv]
);
// ... natija'ni FlatList'ga beramiz
}
Zustand bilan selektor. 19-bobda ko'rgan global holatda selektor β performance'ning eng kuchli quroli. Komponent butun do'kondan emas, faqat o'ziga kerakli bir qismni olib o'qiydi. Shunda do'konning boshqa qismi o'zgarganda bu komponent qayta render bo'lmaydi:
// YOMON: butun do'konni olamiz β har qanday o'zgarishda re-render
const savat = useSavat();
// YAXSHI: faqat sonni olamiz β faqat son o'zgarganda re-render
const soni = useSavat((s) => s.mahsulotlar.length);
Sekin joyni qanday topish kerak? Taxmin qilmang β o'lchang. React Native DevTools (terminalda j tugmasi bilan ochiladi, 26-bobda ko'rgan edik) ichidagi Profiler har bir komponent qancha vaqt va necha marta render bo'lganini ko'rsatadi. Eng ko'p yoki keraksiz render bo'layotgan komponentni topib, aynan o'shani optimallashtiring.
Ehtiyot bo'ling
Hamma joyga useMemo/useCallback "shoshib" qo'ymang. Ularning o'zi ham kichik xarajatga ega va kod o'qishini qiyinlashtiradi. Avval o'lchang, sekin joyni toping, keyin aniq o'sha joyni optimallashtiring. "Erta optimizatsiya" β keng tarqalgan xato.
Eslatma β React Compiler
React 19 bilan kelgan React Compiler (SDK 56'da hali tajriba bosqichida) kelajakda useMemo/useCallback ning ko'pini avtomatik qo'shadi. Hozircha esa bu ishlarni qo'lda, lekin o'lchovga tayanib bajaramiz.
3. Rasm optimizatsiyasi: expo-image¶
Rasmlar β ilova hajmining va sekinligining eng katta sabablaridan biri. Katta rasm yuklanishi sekin, xotirani ko'p oladi va skroll'da "lag" beradi. RN'ning o'rnatilgan Image komponenti ishlaydi, lekin zamonaviy ilovalar uchun expo-image ancha tezroq va aqlliroq.
expo-image ni o'rnatish:
Hayotiy o'xshatish. Keshlash (caching) β bu uyga olib kelgan kitobni har safar kutubxonadan qaytadan olib kelmasdan, javonda saqlab qo'yishga o'xshaydi. Bir marta yuklab olgan rasmni
expo-imagequrilmada saqlaydi (keshlaydi) β keyingi safar internetga bormasdan, darhol ko'rsatadi.
// expo-image β keshlash va silliq ko'rinish bilan
import { Image } from 'expo-image';
function Avatar({ url }: { url: string }) {
return (
<Image
source={{ uri: url }}
style={{ width: 64, height: 64, borderRadius: 32 }}
contentFit="cover" // rasm qutiga qanday joylashsin (cover/contain)
transition={200} // paydo bo'lishda 200ms silliq o'tish
cachePolicy="memory-disk" // xotira VA diskda keshlash (eng tez)
/>
);
}
expo-image ning afzalliklari:
- Avtomatik keshlash (
cachePolicy) β bir marta yuklangan rasm xotira va diskda saqlanadi, qayta-qayta internetdan olib kelinmaydi. - Silliq paydo bo'lish (
transition) β rasm "sakrab" emas, yumshoq paydo bo'ladi. - Lazy yuklash β ro'yxatda faqat ko'rinadigan rasmlar yuklanadi.
- Zamonaviy formatlarni (
WebP,AVIF) qo'llab-quvvatlaydi β ular kichikroq va tezroq.
To'g'ri o'lcham β eng muhim qoida. Agar rasm ekranda 64Γ64 px ko'rinsa, lekin fayl 2000Γ2000 px bo'lsa, qurilma katta rasmni yuklab, xotirada saqlab, keyin kichraytiradi β bu sof isrof. Iloji bo'lsa serverdan mos o'lchamdagi rasmni so'rang (ko'p API'lar ?w=128 kabi parametrni qo'llab-quvvatlaydi). To'g'ri o'lcham + to'g'ri format (WebP) ko'pincha eng katta tezlik foydasini beradi.
4. Hermes va New Architecture nega tezroq¶
Endi "pardaning ortida" nima borligini ko'ramiz. Bularni sozlash shart emas β ikkalasi ham SDK 56'da default yoniq. Lekin nega ilovangiz tez ishlashini bilish foydali.
Hermes β JavaScript dvigateli. Hermes β Facebook (Meta) yaratgan, aynan mobil uchun mo'ljallangan JavaScript dvigateli (engine). 1-bobda aytganimizdek, RN'da JavaScript dvigatelda ishlaydi. Hermes ikki narsada yaxshi:
- Tez ishga tushish. Hermes kodingizni oldindan (build paytida) "bytecode"ga aylantiradi. Shuning uchun ilova ochilganda JS'ni noldan "o'qib o'tirish" shart emas β tayyor bytecode darhol ishlaydi. Bu ayniqsa zaif telefonlarda sezilarli.
- Kam xotira. Hermes telefon resurslariga moslab tuzilgan, shuning uchun kam RAM ishlatadi va batareyani tejaydi.
New Architecture β JS bilan native o'rtasidagi yangi ko'prik. 1-bobda eslatganimizdek, New Architecture uch qismdan iborat: Fabric (yangi renderer β UI'ni chizadigan tizim), TurboModules (native modullarni kerak bo'lgandagina yuklash) va JSI (JavaScript Interface β JS bilan native kod o'rtasidagi to'g'ridan-to'g'ri ko'prik).
Hayotiy o'xshatish. Eski arxitekturadagi "bridge" (ko'prik) β bu ikki kishi (JS va native) faqat xat orqali, pochta bilan gaplashishiga o'xshardi: har bir xabar matnga aylantiriladi (serialize), pochtaga qo'yiladi, yetib boradi, qayta o'qiladi. Sekin va navbat hosil bo'ladi. JSI esa β ikkalasini bir xonaga o'tqazib qo'ygandek: ular endi to'g'ridan-to'g'ri, bir-birini chaqirib gaplashadi. Hech qanday xat, hech qanday pochta yo'q.
New Architecture nega tezroq:
- JSβnative overhead kamayadi. JSI tufayli ma'lumot endi matnga aylantirilib uzatilmaydi β JS to'g'ridan-to'g'ri native funksiyani chaqiradi. Pochta navbati yo'qoladi.
- Sinxron chaqiruvlar mumkin. Ayrim native qiymatlarni JS darhol, javob kutmasdan o'qiy oladi. Bu o'lchov (layout) va animatsiyalarni silliqroq qiladi.
- TurboModules native modullarni ilova ochilganda emas, kerak bo'lganda yuklaydi β ishga tushish tezlashadi.
Eslatma
24-bobda ko'rgan Reanimated ham shu falsafadan foydalanadi: animatsiyani JS ip-tolasida emas, to'g'ridan-to'g'ri UI ip-tolasida ishlatadi, shuning uchun JS band bo'lganda ham animatsiya silliq qoladi. New Architecture bularning hammasini yanada kuchaytiradi.
5. Bundle hajmi: kichikroq = tezroq¶
Bundle (to'plam) β bu sizning butun JavaScript kodingiz va kutubxonalaringiz birlashtirilgan bitta katta fayl. U qanchalik kichik bo'lsa, ilova shunchalik tez ochiladi va kam joy egallaydi.
Hajmni kichraytirish usullari:
- Keraksiz kutubxonalarni olib tashlang. Bir marta sinab ko'rib, keyin tashlab ketgan paketlar
package.json'da qolib ketadi va bundle'ga qo'shiladi. Ulardan voz keching:npm uninstall kerakmas-paket. npx expo-doctorβ loyihangizdagi muammolarni (mos kelmaydigan versiyalar, noto'g'ri sozlamalar) topib beradigan tekshiruvchi. Build'dan oldin ishga tushiring:
- Tree-shaking β bundler (Metro) faqat siz haqiqatan ishlatadigan kodni to'plamga qo'shadi, foydalanilmagan funksiyalarni "silkitib" tashlaydi. Bu avtomatik ishlaydi, lekin "named import" (
import { kerakli } from 'paket') ishlatsangiz, butun paketni emas, faqat kerakli qismni olishga yordam berasiz. - Bir vazifa β bitta paket. Bir xil ishni qiladigan ikkita kutubxona o'rnatmang (masalan, ikkita sana kutubxonasi). Bittasini tanlang.
Maslahat
Og'ir kutubxona (masalan, katta xarita yoki video pleer) faqat bitta ekranda kerak bo'lsa, uni butun ilova boshida emas, faqat o'sha ekran ochilganda yuklash mumkin. Lekin bu murakkablik qo'shadi β avval expo-doctor va keraksiz paketlarni tozalashdan boshlang.
B QISM β NEW ARCHITECTURE AMALDA¶
6. New Architecture yoniq β endi nima qilish kerak?¶
SDK 56'da New Architecture default yoniq va uni o'chirish tavsiya etilmaydi (kelajakda umuman majburiy bo'ladi). Sof Expo ilova yozsangiz, hamma narsa o'z-o'zidan ishlaydi β qo'shimcha sozlash kerak emas.
Yagona e'tibor beradigan narsa β uchinchi tomon kutubxonalari. Har bir native kutubxona New Architecture (Fabric/TurboModules) bilan moslashgan bo'lishi kerak. Yaxshi xabar: eng mashhur kutubxonalar (Reanimated, gesture-handler, safe-area-context, screens, ko'pchilik expo-* paketlari) allaqachon to'liq moslashgan.
Kutubxona moslimi yoki yo'qmi β buni React Native Directory saytida tekshirish mumkin: reactnative.directory. Har bir paket yonida "New Architecture" belgisi turadi.
Hayotiy o'xshatish. Yangi uyga ko'chgandek tasavvur qiling: yangi uyda rozetkalar yangi standart (masalan, uch teshikli). Ko'pchilik asboblaringiz allaqachon yangi standartga mos. Faqat juda eski, allaqachon ishlab chiqarilmaydigan asbob (qo'llab-quvvatlanmaydigan eski kutubxona) muammo bo'lishi mumkin β uni yangisi bilan almashtirasiz.
Ehtiyot bo'ling
Agar juda eski, endi yangilanmaydigan kutubxonaga duch kelsangiz (New Architecture'ni qo'llamaydi), eng yaxshi yechim β zamonaviy almashtiruvchisini topish. Ko'p eski paketlarning yangi, qo'llab-quvvatlanadigan muqobili bor. Tashlandiq kutubxonaga bog'lanib qolmang.
Maslahat
Build'dan oldin npx expo-doctor ishlating β u kutubxonalar va SDK versiyalari mosligini ham tekshiradi va muammolarni oldindan ogohlantiradi.
C QISM β BUILD VA DEPLOY (EAS)¶
Ilova tayyor va tez bo'ldi. Endi uni haqiqiy telefonga o'rnatiladigan faylga aylantirib, do'konlarga joylashimiz kerak. Bu yerda EAS (Expo Application Services) β Expo'ning bulutli build va deploy xizmati yordamga keladi.
7. Dev build va Expo Go o'rtasidagi farq¶
Hozirgacha ilovani sinash uchun Expo Go ilovasidan foydalanib keldik: QR kodni skanerlab, ilovangizni darhol telefonda ko'rardik. Bu boshlanish uchun ajoyib, lekin uning cheklovi bor.
Hayotiy o'xshatish. Expo Go β bu mehmonxona xonasiga o'xshaydi: tayyor, jihozlangan, darhol kirib yashashingiz mumkin. Lekin devorni buzib yangi xona qo'sholmaysiz β faqat bor narsadan foydalanasiz. Dev build esa β o'z uyingiz: istalgan o'zgartirish, istalgan qo'shimcha (native kod) ni kirita olasiz.
- Expo Go β Expo'ning oldindan tayyorlangan, ichida standart native kutubxonalar bor ilovasi. Agar loyihangizda Expo Go ichida bo'lmagan native kutubxona kerak bo'lsa (yoki o'zingizning native kodingiz), Expo Go uni ishga tushira olmaydi.
- Dev build (development build) β bu aynan sizning loyihangiz uchun yig'ilgan, ichida sizning barcha native kutubxonalaringiz bo'lgan maxsus dev ilova. U Expo Go kabi tez yangilanadi (Fast Refresh ishlaydi), lekin istalgan native paketni qo'llaydi.
Dev build yaratish uchun avval expo-dev-client qo'shasiz, keyin uni EAS bilan yig'asiz:
Qachon dev build kerak?
Loyihangizda Expo Go qo'llamaydigan native kutubxona paydo bo'lsa (masalan, maxsus to'lov SDK'si yoki Expo Go'ga kirmagan paket), Expo Go bilan ishlash to'xtaydi β o'shanda dev buildga o'tasiz. Oddiy, standart Expo paketlari bilan ishlasangiz, Expo Go yetib turadi.
8. EAS Build β bulutda yig'ish¶
Telefon ilovasini yig'ish (build qilish) odatda kompyuterda og'ir asboblar talab qiladi: iOS uchun Xcode (faqat Mac'da!), Android uchun Android Studio. Bularni o'rnatish, sozlash β uzoq va og'riqli. EAS Build bu muammoni butunlay yechadi: yig'ish ishi Expo'ning bulutli serverlarida bajariladi.
Hayotiy o'xshatish. EAS Build β bu non yopish uchun uyingizda tandir qurmasdan, nonvoyxonaga xamir berib yuborishga o'xshaydi: siz retseptni (kodingizni) berasiz, ular o'zlarining katta, professional pechlarida (serverlarida) pishirib, tayyor nonni (ilova faylini) qaytaradi. Sizning kompyuteringizda Xcode ham, Android Studio ham kerak emas β hatto Mac'siz iOS ilova yig'a olasiz.
1-qadam: EAS CLI o'rnatish va kirish.
npm i -g eas-cli # EAS buyruq qatori vositasini global o'rnatamiz
eas login # Expo akkauntingizga kiramiz (bepul ro'yxatdan o'tish)
2-qadam: loyihani sozlash. Bu buyruq loyihaga eas.json faylini qo'shadi β unda build profillari (sozlamalar to'plami) saqlanadi:
eas.json taxminan shunday ko'rinadi:
{
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"preview": {
"distribution": "internal"
},
"production": {
"autoIncrement": true
}
}
}
Bu yerda uchta profil bor β har biri boshqa maqsad uchun:
developmentβ yuqorida ko'rgan dev build (developmentClient: true). Ishlab chiqish va sinash uchun.previewβ komandaga yoki testerlarga ko'rsatish uchun.distribution: "internal"β do'konsiz, havola orqali tarqatiladi. Android'da odatda.apk(to'g'ridan-to'g'ri o'rnatiladi).productionβ do'konga (App Store / Play Store) yuborish uchun yakuniy build.
3-qadam: yig'ish.
eas build --platform android # Android uchun (.aab yoki .apk)
eas build --platform ios # iOS uchun (.ipa)
eas build --platform all # ikkalasi birdan
Profilni --profile (yoki qisqasi -e) bilan tanlaysiz:
Buyruqni yuborgach, EAS bulutda yig'a boshlaydi. Tugagach, sizga yuklab olish havolasi beradi:
- Android:
.aab(Android App Bundle) β Play Store'ga yuklash uchun rasmiy format..apkβ to'g'ridan-to'g'ri telefonga o'rnatish/sinash uchun. - iOS:
.ipaβ App Store yoki TestFlight uchun.
iOS va Android farqi
Eng yoqimli xabar: EAS bilan iOS ilovani Mac'siz ham yig'ish mumkin, chunki build Apple muhitiga ega Expo serverlarida bajariladi. Faqat App Store'ga yuborish uchun Apple Developer akkaunti kerak bo'ladi (pastda).
9. Ikonka, splash va versiya¶
Ilova do'konga chiqishidan oldin ikkita "yuz"i tayyor bo'lishi kerak: ikonka (telefon ekranidagi belgisi) va splash screen (ilova ochilayotganda ko'rsatiladigan boshlang'ich ekran). Bularning hammasi app.json da sozlanadi.
{
"expo": {
"name": "Mening Ilovam",
"version": "1.0.0",
"icon": "./assets/images/icon.png",
"ios": {
"buildNumber": "1"
},
"android": {
"versionCode": 1,
"adaptiveIcon": {
"foregroundImage": "./assets/images/android-icon-foreground.png",
"backgroundColor": "#0ea5e9"
}
},
"plugins": [
[
"expo-splash-screen",
{
"image": "./assets/images/splash-icon.png",
"imageWidth": 200,
"backgroundColor": "#0ea5e9"
}
]
]
}
}
Asosiy maydonlar:
iconβ ilova ikonkasi (kvadrat PNG, odatda 1024Γ1024). iOS uni avtomatik yumaloqlaydi.- Android adaptiv ikonka (
adaptiveIcon) β Android telefonlar ikonkani har xil shaklga (doira, kvadrat, "squircle") soladi. Shuning uchun ikonka old qatlam (foregroundImage) va fon rangi (backgroundColor) sifatida beriladi. expo-splash-screenplugin β ilova ochilayotganda ko'rsatiladigan rasm va fon rangi.- Versiya β uchta sondan iborat bo'ladi:
version("1.0.0") β foydalanuvchi ko'radigan versiya (ikkala platforma uchun).android.versionCode(1) β Android uchun ichki, butun son versiya. Har yangi build'da oshishi shart.ios.buildNumber("1") β iOS uchun ichki build raqami.
Ehtiyot bo'ling
Do'konga har yangi versiya yuborganingizda versionCode/buildNumber ni oshirishni unutmang β aks holda do'kon "bu raqam allaqachon ishlatilgan" deb rad etadi. eas.json dagi "autoIncrement": true buni avtomatik qiladi β shuning uchun yuqoridagi production profilda uni yoqib qo'ydik.
10. EAS Submit β do'konlarga yuborish¶
Build tayyor. Endi uni odamlarga yetkazish kerak β ya'ni App Store (iOS) va Google Play (Android) ga yuklash. Buni qo'lda qilish ham mumkin, lekin EAS Submit buni bitta buyruq bilan bajaradi:
EAS oxirgi build'ni olib, sizning do'kon akkauntingizga yuklaydi. Buni build bilan birga ham qilish mumkin:
Do'kon talablari (qisqacha):
- Google Play β bir martalik $25 to'lov bilan Google Play Console akkaunti ochasiz. Keyin cheksiz ilova chiqara olasiz.
- App Store β yiliga $99 Apple Developer Program a'zoligi. Apple ilovalarni qo'lda ko'rib chiqadi (review) β bir necha kun ketishi mumkin va sifat talablari qattiqroq.
Do'kon ro'yxati (store listing) β ilovangizning "vitrinasi". Ilova faqat fayl emas; do'konda u qanday ko'rinishini ham tayyorlaysiz:
- Skrinshotlar β turli ekran o'lchamlari uchun (foydalanuvchilar shularni ko'rib yuklab oladi).
- Tavsif β ilova nima qilishi, asosiy imkoniyatlar.
- Ilova ikonkasi, kategoriya, yosh chegarasi, maxfiylik siyosati (privacy policy) β ayniqsa Apple buni qattiq talab qiladi.
Maslahat
Birinchi marta to'g'ridan-to'g'ri production ga emas, preview build bilan boshlang va distribution: "internal" orqali do'stlaringizga sinab ko'rishga bering. Do'kon ro'yxati va skrinshotlarni shoshmasdan, sifatli tayyorlang β bu yuklab olishlar soniga katta ta'sir qiladi.
11. EAS Update β OTA (havodan yangilanish)¶
Mana, eng sehrli qism. Tasavvur qiling: ilovangizda kichik matn xatosi bor yoki tugma rangini o'zgartirmoqchisiz. Buning uchun butun build'ni qaytadan yig'ib, do'konga yuborib, Apple'ning bir necha kunlik tekshiruvini kutib, keyin foydalanuvchilar yangilanishni qo'lda o'rnatishini kutishingiz kerakmi? Yo'q! OTA (Over-The-Air β "havodan") yangilanish buni soniyalarda hal qiladi.
Hayotiy o'xshatish. Oddiy build β bu gazetaning yangi nashrini chop etib, har bir kioskka tarqatishga o'xshaydi: uzoq va qimmat. OTA (EAS Update) esa β gazetaning veb-saytidagi maqolani darhol tahrirlashga o'xshaydi: o'quvchilar keyingi safar ochganda yangi matnni ko'radi, hech kim yangi nashr chiqarmaydi.
Bu buyruq sizning JavaScript kodingizning yangi versiyasini Expo serveriga joylaydi. Foydalanuvchilar ilovani keyingi safar ochganda, ilova fonda yangi JS'ni yuklab oladi va keyingi ochilishda yangi versiyani ishlatadi β do'kon tekshiruvisiz, foydalanuvchi hech nima o'rnatmasdan.
Eng muhim qoida β qachon OTA, qachon yangi build:
| O'zgarish turi | Yechim |
|---|---|
| Matn, rang, tartib, JS mantiq, rasm almashtirish, bug tuzatish | eas update (OTA β darhol) |
| Yangi native kutubxona qo'shish | Yangi build (eas build) |
app.json da native sozlama (ruxsat, plugin, ikonka) o'zgarishi |
Yangi build |
| SDK versiyasini yangilash | Yangi build |
Oddiy qoida: agar o'zgarish faqat JavaScriptda bo'lsa β OTA yetadi. Agar native qismga (telefon ichidagi haqiqiy kodga) tegsa β yangi build kerak.
Ehtiyot bo'ling
OTA bilan native kodni o'zgartira olmaysiz. Agar yangi native kutubxona qo'shsangiz-u, OTA bilan jo'natsangiz, ilova ishlamaydi (yangi JS eski native kodda yo'q narsani chaqiradi). Native o'zgarish β doim yangi build.
Eslatma β branch va channel
eas update "branch" (tarmoq) va "channel" (kanal) tushunchalaridan foydalanadi: build qaysi channel'ga ulangan bo'lsa, o'sha channel'ga yo'naltirilgan branch'dagi yangilanishni oladi. Boshlanishda production branch'idan foydalansangiz yetadi; jamoa o'sganda preview/production ni ajratasiz.
12. Web: ilovangizni saytga aylantirish¶
React Native + Expo'ning yana bir kuchi β bitta kod web'da ham ishlaydi. Ilovangizni statik veb-sayt sifatida eksport qilib, istalgan hostingda joylashingiz mumkin:
Bu buyruq dist/ papkasida tayyor statik sayt (HTML, JS, CSS) yaratadi. Uni Netlify, Vercel, GitHub Pages, Cloudflare Pages β istalgan statik hostingga yuklaysiz.
Eslatma
Web'da ko'p narsa ishlaydi, lekin hamma narsa emas β kamera, push bildirishnoma, ayrim sensorlar brauzerda boshqacha (yoki umuman yo'q). Web'ni qo'shimcha bonus deb qarang: asosiy maqsad β mobil, web esa bir kodga bepul "ustama". Platform.OS === 'web' bilan platformaga qarab moslab yozish mumkin.
13. Deploy tekshiruv ro'yxati¶
Ilovani do'konga chiqarishdan oldin shu ro'yxatdan o'tib chiqing:
- [ ]
npx expo-doctorxatosiz o'tdi (versiyalar mos, sozlamalar to'g'ri). - [ ] Keraksiz kutubxonalar olib tashlandi, bundle tozalandi.
- [ ]
FlatListuzun ro'yxatlarda ishlatilgan, og'ir komponentlarReact.memobilan. - [ ] Ikonka va splash screen
app.jsonda to'g'ri sozlangan (Android adaptiv ikonka ham). - [ ]
version,versionCode/buildNumberto'g'ri (yangi build = oshirilgan raqam, yokiautoIncrement). - [ ]
eas.jsondaproductionprofil tayyor. - [ ] Maxfiy ma'lumot (API kalitlar, tokenlar) kodda ochiq yozilmagan β
app.config/ muhit o'zgaruvchilari orqali. - [ ] Ruxsatlar (
app.jsonplugins) faqat haqiqatan kerakli bo'lganlari β do'kon ortiqcha ruxsatni so'raydi. - [ ] Haqiqiy qurilmada (emulyator emas)
previewbuild sinab ko'rilgan. - [ ] Do'kon ro'yxati tayyor: skrinshotlar, tavsif, maxfiylik siyosati.
- [ ] OTA strategiyasi belgilangan: kichik tuzatishlar uchun
eas update, native o'zgarish uchun yangi build.
Xulosa¶
- Sekin ilova = o'chirilgan ilova. Mobil'da tezlik kritik: qurilmalar zaif, batareya cheklangan, maqsad β silliq 60 fps (har kadrga ~16 ms).
FlatListuzun ro'yxat uchun (ScrollViewemas):keyExtractor, elementReact.memo,getItemLayout(bir xil balandlikda),initialNumToRender,windowSize,removeClippedSubviews.- Keraksiz qayta render β "lag"ning bosh sababi.
React.memo+useCallback+useMemo+ Zustand selektor bilan kamaytiriladi. Avval o'lchang (DevTools Profiler), keyin optimallashtiring. expo-imageβ keshlash, lazy yuklash, silliq o'tish. Eng muhim β rasmni to'g'ri o'lchamda va zamonaviy formatda (WebP) bering.- Hermes (default) tez ishga tushadi (bytecode) va kam xotira oladi. New Architecture (Fabric + TurboModules + JSI) JSβnative overhead'ni kamaytiradi β "pochta" o'rniga to'g'ridan-to'g'ri chaqiruv.
- EAS Build β bulutda yig'ish: kompyuterda Xcode/Android Studio shart emas, hatto iOS'ni Mac'siz. Profillar:
development,preview,production. Natija:.aab/.apk/.ipa. - EAS Submit β
eas submitbilan App Store / Play Store ga. Google Play bir martalik $25, Apple yiliga $99. Do'kon ro'yxati (skrinshot, tavsif) shart. - EAS Update (OTA) β JS o'zgarishini do'kon tekshiruvisiz darhol yetkazadi. Oddiy qoida: faqat JS o'zgarsa β OTA; native qism o'zgarsa β yangi build.
- Web:
npx expo export -p webbitta koddan statik sayt yaratadi.
Amaliy mashqlar¶
-
FlatList'ni optimallashtirish. 8-bobdagi (yoki yangi) uzun ro'yxatni oling: kamida 200 ta element bo'lgan ma'lumot tuzing. Element komponentini
React.memobilan o'rang,keyExtractorvagetItemLayout(bir xil balandlik) qo'shing. Yo'naltirish: avval sozlamalarsiz skroll qiling, keyin sozlamalar bilan farqni sezing; element balandliginiStyleSheetda aniq belgilang. -
Render'ni o'lchash. React Native DevTools'ni oching (terminalda
j), Profiler tabini ishlatib, ro'yxatda bir element o'zgarganda nechta komponent qayta render bo'layotganini ko'ring. So'ngReact.memoqo'shib, farqni qayta o'lchang. Yo'naltirish: 26-bobdagi debugging usullarini eslang; render sonini kuzating. -
expo-imagebilan galereya. Internetdan rasmlar ro'yxatini (masalan, bepul rasm API'sidan)FlatListdaexpo-imagebilan ko'rsating.cachePolicyvatransitionqo'shing. Yo'naltirish:npx expo install expo-image; skroll'da rasmlar silliq paydo bo'lishini va qayta skroll'da kesh tufayli darhol chiqishini kuzating. -
EAS build sozlash. Bepul Expo akkaunt oching,
npm i -g eas-cli,eas login,eas build:configureni bajaring.eas.jsondagi uchta profilni ko'rib chiqing vapreviewprofil bilan Android.apkyig'ishni ishga tushiring. Yo'naltirish:eas build --platform android --profile preview; tugagach havoladan.apkni yuklab, telefonga o'rnatib ko'ring. -
Ikonka, splash va versiya. O'z ilovangizga ikonka (1024Γ1024 PNG), Android adaptiv ikonka va splash screen rasmini
app.jsonorqali ulang.version,versionCode,buildNumberni to'g'ri to'ldiring. Yo'naltirish:expo-splash-screenplugin sozlamalarini ishlating; ranglarni ilova mavzusiga moslang. -
OTA update (qiyin). 4-mashqdagi build telefonda turganda, ilovaning bir matni yoki rangini o'zgartiring va
eas update --branch production --message "..."bilan jo'nating. Ilovani yopib qayta oching va o'zgarish build'siz kelganini kuzating. So'ng o'zingizdan so'rang: agar yangi native kutubxona qo'shsangiz, OTA yetarmidi? Yo'naltirish: faqat JS o'zgarsa OTA ishlaydi; native o'zgarish yangi build talab qiladi.
β¬ οΈ Oldingi: 26 β Testlash va debugging Β· π Kitob boshi Β· Keyingi: 28 β Yakuniy loyiha β‘οΈ