20:16:19 6/3/2024 - 0 views -Programming
Khi mình deloy ứng dụng Vue sử dụng Vite để build ra các bundle, mọi thứ diễn ra bình thường, nhưng điều bất thường sẽ xảy ra nếu như mà mình thường xuyên phải fix lỗi hoặc phát triển thêm tính năng và deloy (build) lại, ở phía người dùng sẽ bị lỗi, ví dụ như Failed to fetch dynamically imported module.
Khi mình import một route hoặc component một cách động, trong quá trình build, nó tạo ra một chunk/bundl riêng biệt. Mặc định, tên của các chunk được mã hóa dựa trên nội dung của chúng – Ví dụ: Overview.abc123.js. Nếu mình không thay đổi mã của component, mã hash vẫn giữ nguyên. Nhưng nếu mã của component thay đổi, mã hash cũng thay đổi – Ví dụ: Overview.32ab1c.js. Điều này rất tốt cho việc lưu trữ cache.
Dưới đây là vấn đề xảy ra khi gặp lỗi này:
Đó là lý do tại sao các lỗi này liên quan đến việc triển khai. Một cách để sửa chữa là không sử dụng các route được tải lười (lazy loaded routes), nhưng đó không phải là một giải pháp tốt khi bạn có nhiều route nặng - điều này sẽ làm cho bundle chính của bạn trở nên lớn.
Cách khắc phục
router.onError((error, to) => {
if (error.message.includes('Failed to fetch dynamically imported module') || error.message.includes("Importing a module script failed")) {
window.location = to.fullPath
}
})
Chắc mình không giải thích gì nhiều, vì nhìn code các bạn đã có thể hiểu rồi, ta lắng xử lí sự kiện ở router nếu có lỗi với các text như trên thì chứng tỏ là hệ thống của chúng ta đã được build mới, lúc này ta phải điều hướng bằng cách dùng window.location thôi.
Chúc bạn thành công !