بازسازی سرویس /+esm در jsDelivr
خلاصهٔ کاملتر
سرویس /+esm جیاسدلیور کارش اینه که یه پکیج منتشرشده روی npm رو بگیره و یه ES ماژول آمادهٔ مرورگر تحویل بده. تو این پست اومده که این مسیر خیلی بیشتر از عوضکردن سینتکس ماژوله: ریزالو کردن exports و entry point مرورگری، تبدیل کامنجیاس، پیادهسازی مرورگری برای APIهای نود، باندل کردن وابستگیها، حذف کد بلااستفاده، مینیفای و ساخت سورسمپ.
به گفتهٔ تیم، قبل از دستزدن دوباره به خط باندلینگ، اول خود بکاند به ESM بومی منتقل شد و کل استک وابستگیها با هم بالا اومد — از جمله مهاجرت از Rollup 2 به Rollup 4. بعد گزارشهای باز سازگاری یکییکی بسته شد و در ادامه از دادهٔ APM محیط production استفاده شد تا درخواستهایی که هنوز شکست میخوردن دستهبندی و ریشهیابی بشن.
یکی از دستههای پرتکرار، چکهای محیطی نود بود. خط لوله از قدیم process.env.NODE_ENV رو با مقدار production جایگزین میکرد تا Rollup بتونه شاخههای مخصوص توسعه رو دور بندازه:
if (process.env.NODE_ENV !== 'production') {
enableDevelopmentWarnings();
}ولی پکیجها همیشه دقیقاً همین شکل رو نمینویسن؛ حالا دسترسی از راه globalThis و نوشتن با براکت هم پوشش داده میشه، در حالی که کلیدهای رشتهای بیربط دیگه اشتباهی جایگزین نمیشن. یه باگ ظریف دیگه هم فایلهای کنار ماژول بود: پکیجهایی مثل QuickJS و Box2D-WASM فایل wasm رو نسبت به import.meta.url پیدا میکنن و بعد از باندل شدن اون آدرس به مسیر جدید اشاره میکرد و ۴۰۴ میگرفت. حالا با هوک resolveImportMeta آدرس اصلی npm هر ماژول حفظ میشه.
سنگینترین بخش کار سازگاری کامنجیاس بود: نام exportها باید بهصورت ایستا تشخیص داده بشن، حتی وقتی از هلپر __exportStar تایپاسکریپت میان یا داخل شاخههای شرطی تعریف شدن — برای همین حالا خروجی دو تا لکسر با هم ترکیب میشه. ضمناً بیلد دیگه به محض دیدن یه ماژول داخلی پشتیبانینشدهٔ نود متوقف نمیشه؛ اول tree-shaking اجرا میشه و فقط اگه اون ماژول تو خروجی موند خطا برمیگرده.
برای هزینهٔ اجرا هم مینیفای نهایی باندلهای ESM از Terser به esbuild منتقل شده و متادیتای هر پکیج خارجی فقط یه بار گرفته و بین همهٔ فایلهاش استفاده میشه. تو پست اومده که چیزی که هنوز جواب نمیده عمدتاً سه دستهست: پکیجهای فقط-سروری، پکیجهای ریاکت نیتیو که JSX خام منتشر میکنن، و پکیجهایی که به بیلد اختصاصی خود پروژه نیاز دارن.
نکات کلیدی:
- بکاند jsDelivr به ESM بومی منتقل و Rollup از نسخهٔ ۲ به ۴ ارتقا پیدا کرد
- جایگزینی NODE_ENV حالا حالتهای globalThis و براکتی رو هم میگیره
- با هوک resolveImportMeta فایلهای کنار ماژول مثل wasm درست پیدا میشن
- تشخیص exportهای کامنجیاس با ترکیب دو لکسر و پشتیبانی از __exportStar
- مینیفای نهایی باندلهای ESM با esbuild بهجای Terser
- JSX خام، پکیجهای فقط-سروری و بیلدهای اختصاصی هنوز پشتیبانی نمیشن




