iOS Runtime, Method Swizzling, Hot Reload, Tree Shaking, Webpack — bu terminlərin arxasında tətbiqin cihazda necə işlədiyini, necə qurulduğunu və optimallaşdırıldığını müəyyən edən əsas mexanizmlər dayanır. JetBrains Developer Ecosystem 2025-ə görə, tərtibatçıların 78% hər gün qurulma alətlərindən (Webpack, Metro, Vite) istifadə edir. Runtime, Reflection, qurulma alətləri və kod optimallaşdırmalarını nəzərdən keçirək.
Əsas məqamlar
Runtime (icra mühiti) tətbiqin icrasını idarə edən proqram təminatıdır. iOS Runtime kontekstində, bu, obyektlərə mesaj göndərməyə, dərhal siniflər yaratmağa və icra zamanı metodları əvəz etməyə imkan verən Objective-C-nin dinamik sistemidir. Bu mümkündür, çünki Objective-C C üzərində qurulmuş dinamik tipli bir dildir.
Reflection proqramın öz strukturunu icra zamanı yoxlamaq və dəyişdirmək qabiliyyətidir. iOS Runtime-da bu, class_getInstanceMethod, method_exchangeImplementations və objc_getAssociatedObject kimi funksiyalar vasitəsilə həyata keçirilir. Kotlin/Java-da refleksiya KClass / java.lang.reflect istifadə edir.
IT Sectr-də, biz Runtime çox nadir hallarda istifadə edirik — yalnız alternativi olmayan xüsusi tapşırıqlar üçün. Məsələn, mərkəzləşdirilmiş analitika qeydiyyatı və ya kitabxanalardakı səhvləri düzəltmək üçün Method Swizzling. Bununla belə, Runtime dərin anlayış və ehtiyat tələb edən güclü bir alətdir.
Method Swizzling icra zamanı Objective-C metodunun tətbiqini başqası ilə əvəz etmə texnikasıdır. Bu, iOS üçün Aspekt Yönümlü Proqramlaşdırmanın (AOP) xüsusi bir halıdır. Swizzling mövcud metodların mənbə kodunu dəyişmədən onlara qeydiyyat, analitika və ya keşləmə əlavə etməyə imkan verir.
Tipik bir nümunə: avtomatik ekran qeydiyyatı əlavə etmək üçün UIViewController-da viewWillAppear:-ı əvəz etmək. Vacib: swizzling +load və ya +initialize metodunda yerinə yetirilməlidir ki, sinif istifadə edilməzdən əvvəl icra təmin olunsun. Səhv swizzling qeyri-müəyyən davranışa və sazlanması çətin olan səhvlərə səbəb ola bilər.
// Method Swizzling for logging viewWillAppear:
@implementation UIViewController (Tracking)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
SEL originalSelector = @selector(viewWillAppear:);
SEL swizzledSelector = @selector(xxx_viewWillAppear:);
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
method_exchangeImplementations(originalMethod, swizzledMethod);
});
}
- (void)xxx_viewWillAppear:(BOOL)animated {
[self xxx_viewWillAppear:animated]; // orijinal metodu çağırma
[Analytics logScreen:NSStringFromClass([self class])];
}
@end
Bu kod swizzling vasitəsilə bütün UIViewController-da viewWillAppear:-ı əvəz edir. method_exchangeImplementations-dan sonra, orijinal viewWillAppear:-ı çağırmaq xxx_viewWillAppear:-ın çağırılmasına gətirib çıxarır, bu da orijinal metodu çağırır (rekursiv çağırış vasitəsilə) və analitika əlavə edir. DispatchOnce swizzling-in tək icrasını təmin edir.
Müasir veb inkişafı və React Native və ya Flutter ilə mobil inkişaf qurulma alətləri olmadan mümkün deyil. Transpilation kodun bir dildən digərinə çevrilməsidir. Ən məşhur nümunə: TypeScript → JavaScript. Transpilyator (Babel, tsc) müasir kodu geriyə uyğun versiyaya çevirir.
Polyfill köhnə brauzerlərə çatışmayan funksionallıq əlavə edən koddur. Məsələn, Promise.allSettled() Internet Explorer-də işləmir, lakin polyfill bu imkanı əlavə edir. Yerli Runtime-dan fərqli olaraq, birbaşa cihazda kod icrasını idarə edən, polyfill və transpilyatorlar dil abstraksiya səviyyəsində işləyir — sintaksis və API-ləri uyğunlaşdırır, lakin icra mühitinə müdaxilə etmir.
Webpack ən məşhur paketləyicidir (State of JS 2024-ə görə layihələrin 72%-də istifadə olunur). Metro Facebook-un paketləyicisidir, React Native-də standart olaraq istifadə olunur. JavaScript-də Reflection Object.getPrototypeOf, Proxy və Reflect API vasitəsilə mövcuddur — bu mexanizmlər icra zamanı obyektləri yoxlamağa və dəyişdirməyə imkan verir, bu da paketləyicilərdəki statik modul analizindən əsaslı şəkildə fərqlənir. Webpack giriş nöqtəsini, çıxışı, yükləyiciləri (müxtəlif fayl növlərini emal etmək üçün) və plaginləri (əlavə funksionallıq üçün) təsvir edən konfiqurasiya faylından istifadə edir.
// webpack.config.js — minimal konfiqurasiya
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: 'babel-loader',
},
],
},
mode: 'production',
};
Bu konfiqurasiya giriş nöqtəsini (index.js), çıxış faylını (bundle.js) və Babel vasitəsilə JavaScript emalı qaydasını müəyyən edir. production rejimi optimallaşdırmaları aktivləşdirir: minifikasiya, tree shaking və avtomatik mühit aşkarlama. Runtime mərhələsində, bütün bu optimallaşdırmalar artıq məntiqə təsir etmir — brauzer kiçildilmiş paketi adi JavaScript kimi icra edir.
Minification boşluqları və şərhləri silmək və uzun dəyişən adlarını qısaltmaqla kodu sıxışdırma prosesidir. Məşhur kiçildicilər: Terser (JS/TS), CSSNano (CSS), html-minifier-terser. Kiçiltmə fayl ölçüsünü 50–70% azaldır. İstehsalda, Runtime kiçildilmiş kodu orijinal kod kimi icra edir — fərq yalnız oxunaqlılıq və fayl ölçüsündədir, semantikada deyil.
Tree Shaking tətbiqdə istifadə olunmayan ölü kodun silinməsidir. ES modullarının (import/export) statik analizinə əsaslanaraq işləyir. Əgər funksiya ixrac edilir, lakin heç vaxt idxal edilmirsə, Tree Shaking onu son qurulmadan silir. Tree Shaking kodu statik olaraq analiz edir — dinamik işləyən və tərtib zamanı görünməyən metodlara və xüsusiyyətlərə daxil ola bilən Reflection-dan fərqli olaraq.
Tree Shaking Webpack-də istehsal rejimində avtomatik aktivləşdirilir. Vacib şərt: kod ES modullarından (import/export) istifadə etməlidir, CommonJS (require) yox. Əgər kitabxana CommonJS ilə yazılıbsa, tree shaking işləməyəcək. Optimal tree shaking üçün, import _ from 'lodash' əvəzinə import { merge } from 'lodash-es' kimi dəqiq idxallardan istifadə edin. Bu, bir funksiya üçün paket ölçüsünü 500 KB-dan 10 KB-a endirir.
Hot Reload tam yenidən yükləmə olmadan tətbiq kodunu yeniləməyə imkan verən texnologiyadır. React Native və Flutter-da, Hot Reload dəyişdirilmiş faylı dərhal yeniləyir, cari tətbiq vəziyyətini qoruyur. Bu, inkişafı köklü şəkildə sürətləndirir: dəyişikliklər tam yenidən qurulma üçün 10–30 saniyə əvəzinə 1–2 saniyədə görünür. Hot Reload Runtime daxilində işləyir: dəyişdirilmiş modul icra mühitini yenidən başlatmadan işləyən tətbiqə yeridilir.
Hot Restart yenilənmiş kodla tətbiqin sürətli yenidən başladılmasıdır, lakin vəziyyət qorunmur. Hot Reload mümkün olmadıqda istifadə olunur (məsələn, yerli kod və ya qlobal dəyişənlər dəyişdikdə). IT Sectr-də, biz UI inkişafının bütün mərhələlərində Hot Reload istifadə edirik — vizual düzəlişlərə 50% vaxta qənaət edir.
| Alət | Məqsəd | Platforma |
|---|---|---|
| Webpack | Zəngin plagin ekosisteminə malik universal paketləyici | Veb, React Native (xüsusi) |
| Metro | React Native üçün Facebook-un paketləyicisi | React Native (standart) |
| Vite | Veb üçün ESBuild əsaslı sürətli paketləyici | Veb (React, Vue, Svelte) |
| esbuild | Go əsaslı ultra sürətli paketləyici (Webpack-dən 10-100x sürətli) | Veb, Node.js |
| Rollup | Kitabxanalar üçün paketləyici (ES modulları, tree shaking) | Kitabxanalar, NPM paketləri |
Cədvəl 3. Qurulma alətlərinin müqayisəsi. Webpack universal standartdır. Metro React Native üçün ixtisaslaşmışdır. Vite və esbuild sürətə fokuslanmış yeni nəsildir. Rollup kitabxana nəşr etmək üçün ən yaxşı seçimdir.
Hot Reload veb inkişafında (React Hot Loader, HMR — Hot Module Replacement) yaranmış və Flutter və React Native ilə mobil inkişafa keçmiş texnologiyadır. Mahiyyət: fayl dəyişdikdə, paketləyici yenilənmiş modulu işləyən tətbiqə göndərir, bu da vəziyyəti itirmədən köhnə kodu əvəz edir. Tam yenidən qurulmadan fərqli olaraq, Hot Reload Runtime-ı yenidən başlatmır — icra mühiti işləməyə davam edir və dəyişdirilmiş modul HMR və ya Reflection bənzəri istinad yeniləməsi kimi mexanizm vasitəsilə dinamik olaraq qoşulur.
Hot Reload işləyir, çünki freymvork vidjetləri (Flutter) və ya komponentləri (React) yaddaşda saxlayır və yalnız dəyişdirilmiş hissələri yeniləyir. Hot Restart daha kobud mexanizmdir: tətbiqi tamamilə yenidən başladır, lakin yerli kodu yenidən tərtib etmədiyi üçün tam yenidən qurulmadan daha sürətlidir. IT Sectr-də, biz UI hazırlayarkən Hot Reload, naviqasiya və ya vəziyyət idarəetməsini dəyişdirərkən Hot Restart istifadə edirik.
Tez-tez verilən suallar
Method Swizzling icra zamanı metod tətbiqinin dəyişdirilməsidir. AOP (Aspekt Yönümlü Proqramlaşdırma) üçün istifadə olunur: avtomatik qeydiyyat, analitika, kitabxanalardakı səhvlərin düzəldilməsi. Ehtiyatla istifadə edilməlidir — səhv swizzling qeyri-müəyyən davranışa səbəb ola bilər.
Runtime (icra mühiti) kod icrasını idarə edən infrastrukturdur: yaddaş ayrılması, metod göndərmə, zibil yığma. Reflection Runtime daxilində xüsusi bir mexanizmdir ki, proqrama icra zamanı öz strukturunu (siniflər, metodlar, xüsusiyyətlər) yoxlamağa və dəyişdirməyə imkan verir. Runtime daha genişdir, Reflection onun alətlərindən biridir.
Hot Reload tətbiq vəziyyətini itirmədən kodu yeniləyir — dəyişiklikləri dərhal görürsünüz. Hot Restart tətbiqi yenidən başladır (vəziyyət itirilir), lakin tam yenidən qurulmadan daha sürətlidir. Hot Reload UI dəyişiklikləri üçün istifadə olunur, Hot Restart — məntiq və naviqasiya dəyişiklikləri üçün.
Tree Shaking son qurulmadan istifadə olunmayan kodun silinməsidir. ES modullarının (import/export) statik analizi vasitəsilə işləyir. Webpack istehsal rejimində avtomatik Tree Shaking-i aktivləşdirir. Maksimum səmərəlilik üçün, bütün kitabxananı idxal etmək əvəzinə dəqiq idxallardan istifadə edin.
Veb layihəsi üçün — Vite (ən sürətli, müasir). React Native üçün — Metro (standart). Kitabxanalar üçün — Rollup. Çox plagin və köhnə kodla uyğunluq lazımdırsa — Webpack. Ultra sürətli qurulma üçün — esbuild.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.