رفتن به محتوا

Vite 8.3.5: انتشاری برای مستحکم‌کردن bundled-dev، به‌همراه اصلاحات import map و optimizer

۵ دقیقه مطالعه
vite
tooling
rolldown

Vite 8.3.5 در ۲۱ اکتبر در صفحه انتشارهای GitHub با برچسب Latest منتشر شد. یک patch است، اما patch بزرگی: یادداشت‌های انتشار حدود بیست اصلاح، یک بهبود کارایی، یک مهاجرت lint و چند refactor را فهرست می‌کنند. موضوع اصلی از برچسب‌های scope پیداست: هفت مورد با bundled-dev برچسب خورده‌اند؛ حالت آزمایشی‌ای که در توسعه به‌جای ماژول‌های جدا، یک bundle از Rolldown سرو می‌کند. اگر این حالت را فعال کرده‌اید، این انتشار را بخوانید. اگر نه، چند اصلاح دیگر همچنان به شما مربوط می‌شود.

bundled dev: چه چیزهایی اصلاح شد

یادداشت‌ها این موارد bundled-dev را فهرست می‌کنند:

  • server.origin حالا روی URLهای asset اعمال می‌شود (#23683).
  • صفحه fallback کدگذاری UTF-8 را اعلام می‌کند (#23846).
  • build.chunkImportMap در این حالت نادیده گرفته می‌شود (#23685).
  • مقادیر import.meta.env تعریف‌شده توسط کاربر در شیء import.meta.env قرار می‌گیرند (#23713).
  • stack traceهای ارسال‌شده از طریق source mapهای bundle نگاشت می‌شوند (#23741).
  • فایل‌های خروجی سرو‌شده نرمال‌سازی می‌شوند (#23684).
  • انتشار HMR در ماژول‌هایی که دیگر import نمی‌شوند متوقف می‌شود (#23839).

مورد آخر توجه می‌خواهد. ادامه‌یافتن انتشار از میان ماژولی که دیگر کسی آن را import نمی‌کند، همان باگی است که به‌شکل به‌روزرسانی کهنه یا reloadی ظاهر می‌شود که باید hot update می‌بود. یادداشت‌ها فقط عنوان را می‌دهند، پس بیشتر از آن ادعا نمی‌کنم. اصلاح import.meta.env هم مشابه است: اگر مقادیر تعریف‌شده را از آن شیء می‌خوانید، نبودن یک کلید در bundled dev تفاوتی مختص این حالت بود که ارزش آزمون دوباره دارد.

رویکرد عملی برای تیمی که از این حالت استفاده می‌کند: نسخه minor را pin کنید، سرور توسعه پیش‌فرض را یک اسکریپت آن‌طرف‌تر نگه دارید و smoke testها را روی هر دو اجرا کنید. یادداشت‌ها نام این حالت را می‌آورند اما نمی‌گویند چگونه فعال می‌شود و من مستندات آن را نخواندم؛ برای کلید فعلی، راهنمای Vite را ببینید.

chunk import map

دو اصلاح build به chunk import mapها مربوط است:

  • نبودن chunk import map حالا مدیریت می‌شود (#23777).
  • وابستگی‌های preload هنگام hash کردن chunk import map لحاظ می‌شوند (#23793).

مورد دوم برای درستی cache مهم است. hashی که وابستگی یک chunk را نادیده بگیرد می‌تواند URLی کهنه در map باقی بگذارد، در حالی که فایل پشت آن تغییر کرده است. باز هم یادداشت‌ها فقط عنوان می‌دهند، نه سناریوی خرابی. توصیه محتاطانه: اگر build.chunkImportMap را فعال کرده‌اید، بعد از ارتقا دوباره build بگیرید و پیش از انتشار map و نام chunkها را بین 8.3.4 و 8.3.5 مقایسه کنید.

Resolver، CSS و سرور

اصلاحات کوچک‌تری که می‌تواند روی پروژه‌های معمولی اثر بگذارد:

  • subpath importهای دارای بیش از یک # حالا resolve می‌شوند (#23631) و resolve.exports به 2.0.4 رفت (#23739). اگر از imports در package.json با کلیدهای غیرمعمول استفاده می‌کنید، به شما مربوط است.
  • علامت % به‌صورت لفظی داخل url() در CSS دیگر خطا نمی‌دهد (#23676).
  • سرور base را فقط وقتی حذف می‌کند که مسیر با یک segment کامل مطابقت داشته باشد (#23641). برداشت من این است که با base: "/app" درخواست /application.js دیگر مثل /lication.js رفتار نمی‌شود. یادداشت‌ها این را صریح نمی‌گویند؛ اگر زیر یک sub-path سرو می‌کنید آزمایشش کنید.
  • خطاهای socket در درخواست‌های upgrade که سرور HMR آن‌ها را برنمی‌دارد مدیریت می‌شود (#23728). این برای پروژه‌هایی است که کنار Vite endpoint WebSocket خودشان را دارند.

Optimizer

optimizer وابستگی‌ها چهار تغییر گرفت که بیشتر به تشخیص lockfile مربوط است:

  • برای hash lockfile به yarn.lock برمی‌گردد (#23667) و در این fallback بررسی پوشه patches را رد می‌کند (#23725).
  • hash پوشه patches را برای lockfileهای nub رد می‌کند (#23761).
  • importهای oxc.jsxInject را اسکن می‌کند (#23758).

hash مربوط به lockfile تعیین می‌کند وابستگی‌های pre-bundle‌شده چه زمانی باطل شوند؛ پس hash غلط یا گم‌شده یا به بهینه‌سازی دوباره بی‌دلیل می‌انجامد یا به وابستگی کهنه. اصلاح oxc.jsxInject اگر از این گزینه برای تزریق import استفاده می‌کنید مهم است: استنباط من این است که چنین importهایی برای کشف وابستگی اسکن نمی‌شدند، و نتیجه‌اش reload دیرهنگام «new dependency found» در dev است.

کارایی، lint و بخش‌های داخلی

تنها تغییر کارایی: SSR حالا source mapهای inline را بدون regular expression استخراج می‌کند (#23775). عددی منتشر نشده، پس پیش از انتظار هر بهبودی روی اپ خودتان اندازه بگیرید.

مواردی که ممکن است در مخزن یا diff یک lockfile ببینید:

  • خود Vite به Oxlint مهاجرت کرد (#23746).
  • @vercel/detect-agent با std-env جایگزین شد (#23744) که یک وابستگی در گراف را عوض می‌کند.
  • چند refactor در سرور توسعه، مدیریت ModuleURL و BrowserURL را یکپارچه کردند (#23790، #23791، #23815، #23828). داخلی‌اند، اما مسیرهای مشترک resolve کردن importها و تبدیل‌های HTML هستند؛ پس اگر پسرفتی باشد احتمالاً همان‌جا دیده می‌شود.

نکات ارتقا

  1. در یک branch ارتقا دهید و build تولیدی بگیرید. نام chunkها و خروجی import map را با آخرین build سالم مقایسه کنید.
  2. اگر از bundled dev استفاده می‌کنید، HMR را بعد از حذف یک import در میانه نشست آزمایش کنید.
  3. اگر زیر base سفارشی سرو می‌کنید، مسیری را درخواست کنید که فقط با همان کاراکترهای base شروع می‌شود.
  4. اگر از Yarn استفاده می‌کنید، یک بار node_modules/.vite را پاک کنید، چون fallback hash مربوط به lockfile تازه است. این توصیه‌ای محتاطانه است و یادداشت‌ها آن را الزامی نکرده‌اند.

در صفحه انتشارها همچنین Vite 6.4.5 (۲۱ اکتبر) هست که جز اشاره به changelog یادداشتی ندارد، و create-vite@9.3.1 (۲۰ اکتبر) که طبق عنوان commit فعلاً TypeScript را روی v6 pin می‌کند. این به نوشته دیروز درباره بازگشت از TypeScript 7 ربط دارد.

منابع