Runtime، Hot Reload و ساخت در توسعه موبایل: چیست، مفاهیم کلیدی و نحوه عملکرد

نویسنده: IT Sectr منتشر شده: 2026-05-13 زمان مطالعه: 11 دقیقه

iOS Runtime، Method Swizzling، Hot Reload، Tree Shaking، Webpack — پشت این اصطلاحات مکانیسم‌های کلیدی نهفته است که تعیین می‌کنند برنامه چگونه روی دستگاه کار می‌کند، چگونه ساخته و بهینه می‌شود. طبق JetBrains Developer Ecosystem 2025، 78% توسعه‌دهندگان روزانه از ابزارهای ساخت (Webpack، Metro، Vite) استفاده می‌کنند. بیایید Runtime، Reflection، ابزارهای ساخت و بهینه‌سازی کد را بررسی کنیم.

نکات مهم

  • iOS Runtime — محیط اجرای پویای Objective-C که امکان تغییر رفتار کلاس‌ها را در حین اجرای برنامه فراهم می‌کند (Method Swizzling، Reflection).
  • Transpilation — تبدیل کد از یک زبان به زبان دیگر (TypeScript → JavaScript). Polyfill — افزودن قابلیت‌های از دست رفته به مرورگرهای قدیمی.
  • Bundler (Webpack، Metro) — ابزار ساخت که ماژول‌ها را در یک فایل ترکیب می‌کند. Tree Shaking — حذف کد استفاده نشده.
  • Minification — فشرده‌سازی کد (حذف فاصله‌ها، تغییر نام متغیرها). Obfuscation — مبهم‌سازی کد برای محافظت در برابر مهندسی معکوس.
  • Hot Reload — به‌روزرسانی کد بدون راه‌اندازی مجدد برنامه. Hot Restart — راه‌اندازی مجدد با حفظ وضعیت جلسه.

Runtime و Reflection: iOS Runtime، Method Swizzling و توزیع پویا

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

Method Swizzling تکنیکی برای جایگزینی پیاده‌سازی متد Objective-C با دیگری در زمان اجرا است. این یک مورد خاص از برنامه‌نویسی جنبه‌گرا (AOP) برای iOS است. Swizzling امکان افزودن ثبت، تحلیل یا ذخیره‌سازی موقت به متدهای موجود را بدون تغییر کد منبع آنها فراهم می‌کند.

یک مثال معمولی: جایگزینی viewWillAppear: در UIViewController برای افزودن ثبت خودکار صفحه‌ها. مهم: swizzling باید در متد +load یا +initialize انجام شود تا اجرا قبل از استفاده از کلاس تضمین شود. swizzling نادرست می‌تواند باعث رفتار نامعین و باگ‌هایی شود که اشکال‌زدایی آنها دشوار است.

objective-c
// 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 را تضمین می‌کند.

ابزارهای وب (Transpilation، Polyfill، Bundler، Webpack، Metro)

توسعه وب مدرن و توسعه موبایل با 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 از یک فایل پیکربندی استفاده می‌کند که نقطه ورود، خروجی، بارگذارها (برای پردازش انواع مختلف فایل) و پلاگین‌ها (برای عملکرد اضافی) را توصیف می‌کند.

javascript
// 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، Tree Shaking، Obfuscation)

Minification فرآیند فشرده‌سازی کد با حذف فاصله‌ها، نظرات و تغییر نام متغیرهای بلند به کوتاه است. کوچک‌سازهای محبوب: Terser (JS/TS)، CSSNano (CSS)، html-minifier-terser. کوچک‌سازی اندازه فایل را 50–70% کاهش می‌دهد. در تولید، Runtime کد کوچک شده را مانند کد اصلی اجرا می‌کند — تفاوت فقط در خوانایی و اندازه فایل است، نه در معناشناسی.

Tree Shaking حذف کد مرده‌ای است که در برنامه استفاده نمی‌شود. بر اساس تحلیل ایستای ماژول‌های ES (import/export) کار می‌کند. اگر تابعی صادر شود اما هرگز وارد نشود، Tree Shaking آن را از ساخت نهایی حذف می‌کند. Tree Shaking کد را به صورت ایستا تحلیل می‌کند — برخلاف Reflection که به صورت پویا کار می‌کند و می‌تواند به متدها و ویژگی‌هایی دسترسی داشته باشد که در زمان کامپایل نامرئی هستند.

Tree Shaking

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

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 NativeReact 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، Hot Restart)

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 چیست و چه زمانی استفاده می‌شود؟

Method Swizzling جایگزینی پیاده‌سازی متد در زمان اجرا است. برای AOP (برنامه‌نویسی جنبه‌گرا) استفاده می‌شود: ثبت خودکار، تحلیل، رفع باگ در کتابخانه‌ها. باید با احتیاط استفاده شود — swizzling نادرست می‌تواند باعث رفتار نامعین شود.

تفاوت بین Runtime و Reflection چیست؟

Runtime (محیط اجرا) زیرساختی است که اجرای کد را مدیریت می‌کند: تخصیص حافظه، توزیع متد، جمع‌آوری زباله. Reflection مکانیسم خاصی در داخل Runtime است که به برنامه اجازه می‌دهد ساختار خود (کلاس‌ها، متدها، ویژگی‌ها) را در زمان اجرا بررسی و تغییر دهد. Runtime گسترده‌تر است، Reflection یکی از ابزارهای آن است.

تفاوت بین Hot Reload و Hot Restart چیست؟

Hot Reload کد را بدون از دست دادن وضعیت برنامه به‌روز می‌کند — تغییرات را فوراً می‌بینید. Hot Restart برنامه را راه‌اندازی مجدد می‌کند (وضعیت از دست می‌رود)، اما سریع‌تر از بازسازی کامل است. Hot Reload برای تغییرات UI استفاده می‌شود، Hot Restart — برای تغییرات منطق و ناوبری.

Tree Shaking چیست و چگونه کار می‌کند؟

Tree Shaking حذف کد استفاده نشده از ساخت نهایی است. از طریق تحلیل ایستای ماژول‌های ES (import/export) کار می‌کند. Webpack به طور خودکار Tree Shaking را در حالت تولید فعال می‌کند. برای حداکثر کارایی، به جای وارد کردن کل کتابخانه از واردات دقیق استفاده کنید.

برای یک پروژه جدید کدام باندلر را انتخاب کنیم؟

برای پروژه وب — Vite (سریع‌ترین، مدرن). برای React Native — Metro (پیش‌فرض). برای کتابخانه‌ها — Rollup. اگر به سازگاری با پلاگین‌های زیاد و کد قدیمی نیاز دارید — Webpack. برای ساخت فوق‌سریع — esbuild.

خلاصه

  • iOS Runtime — محیط پویای Objective-C برای Method Swizzling، Reflection و AOP. نیاز به احتیاط دارد.
  • Method Swizzling — جایگزینی متدها در لحظه. برای تحلیل، ثبت، اصلاحات متمرکز استفاده می‌شود.
  • Reflection — مکانیسم بررسی و تغییر ساختار کد در زمان اجرا. در iOS Runtime (Objective-C) و از طریق KClass/Reflect API (Kotlin/JS) پیاده‌سازی شده است.
  • Transpilation (TypeScript → JS) و Polyfill (افزودن قابلیت به مرورگرهای قدیمی) پایه توسعه وب مدرن هستند.
  • Webpack و Metro باندلرهای اصلی هستند. Vite و esbuild نسل جدید متمرکز بر سرعت هستند.
  • Tree Shaking کد مرده را حذف می‌کند (تحلیل ایستا). Reflection دسترسی پویای نامرئی در زمان ساخت را فراهم می‌کند.
  • پیکربندی صحیح ابزارهای ساخت و درک Runtime زمان توسعه را 40–50% کاهش می‌دهد (داده‌های IT Sectr، 2024).

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه