Integrating Vuex state management store into AEM frontend components.
Tích hợp Vuex vào AEM
Đặc thù AEM: một trang có thể chứa nhiều AEM component, mỗi component mount một instance Vue riêng (nhiều mount point độc lập). Vấn đề: làm sao các instance này chia sẻ chung state. Vuex giải quyết bằng một store singleton dùng chung.
Vấn đề nhiều mount point
Mỗi component là một new Vue(...) riêng. Nếu mỗi instance tự giữ state, mini cart không biết product list vừa thêm hàng. Truyền cùng một store vào mọi instance thì chúng chia sẻ chung dữ liệu.
Store singleton dùng chung
Tạo store một lần, export ra để mọi bootstrapper import cùng instance đó.
Bootstrapper inject store vào mọi instance
Mỗi mount point nhận cùng store qua option store.
Vì cùng một store object được truyền vào, mọi instance chia sẻ chung state. ProductList commit cart/addItem, MiniCart đọc cart/itemCount cập nhật ngay.
Khởi tạo state từ Sling Model
Dữ liệu server-side (user đã đăng nhập, locale, context path, endpoint) nên đẩy vào store lúc khởi tạo thay vì gọi API thừa. HTL serialize JSON, clientlib parse và commit vào store.
Lưu ý dùng context='scriptString' (hoặc thẻ script type application/json) để escape đúng khi nhúng JSON, tránh lỗi XSS và phá vỡ HTML.
Endpoint và context path
Không hardcode URL API. AEM chạy dưới context path (vd /content/site/vn). Lấy base path và endpoint từ Sling Model, lưu vào store, action dùng khi gọi servlet.
Author mode
Trong AEM Author, component có thể được thêm/xóa/refresh động qua editor. Lưu ý:
- Store singleton tồn tại theo vòng đời trang. Khi author chỉnh một component, AEM có thể chỉ refresh DOM của component đó, code mount lại cần idempotent (kiểm tra đã mount chưa, tránh tạo trùng instance).
- Tránh phụ thuộc thứ tự mount giữa các component. Khởi tạo state chung ở một nơi chạy sớm (page-level clientlib), không trong từng component.
Khi nào KHÔNG cần Vuex trong AEM
- Chỉ một AEM component Vue trên trang, state nội bộ: dùng props/events là đủ.
- Các component không chia sẻ state: không cần store chung.
Vuex thêm chi phí thiết lập và build. Chỉ dùng khi thật sự có state dùng chung xuyên nhiều mount point.