diff --git a/apps/web-antd/src/app.vue b/apps/web-antd/src/app.vue
index bd70a5e83..e04a0c873 100644
--- a/apps/web-antd/src/app.vue
+++ b/apps/web-antd/src/app.vue
@@ -1,25 +1,27 @@
-
+
diff --git a/apps/web-antd/src/bootstrap.ts b/apps/web-antd/src/bootstrap.ts
index 6c9dccf19..7e19a71ea 100644
--- a/apps/web-antd/src/bootstrap.ts
+++ b/apps/web-antd/src/bootstrap.ts
@@ -17,6 +17,7 @@ import { initComponentAdapter } from './adapter/component';
import { initSetupVbenForm } from './adapter/form';
import App from './app.vue';
import { router } from './router';
+import { initPopupContext } from './utils/context';
async function bootstrap(namespace: string) {
// 初始化组件适配器
@@ -58,6 +59,9 @@ async function bootstrap(namespace: string) {
const { initTippy } = await import('@vben/common-ui/es/tippy');
initTippy(app);
+ // 初始化全局弹窗方法(静态API fallback, 防止路由守卫中访问undefined)
+ initPopupContext();
+
// 配置路由及路由守卫
app.use(router);
diff --git a/apps/web-antd/src/utils/context.tsx b/apps/web-antd/src/utils/context.tsx
index f7d5ca824..35afc11a0 100644
--- a/apps/web-antd/src/utils/context.tsx
+++ b/apps/web-antd/src/utils/context.tsx
@@ -1,6 +1,23 @@
import { defineComponent } from 'vue';
-import { App } from 'antdv-next';
+import { App, message, Modal, notification } from 'antdv-next';
+
+/**
+ * 初始化全局弹窗方法(静态API作为fallback)
+ * 在app.mount之前调用, 防止路由守卫等早期逻辑访问window.message时报错
+ * app.mount之后PopupContext会用带上下文的实例覆盖
+ */
+export function initPopupContext() {
+ if (!window.message) {
+ window.message = message;
+ }
+ if (!window.modal) {
+ window.modal = Modal;
+ }
+ if (!window.notification) {
+ window.notification = notification;
+ }
+}
/**
* 弹窗上下文