Hiệu năng: import nhẹ hơn, CSS gọn hơn và ít render lại hơn
Mới nhấtMột bản về hiệu năng. Mỗi thư mục component là một subpath của gói, các phần chỉ một số ứng dụng render được nạp lúc cần, YugenProvider để theme trong context riêng và biểu đồ không còn tính lại khi rê chuột. Trang Hiệu năng gom các thiết lập và số đo vào một chỗ. Dung lượng tính bằng gzip, đo trên bản build Vite 8.
- MớiImport theo subpath: mỗi thư mục component cũng là một đường dẫn của gói (
yugen-ui/Button,yugen-ui/Chart,yugen-ui/hooks…). Bản build production với Vite, Rollup, webpack và Next.js giữ nguyên dung lượng. Trong Node, test và dev server,import { Button }lần đầu nạp 14 module trong khoảng 60 ms thay vì 498 module trong khoảng 1.6 s. Với esbuild có code splitting, hãy import từ subpath.Xem - Mới
yugenHtmlAttributes()vàyugenThemeScript()đặt theme lên<html>trước lần vẽ đầu trong ứng dụng render ở server. Cả hai là hàm thường, chạy được trong Server Component của Next.js, import từyugen-uihoặcyugen-ui/YugenProvider/document.YugenProvider applyToDocumentgiờ ghi attribute trong layout effect, trước khi trình duyệt vẽ.Xem - Mới
useYugenTheme()({ theme, brand, dir }) vàuseYugenLocale(): component đọc một trong hai không render lại khi cái còn lại đổi.Xem - Mới
useElementSize({ enabled }): vớifalse, hook không đo gì và không thêm ResizeObserver.Xem - MớiTrang Hiệu năng: đường dẫn import cho từng bundler, phần nạp lúc cần, dung lượng CSS, render lại và biểu đồ, kèm số đo.Xem
- Cải tiến
YugenProvidercảnh báo một lần ở môi trường dev khi dùng propwithToasterđã deprecated. Template và docs giờ đặt rõ<Toaster />làm con;withToastervẫn còn dùng được đến 1.0.0.Xem - Cải tiến
withToasternạp Toaster sau lần render đầu ở client,toast()gọi trước đó vẫn hiện. Ứng dụng không bậtwithToasterkhông còn mang@radix-ui/react-toast:{ YugenProvider }từ 24.9 xuống 13.3 kB, một ứng dụng sáu component từ 38.0 xuống 31.1 kB. Cách nên dùng là đặt<Toaster />làm con của provider gốc.Xem - Cải tiếnBreadcrumb chỉ nạp menu của nút “…” khi
maxDisplayedItemsthu gọn mục (40.2 → 13.5 kB), StreamingMarkdown chỉ nạp thẻ chú thích khi văn bản có chú thích (49.3 → 27.3 kB). Nav không còn import Tooltip; Sidebar của AppShell gắn tooltip cho dạng rail (29.9 → 12.0 kB). Test mở menu hay thẻ ngay sau khi render cần chờ nó (findByRole).Xem - Cải tiếnĐổi theme chỉ render lại các component đọc theme: với 1 800 control và children giữ nguyên, mất 1.4 ms thay vì khoảng 66 ms.
messagesviết inline được so theo giá trị nhưdefaults, nên component cha render lại với cùng chuỗi không còn làm các control render lại.Xem - Cải tiếnComponent có variant (Button, Input, Badge, Card và 11 component khác) gộp class một lần cho mỗi tổ hợp props: render 1 000 Button không có
classNamenhanh hơn 44–53% ở server và trong trình duyệt, đổi lại khoảng 0.27 kB.buttonVariantsvà các hàm variant được export khác trả về chuỗi đã gộp.Xem - Cải tiếnRê chuột trên LineChart, AreaChart hay BarChart không còn tính lại cả biểu đồ: một bước hover từ 9.7 xuống 1.1 ms với 500 điểm và từ 39 xuống 1.1 ms với 2 000 điểm. LineChart 4 × 200 có marker giảm 30% markup, Sparkline có
widthbằng số mount trong một lần render, không cần ResizeObserver. Pixel, bàn phím và nội dung cho trình đọc màn hình không đổi.Xem - Cải tiếnKeyframe nằm trong
@themenên Tailwind chỉ xuất những keyframe ứng dụng dùng: ứng dụng chỉ có Button dùngtheme-core.csstừ 20 keyframe còn 1 (9.17 → 8.86 kB).tokens.csslà CSS thuần,theme.cssimporttheme-core.cssthay vì chép lại (gói nhẹ đi 64 kB). Ứng dụng định nghĩa lại keyframe của thư viện (fade-in,sweep…) thì khai báo nó trong@theme.Xem - Cải tiếnCalendar không còn kèm locale tiếng Việt của date-fns: mỗi component ngày tháng nhẹ đi khoảng 2 kB trong ứng dụng tiếng Anh (
{ DatePicker }58.8 → 56.8 kB). Ứng dụng tiếng Việt vẫn có locale quamessagesVi.Xem - Cải tiếnCombobox và TagPicker không còn dùng cmdk: một listbox nhỏ có sẵn lo option đang chọn và bàn phím.
{ Combobox }từ 42.8 xuống 38.9 kB,{ TagPicker }từ 50.6 xuống 41.0 kB, và với 1 000 option mỗi lần nhấn phím mũi tên chỉ render lại hai option đổi trạng thái. TagPicker chỉ nạp Sortable khi córeorderable, tag đang có focus vẫn giữ focus khi Sortable nạp xong. Listbox lấy tên theo nhãn của Field (hoặcaria-labelcủa ô nhập). Option không còn thuộc tínhcmdk-*: test tìm[cmdk-item]trong hai component này nên tìmrole="option".Xem - Cải tiếnTheme Designer: mỗi phần (màu, hình dáng, mật độ và chữ, nền, chuyển động, glass) có bản xem trước riêng và kiểm tra nằm ngay cạnh control của nó; bản xem trước đầy đủ đặt light, dark và high contrast trên cùng một hàng. Ô font nhận tên font bất kỳ.Xem
- Sửa lỗiKiểu với TypeScript
module: "node16"/"nodenext": 72 export (BarChart, StreamingMarkdown, useDisclosure…) báo lỗi "has no exported member". CI giờ kiểm tra kiểu của mọi export từ một dự ánnodenext. - Sửa lỗi
readAppShellCookiechạy được trong React Server Component. Trước đây hàm nằm sau"use client"nên báo lỗi khi layout của Next.js gọi nó; hãy import từyugen-ui.Xem - Sửa lỗiCảnh báo deprecation viết bằng tiếng Anh và trỏ tới trang versioning thay vì URL
#/cũ, cookie của AppShell cósecuretrên trang https. JS trong gói không còn comment (JSDoc vẫn nằm trong file.d.ts): 1 238 → 1 132 kB chưa nén.Xem