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 هستند؛ پس اگر پسرفتی باشد احتمالاً همانجا دیده میشود.
نکات ارتقا
- در یک branch ارتقا دهید و build تولیدی بگیرید. نام chunkها و خروجی import map را با آخرین build سالم مقایسه کنید.
- اگر از bundled dev استفاده میکنید، HMR را بعد از حذف یک import در میانه نشست آزمایش کنید.
- اگر زیر
baseسفارشی سرو میکنید، مسیری را درخواست کنید که فقط با همان کاراکترهای base شروع میشود. - اگر از Yarn استفاده میکنید، یک بار
node_modules/.viteرا پاک کنید، چون fallback hash مربوط به lockfile تازه است. این توصیهای محتاطانه است و یادداشتها آن را الزامی نکردهاند.
در صفحه انتشارها همچنین Vite 6.4.5 (۲۱ اکتبر) هست که جز اشاره به changelog یادداشتی ندارد، و create-vite@9.3.1 (۲۰ اکتبر) که طبق عنوان commit فعلاً TypeScript را روی v6 pin میکند. این به نوشته دیروز درباره بازگشت از TypeScript 7 ربط دارد.