با بررسی برنامههایی مثل دیسکورد، اسلک، فیگما و مایکروسافت تیمز در تسکمنیجر ویندوز، مشاهده میکنید که هر کدام با چند پردازش جداگانه، مقدار قابلتوجهی از رم کامپیوتر را اشغال کردهاند. احتمالا در اولین نگاه ویندوز را مقصر میدانید، اما این بار مشکل به سیستمعامل ارتباط ندارد؛ مقصر اصلی فریمورک الکترون (Electron) است که بسیاری از اپلیکیشنهای دسکتاپ محبوب بر پایهی آن ساخته شدهاند و هر کدام، بهجای استفاده از منابع مشترک سیستم، مرورگر کاملی را داخل خودشان حمل میکنند.
در این مطلب توضیح میدهیم الکترون دقیقا چطور کار میکند، چرا مصرف رم آن بالا است، چه تفاوتی با اپهای بومی ویندوز دارد و مهمتر از همه، چه کارهای عملی میتوان برای کاهش مصرف رم آنها انجام داد.
الکترون چیست و چرا رم زیادی مصرف میکند؟
الکترون در واقع ترکیبی از دو تکنولوژی است که بهطور طبیعی قرار نبود کنار هم قرار بگیرند: موتور مرورگر کرومیوم گوگل و Node.js. توسعهدهندگان با این ترکیب میتوانند اپ دسکتاپ را با جاوااسکریپت، HTML و CSS بنویسند؛ یعنی همان تکنولوژیهایی که برای توسعهی وب هم استفاده میشوند و در نتیجه نیازی به نوشتن کد جداگانه برای ویندوز، مک و لینوکس ندارند.
داخل هر اپلیکیشن الکترونی، همیشه حداقل دو نوع پردازش جدا از هم در حال اجرا است:
- پردازش اصلی: به فایل سیستم، سختافزار و سیستمعامل دسترسی کامل دارد.
- پردازشهای رندرکننده: همان صفحاتی هستند که رابط کاربری را که میبینید، میسازند و در واقع صفحهی وب هستند.
پردازشهای رندر کننده به دلایل امنیتی از سیستم اصلی ایزوله شدهاند و برای ارتباط با پردازش اصلی باید از لایهی پیامرسانی داخلی عبور کنند، نه اینکه مستقیم به سیستم دسترسی داشته باشند. از طرف دیگر هماهنگ کردن Node.js و کرومیوم روی یک ماشین نیاز به لایهی Threading پشتپرده دارد تا رویدادهای کاملا متفاوت این دو تکنولوژی با هم تداخل پیدا نکنند.
نتیجهی معماری چیزی است که به آن Electron bloat (باد کردن حجم و مصرف منابع الکترون) میگویند. یک اپ بومی کامپایل شده برای ویندوز میتواند از کتابخانههایی که سیستمعامل یا اپهای دیگر از قبل در حافظه بارگذاری کردهاند بهره ببرد، اما اپهای الکترونی این امکان را ندارند و به بیان دیگر هر کدام نسخهی کامل و مستقلی از مرورگر را با خودشان حمل میکنند و هیچ چیزی بینشان به اشتراک گذاشته نمیشود.
راهکار برای کاهش مصرف رم اپهای الکترونی
خبر خوب این است که توسعهدهندهی اپ الکترونی فقط مسئول نوشتن کد است، ولی شما بهعنوان کاربر چند راه برای کنترل این مصرف دارید:
۱. باز کردن اپهای وبمحور در مرورگر
سادهترین و مؤثرترین راهحل باز کردن مستقیم اپها در مرورگر است. اسلک و دیسکورد هر دو بهخوبی در تب مرورگر کار میکنند. وقتی این سرویسها در تب باز مرورگر اجرا شوند، دیگر مجبور نیستید نسخهی کاملی از کرومیوم و Node.js را فقط برای یک پنجرهی چت بارگذاری کنید.
۲. محدود کردن مصرف رم با فلگها
اپهای الکترونی به سوئیچهای استاندارد ابزار خط فرمان پاسخ میدهند و میتوانید آنها را با اجرا از ترمینال یا ویرایش میانبر دسکتاپ اعمال کنید. برای این کار:
- روی shortcut اپ الکترونی (مثلاً Slack.lnk) راستکلیک و سپس Properties را باز کنید.
- در فیلد Target، بعد از مسیر فایل اجرایی، یک کاراکتر فاصله و سپس و فلگ مدنظر را اضافه کنید. بهعنوان مثال برای محدود کردن سقف رم که موتور V8 میتواند استفاده کند از کد زیر بهره ببرید:
- برای غیرفعال کردن کش دیسک اضافی میتوانید از دستور زیر استفاده کنید. مقدار عددی بر حسب بایت است:
- تغییرات را ذخیره و اپ را از همان shortcut اجرا کنید.
فلگها فقط سقف مصرف را محدود میکنند و اگر خیلی پایین تنظیم شوند احتمال کند شدن یا کرش اپ وجود دارد، بنابراین بهتر است با اعداد مختلف تست و نقطهی تعادل را پیدا کنید.
۳. بستن اپهای پسزمینهی غیرضروری
با کلید ترکیبی Ctrl+Shift+Esc تسکمنجیر را باز کنید و ببینید کدام اپهای الکترونی در پسزمینه باز ماندهاند و آنها را کاملاً ببندید. درواقع بسیاری از این اپها حتی درحالت مینیمایز هم در system tray فعال باقی میمانند و رم مصرف میکنند.
۴. بهجای الکترون، از جایگزینهای ساختهشده با Tauri استفاده کنید
اگر واقعا به نسخهی دسکتاپ اپلیکیشن موردنظر خود نیاز دارید، جایگزینهای ساختهشده با فریمورک Tauri ارزش امتحان کردن دارند. Tauri بهجای حمل نسخهی کامل از کرومیوم، از نمای وب سیستمعامل مثل WebView2 ویندوز بهره میبرد و هستهی آن هم بهجای Node.js با زبان Rust نوشته شده است. این تفاوت معماری باعث میشود اپهای Tauri در حالت بلااستفاده معمولا حدود ۳۰ تا ۵۰ مگابایت رم مصرف کنند، در حالی که اپهای الکترونی در همین حالت چیزی حدود ۱۵۰ تا ۳۰۰ مگابایت رم به خود اختصاص میدهند. حجم فایل نصبی اپهای Tauri هم معمولا بین ۳ تا ۱۰ مگابایت و اپهای الکترونی ۱۲۰ تا ۲۰۰ مگابایت است.