ctx.importAsync()
Tải động module ESM hoặc CSS theo URL, phù hợp với mọi kịch bản RunJS. Khi cần thư viện ESM bên thứ ba sử dụng ctx.importAsync(), thư viện UMD/AMD sử dụng ctx.requireAsync(); khi truyền địa chỉ .css sẽ tải và inject style.
Kịch bản áp dụng
Định nghĩa kiểu
Tham số
Giá trị trả về
- Object namespace của module sau khi parse (giá trị resolve của Promise).
Giải thích về định dạng URL
- ESM và CSS: Ngoài module ESM, còn hỗ trợ tải CSS (truyền URL
.css, sau khi tải sẽ inject vào page). - Định dạng rút gọn: Khi chưa cấu hình, sử dụng https://esm.sh làm prefix CDN. Ví dụ
vue@3.4.0thực tế yêu cầuhttps://esm.sh/vue@3.4.0. - ?deps: Thư viện phụ thuộc React (như
@dnd-kit/core,react-big-calendar) cần thêm?deps=react@18.2.0,react-dom@18.2.0để tránh xung đột với instance React của page dẫn đến Invalid hook call. - CDN tự host: Có thể chỉ định service nội bộ hoặc tự host qua biến môi trường:
- ESM_CDN_BASE_URL: Địa chỉ cơ sở của ESM CDN (mặc định
https://esm.sh) - ESM_CDN_SUFFIX: Hậu tố tùy chọn (như
/+esmcủa jsDelivr) - Tham khảo dịch vụ tự host: nocobase/esm-server
- ESM_CDN_BASE_URL: Địa chỉ cơ sở của ESM CDN (mặc định
Khác biệt với ctx.requireAsync()
- ctx.importAsync(): Tải module ESM, trả về namespace module, phù hợp với thư viện hiện đại (Vue, dayjs, v.v. build ESM).
- ctx.requireAsync(): Tải script UMD/AMD hoặc gắn vào global, thường dùng cho các thư viện UMD như ECharts, FullCalendar. Nếu thư viện cũng cung cấp ESM, ưu tiên dùng
ctx.importAsync().
Ví dụ
Cách sử dụng cơ bản
Dùng để minh họa cách sử dụng cơ bản nhất để tải động module ESM và CSS theo tên gói hoặc URL đầy đủ.
Ví dụ ECharts
Sử dụng ECharts để vẽ biểu đồ tổng quan bán hàng với cột và đường.
Ví dụ Tabulator
Minh họa render bảng dữ liệu hỗ trợ phân trang và sự kiện click hàng trong block qua Tabulator.
Ví dụ FullCalendar (ESM)
Hiển thị cách tải FullCalendar và plugin của nó theo dạng ESM, và render lịch month view cơ bản.
Ví dụ kéo thả đơn giản dnd-kit
Sử dụng @dnd-kit/core để thực hiện ví dụ kéo thả tối thiểu kéo Box vào vùng đích trong block.
Ví dụ này chỉ phụ thuộc @dnd-kit/core, kéo Box vào vùng được chỉ định để trigger thông báo, minh họa cách thực hiện tương tác kéo thả đơn giản nhất kết hợp ctx.importAsync + React trong RunJS.
Ví dụ danh sách có thể sắp xếp dnd-kit
Dựa trên core / sortable / utilities của dnd-kit để thực hiện danh sách sắp xếp dọc hỗ trợ kéo thả để sắp xếp lại.
Ví dụ này dựa trên @dnd-kit/core, @dnd-kit/sortable và @dnd-kit/utilities, thực hiện danh sách có thể kéo thả sắp xếp, và sau khi kết thúc kéo thả cập nhật thứ tự và thông báo "List reordered".
Ví dụ react-big-calendar
Qua react-big-calendar và localization date-fns, render component lịch hỗ trợ hiển thị sự kiện trong block hiện tại.
Ví dụ frappe-gantt
Sử dụng frappe-gantt để render gantt chart hiển thị thời gian bắt đầu/kết thúc và tiến độ của task.
Ví dụ @asseinfo/react-kanban
Sử dụng @asseinfo/react-kanban để render kanban cơ bản chứa các column như Backlog / Doing trong block.
Lưu ý
- Phụ thuộc vào mạng bên ngoài hoặc CDN, môi trường nội bộ cần cấu hình ESM_CDN_BASE_URL trỏ đến service tự host.
- Khi thư viện cung cấp cả ESM và UMD, ưu tiên dùng
ctx.importAsync()để có ngữ nghĩa module tốt hơn. - Thư viện phụ thuộc React phải thêm
?deps=react@18.2.0,react-dom@18.2.0, phiên bản phải đồng nhất với React của page, nếu không có thể báo Invalid hook call.
Liên quan
- ctx.requireAsync(): Tải UMD/AMD hoặc script gắn vào global, phù hợp với các thư viện UMD như ECharts, FullCalendar
- ctx.render(): Render nội dung vào container

