iOS Runtime، Method Swizzling، Hot Reload، Tree Shaking، Webpack — پشت این اصطلاحات مکانیسمهای کلیدی نهفته است که تعیین میکنند برنامه چگونه روی دستگاه کار میکند، چگونه ساخته و بهینه میشود. طبق JetBrains Developer Ecosystem 2025، 78% توسعهدهندگان روزانه از ابزارهای ساخت (Webpack، Metro، Vite) استفاده میکنند. بیایید Runtime، Reflection، ابزارهای ساخت و بهینهسازی کد را بررسی کنیم.
نکات مهم
Runtime (محیط اجرا) نرمافزاری است که اجرای برنامه را مدیریت میکند. در زمینه iOS Runtime، این سیستم پویای Objective-C است که امکان ارسال پیام به اشیاء، ایجاد کلاسها در لحظه و جایگزینی متدها را در زمان اجرا فراهم میکند. این امکانپذیر است زیرا Objective-C یک زبان با نوعدهی پویا ساخته شده بر روی C است.
Reflection توانایی یک برنامه برای بررسی و تغییر ساختار خود در زمان اجرا است. در iOS Runtime، این از طریق توابعی مانند class_getInstanceMethod، method_exchangeImplementations و objc_getAssociatedObject پیادهسازی میشود. در Kotlin/Java، بازتاب از KClass / java.lang.reflect استفاده میکند.
در IT Sectr، ما به ندرت از Runtime استفاده میکنیم — فقط برای کارهای خاصی که جایگزینی ندارند. به عنوان مثال، Method Swizzling برای ثبت تحلیل متمرکز یا رفع باگ در کتابخانهها. با این حال، Runtime ابزاری قدرتمند است که نیاز به درک عمیق و احتیاط دارد.
Method Swizzling تکنیکی برای جایگزینی پیادهسازی متد Objective-C با دیگری در زمان اجرا است. این یک مورد خاص از برنامهنویسی جنبهگرا (AOP) برای iOS است. Swizzling امکان افزودن ثبت، تحلیل یا ذخیرهسازی موقت به متدهای موجود را بدون تغییر کد منبع آنها فراهم میکند.
یک مثال معمولی: جایگزینی viewWillAppear: در UIViewController برای افزودن ثبت خودکار صفحهها. مهم: swizzling باید در متد +load یا +initialize انجام شود تا اجرا قبل از استفاده از کلاس تضمین شود. swizzling نادرست میتواند باعث رفتار نامعین و باگهایی شود که اشکالزدایی آنها دشوار است.
// Method Swizzling برای ثبت 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]; // فراخوانی متد اصلی
[Analytics logScreen:NSStringFromClass([self class])];
}
@end
این کد viewWillAppear: را در تمام UIViewController از طریق swizzling جایگزین میکند. پس از method_exchangeImplementations، فراخوانی viewWillAppear: اصلی منجر به فراخوانی xxx_viewWillAppear: میشود که متد اصلی را فراخوانی میکند (از طریق فراخوانی بازگشتی) و تحلیل را اضافه میکند. DispatchOnce اجرای یکباره swizzling را تضمین میکند.
توسعه وب مدرن و توسعه موبایل با React Native یا Flutter بدون ابزارهای ساخت غیرممکن است. Transpilation تبدیل کد از یک زبان به زبان دیگر است. محبوبترین مثال: TypeScript → JavaScript. ترانسپایلر (Babel، tsc) کد مدرن را به نسخهای سازگار با عقب تبدیل میکند.
Polyfill کدی است که قابلیت از دست رفته را به مرورگرهای قدیمی اضافه میکند. به عنوان مثال، Promise.allSettled() در Internet Explorer کار نمیکند، اما polyfill این قابلیت را اضافه میکند. برخلاف Runtime بومی، که اجرای کد را مستقیماً روی دستگاه مدیریت میکند، polyfillها و ترانسپایلرها در سطح انتزاع زبان کار میکنند — نحو و APIها را تطبیق میدهند اما در محیط اجرا دخالت نمیکنند.
Webpack محبوبترین باندلر است (طبق State of JS 2024 در 72% پروژهها استفاده میشود). Metro باندلر فیسبوک است که به طور پیشفرض در React Native استفاده میشود. Reflection در JavaScript از طریق Object.getPrototypeOf، Proxy و Reflect API وجود دارد — این مکانیسمها امکان بررسی و تغییر اشیاء را در زمان اجرا فراهم میکنند که اساساً با تحلیل ایستای ماژولها در باندلرها متفاوت است. Webpack از یک فایل پیکربندی استفاده میکند که نقطه ورود، خروجی، بارگذارها (برای پردازش انواع مختلف فایل) و پلاگینها (برای عملکرد اضافی) را توصیف میکند.
// webpack.config.js — حداقل پیکربندی
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',
};
این پیکربندی نقطه ورود (index.js)، فایل خروجی (bundle.js) و یک قانون برای پردازش JavaScript از طریق Babel را تعریف میکند. حالت production بهینهسازیها را فعال میکند: کوچکسازی، tree shaking و تشخیص خودکار محیط. در مرحله Runtime، همه این بهینهسازیها دیگر بر منطق تأثیر نمیگذارند — مرورگر باندل کوچک شده را به عنوان JavaScript معمولی اجرا میکند.
Minification فرآیند فشردهسازی کد با حذف فاصلهها، نظرات و تغییر نام متغیرهای بلند به کوتاه است. کوچکسازهای محبوب: Terser (JS/TS)، CSSNano (CSS)، html-minifier-terser. کوچکسازی اندازه فایل را 50–70% کاهش میدهد. در تولید، Runtime کد کوچک شده را مانند کد اصلی اجرا میکند — تفاوت فقط در خوانایی و اندازه فایل است، نه در معناشناسی.
Tree Shaking حذف کد مردهای است که در برنامه استفاده نمیشود. بر اساس تحلیل ایستای ماژولهای ES (import/export) کار میکند. اگر تابعی صادر شود اما هرگز وارد نشود، Tree Shaking آن را از ساخت نهایی حذف میکند. Tree Shaking کد را به صورت ایستا تحلیل میکند — برخلاف Reflection که به صورت پویا کار میکند و میتواند به متدها و ویژگیهایی دسترسی داشته باشد که در زمان کامپایل نامرئی هستند.
Tree Shaking در Webpack به طور خودکار در حالت تولید فعال میشود. یک شرط مهم: کد باید از ماژولهای ES (import/export) استفاده کند، نه CommonJS (require). اگر کتابخانهای با CommonJS نوشته شده باشد، tree shaking کار نخواهد کرد. برای tree shaking بهینه، از واردات دقیق استفاده کنید: import { merge } from 'lodash-es' به جای import _ from 'lodash'. این اندازه باندل را از 500 KB به 10 KB برای یک تابع کاهش میدهد.
Hot Reload فناوریای است که امکان بهروزرسانی کد برنامه را بدون بارگذاری مجدد کامل فراهم میکند. در React Native و Flutter، Hot Reload فایل تغییر یافته را در لحظه بهروز میکند و وضعیت فعلی برنامه را حفظ میکند. این کار توسعه را به طور اساسی سرعت میبخشد: تغییرات در 1–2 ثانیه به جای 10–30 ثانیه برای بازسازی کامل قابل مشاهده هستند. Hot Reload در داخل Runtime کار میکند: ماژول تغییر یافته بدون راهاندازی مجدد محیط اجرا به برنامه در حال اجرا تزریق میشود.
Hot Restart راهاندازی مجدد سریع برنامه با کد بهروز شده است، اما بدون حفظ وضعیت. زمانی استفاده میشود که Hot Reload امکانپذیر نیست (مثلاً وقتی کد بومی یا متغیرهای سراسری تغییر کردهاند). در IT Sectr، ما در تمام مراحل توسعه UI از Hot Reload استفاده میکنیم — تا 50% در زمان تنظیمات بصری صرفهجویی میکند.
| ابزار | هدف | پلتفرم |
|---|---|---|
| Webpack | باندلر جهانی با اکوسیستم پلاگین غنی | وب، React Native (سفارشی) |
| Metro | باندلر فیسبوک برای React Native | React Native (پیشفرض) |
| Vite | باندلر سریع مبتنی بر ESBuild برای وب | وب (React، Vue، Svelte) |
| esbuild | باندلر فوقسریع مبتنی بر Go (10-100 برابر سریعتر از Webpack) | وب، Node.js |
| Rollup | باندلر برای کتابخانهها (ماژولهای ES، tree shaking) | کتابخانهها، بستههای NPM |
جدول 3. مقایسه ابزارهای ساخت. Webpack استاندارد جهانی است. Metro برای React Native تخصصی است. Vite و esbuild نسل جدید متمرکز بر سرعت هستند. Rollup بهترین انتخاب برای انتشار کتابخانهها است.
Hot Reload فناوریای است که در توسعه وب (React Hot Loader، HMR — Hot Module Replacement) پدید آمد و با Flutter و React Native به توسعه موبایل منتقل شد. اصل: وقتی فایلی تغییر میکند، باندلر ماژول بهروز شده را به برنامه در حال اجرا میفرستد که کد قدیمی را بدون از دست دادن وضعیت جایگزین میکند. برخلاف بازسازی کامل، Hot Reload Runtime را راهاندازی مجدد نمیکند — محیط اجرا به کار خود ادامه میدهد و ماژول تغییر یافته از طریق مکانیسمی مانند HMR یا بهروزرسانی مرجع مشابه Reflection به صورت پویا متصل میشود.
Hot Reload کار میکند زیرا چارچوب ویجتها (Flutter) یا کامپوننتها (React) را در حافظه نگه میدارد و فقط بخشهای تغییر یافته را بهروز میکند. Hot Restart مکانیسمی خشنتر است: برنامه را به طور کامل راهاندازی مجدد میکند، اما سریعتر از بازسازی کامل است زیرا کد بومی را دوباره کامپایل نمیکند. در IT Sectr، ما هنگام توسعه UI از Hot Reload و هنگام تغییر ناوبری یا مدیریت وضعیت از Hot Restart استفاده میکنیم.
سؤالات متداول
Method Swizzling جایگزینی پیادهسازی متد در زمان اجرا است. برای AOP (برنامهنویسی جنبهگرا) استفاده میشود: ثبت خودکار، تحلیل، رفع باگ در کتابخانهها. باید با احتیاط استفاده شود — swizzling نادرست میتواند باعث رفتار نامعین شود.
Runtime (محیط اجرا) زیرساختی است که اجرای کد را مدیریت میکند: تخصیص حافظه، توزیع متد، جمعآوری زباله. Reflection مکانیسم خاصی در داخل Runtime است که به برنامه اجازه میدهد ساختار خود (کلاسها، متدها، ویژگیها) را در زمان اجرا بررسی و تغییر دهد. Runtime گستردهتر است، Reflection یکی از ابزارهای آن است.
Hot Reload کد را بدون از دست دادن وضعیت برنامه بهروز میکند — تغییرات را فوراً میبینید. Hot Restart برنامه را راهاندازی مجدد میکند (وضعیت از دست میرود)، اما سریعتر از بازسازی کامل است. Hot Reload برای تغییرات UI استفاده میشود، Hot Restart — برای تغییرات منطق و ناوبری.
Tree Shaking حذف کد استفاده نشده از ساخت نهایی است. از طریق تحلیل ایستای ماژولهای ES (import/export) کار میکند. Webpack به طور خودکار Tree Shaking را در حالت تولید فعال میکند. برای حداکثر کارایی، به جای وارد کردن کل کتابخانه از واردات دقیق استفاده کنید.
برای پروژه وب — Vite (سریعترین، مدرن). برای React Native — Metro (پیشفرض). برای کتابخانهها — Rollup. اگر به سازگاری با پلاگینهای زیاد و کد قدیمی نیاز دارید — Webpack. برای ساخت فوقسریع — esbuild.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.