bootstrap.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { createApp, watchEffect } from 'vue';
  2. import { $t } from '@vben/locales';
  3. import { preferences } from '@vben/preferences';
  4. import '@vben/styles';
  5. import '@vben/styles/antd';
  6. import { useTitle } from '@vueuse/core';
  7. import initAdapter from './adapter/setup';
  8. import App from './App.vue';
  9. import initDirective from './directive/setup';
  10. import initI18n from './locales/setup';
  11. import initRouter from './router';
  12. import initStores from './stores';
  13. export default async function bootstrap(space: string) {
  14. const app = createApp(App);
  15. // 国际化 i18n 配置
  16. await initI18n(app);
  17. // 适配器初始化(组件、表单组件)
  18. await initAdapter(app);
  19. // 注册指令
  20. await initDirective(app);
  21. // 配置 pinia-tore
  22. await initStores(app, { namespace: space });
  23. // 配置路由及守卫
  24. const router = await initRouter(app);
  25. // 初始化 tippy
  26. const { initTippy } = await import('@vben/common-ui/es/tippy');
  27. initTippy(app);
  28. // 配置Motion插件
  29. const { MotionPlugin } = await import('@vben/plugins/motion');
  30. app.use(MotionPlugin);
  31. // 动态更新标题
  32. watchEffect(() => {
  33. if (preferences.app.dynamicTitle) {
  34. const routeTitle = router.currentRoute.value.meta?.title;
  35. const pageTitle =
  36. (routeTitle ? `${$t(routeTitle)} - ` : '') + preferences.app.name;
  37. useTitle(pageTitle);
  38. }
  39. });
  40. app.mount('#app');
  41. }