یکپارچهسازی V8 و Node.js: راهنمای جامع
خلاصهٔ کاملتر
Node.js یه فورک از موتور جاوااسکریپت V8 رو توی پوشهی deps/v8 نگه میداره. این فورک معمولاً با آخرین نسخههای stable V8 همگام میشه و چند پچ اضافه («floating patches») روی اون سوار میکنه — یا برای پلتفرمهایی که V8 رسمی پشتیبانی نمیکنه، یا برای تغییراتی که هنوز به upstream V8 نرسیدن. هر ماه یه PR بزرگ باز میشه تا deps/v8 به نسخهی جدید V8 برسه — کاری که معمولاً Michaël Zasso بهتنهایی روی دوشش میبره.
یه شاخهی جداگانه به اسم canary-base توی nodejs/node وجود داره. هر روز یه workflow توی ریپازیتوری nodejs/node-v8 اجرا میشه که این شاخه رو با آخرین کامیت معتبر V8 (به اسم lkgr) ترکیب میکنه و میبینه آیا بیلد میشه یا نه. اگه موفق بشه، شاخهی canary آپدیت میشه و بایناریهای v8-canary تولید میشن.
یکی از بزرگترین چالشهای نگهداری اینه که V8 از سیستم بیلد GN استفاده میکنه، ولی Node.js هنوز با GYP (یه سیستم قدیمی که کروم قبلاً ازش استفاده میکرد) کار میکنه. این یعنی هر بار که کانفیگ بیلد V8 عوض میشه، باید دستی به فرمت GYP ترجمه بشه. فایلهای GYP مربوط به V8 هم توی tools/v8_gypfiles نگه میشن، نه داخل deps/v8.
Node.js از خیلی سیستمعاملها، معماریها و toolchainهایی پشتیبانی میکنه که V8 رسمی بهشون اهمیت نمیده — مثل GCC روی لینوکس یا ClangCL روی ویندوز. تفاوت در کانفیگ بیلد هم مهمه: مثلاً V8 بهطور پیشفرض pointer compression رو روشن میکنه (که حداکثر heap رو به ۴ گیگابایت محدود میکنه)، ولی Node.js برای سازگاری با نسخههای قبلی، این قابلیت رو خاموش میکنه.
تیم V8 در گوگل هم یه فورک جداگانه از Node.js داره توی v8/node که برای CI خودش ازش استفاده میکنه. این فورک با GN بیلد میشه (نه GYP) و هر چند ماه یهبار از شاخهی main نود جیاس بریده میشه. هر CL در V8 باید این CI رو پاس کنه تا بتونه merge بشه. کانفیگهای GN غیررسمی که الکترون هم ازشون استفاده میکنه، توی فایلهایی به اسم unofficial.gni نگه میشن.
برای کسایی که روی پچهای بینپروژهای کار میکنن، چند نکتهی کاربردی وجود داره: اگه میخوای تأثیر یه پچ V8 رو روی کاربران Node.js بسنجی، باید از بیلد GYP استفاده کنی، نه GN — چون مشخصات پرفورمنس در این دو کاملاً متفاوته. ابزار git node v8 backport از پکیج node-core-utils میتونه در اعمال پچها کمک کنه. اگه هم لازم شه یه پچ Node.js به CI نود جیاس در V8 برسه، باید یه PR به شاخهی node-ci-YYYY-MM-DD در v8/node فرستاده بشه و بعد DEPS file در node-ci آپدیت بشه.
نکات کلیدی:
- deps/v8 فورک Node.js از V8 هست و هر ماه با نسخهی stable جدید آپدیت میشه
- تفاوت سیستم بیلد (GYP در Node.js در مقابل GN در V8) بزرگترین منبع کار نگهداریست
- شاخهی canary-base و workflow روزانه به تشخیص زودهنگام مشکلات کمک میکنه
- هر CL در V8 باید CI مربوط به Node.js رو هم پاس بده
- نسخهی V8 در هر major release لاک میشه که این هر آوریل فشار زیادی روی تیم میذاره
- برای سنجش پرفورمنس، بیلد GYP نتایج واقعیتری برای کاربران Node.js میده




