diff --git a/src/main.ts b/src/main.ts index 4903bed..5d4dd21 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,35 +1,18 @@ import './assets/styles'; -import { createHead } from '@unhead/vue'; -import { setupEruda } from './plugins/eruda'; -import { setupPinia } from './plugins/pinia'; -import { setupPrimeVue } from './plugins/primevue'; -import { setupRouter } from './plugins/router'; -import { setupVueI18n } from './plugins/vue-i18n'; - import App from './App.vue'; async function init() { - if ((import.meta.env.MODE === 'development' || 1 === 1) && 0) { - await setupEruda(); + const app = createApp(App); + { + // https://github.com/antfu-collective/vitesse/blob/47618e72dfba76c77b9b85b94784d739e35c492b/src/modules/README.md + type UserPluginContext = { app: import('vue').App }; + type UserPlugin = (ctx: UserPluginContext) => void; + Object.values(import.meta.glob<{ install: UserPlugin }>('./plugins/**.ts', { eager: true })).forEach((i) => + i.install?.({ app }), + ); } - const app = createApp(App).use(createHead()); - - app.config.errorHandler = (error, instance, info) => { - console.error('Global error:', error); - console.error('Component:', instance); - console.error('Error Info:', info); - // 这里你可以: - // 1. 发送错误到日志服务 - // 2. 显示全局错误提示 - // 3. 进行错误分析和处理 - }; - setupPinia(app); - setupVueI18n(app); - setupPrimeVue(app); - setupRouter(app); - app.config.globalProperties.$__DEV__ = $__DEV__; app.mount('#app'); diff --git a/src/plugins/_/_.ts b/src/plugins/_/_.ts new file mode 100644 index 0000000..cc39c57 --- /dev/null +++ b/src/plugins/_/_.ts @@ -0,0 +1,14 @@ +import { createHead } from '@unhead/vue'; + +export function install({ app }: { app: import('vue').App }) { + app.use(createHead()); + app.config.errorHandler = (error, instance, info) => { + console.error('Global error:', error); + console.error('Component:', instance); + console.error('Error Info:', info); + // 这里你可以: + // 1. 发送错误到日志服务 + // 2. 显示全局错误提示 + // 3. 进行错误分析和处理 + }; +} diff --git a/src/plugins/eruda/index.ts b/src/plugins/eruda/index.ts index 9859031..c8914d1 100644 --- a/src/plugins/eruda/index.ts +++ b/src/plugins/eruda/index.ts @@ -1,12 +1,14 @@ -export async function setupEruda() { - // TODO: https://github.com/hu3dao/vite-plugin-debug/ - // https://eruda.liriliri.io/zh/docs/#快速上手 - await import('eruda').then(({ default: eruda }) => { - eruda.init({ - defaults: { - transparency: 0.9, - }, +export function install() { + if ((import.meta.env.MODE === 'development' || 1 === 1) && 0) { + // TODO: https://github.com/hu3dao/vite-plugin-debug/ + // https://eruda.liriliri.io/zh/docs/#快速上手 + import('eruda').then(({ default: eruda }) => { + eruda.init({ + defaults: { + transparency: 0.9, + }, + }); + /* eruda.show(); */ }); - // eruda.show(); - }); + } } diff --git a/src/plugins/pinia/index.ts b/src/plugins/pinia/index.ts index 3ea2a42..e4db192 100644 --- a/src/plugins/pinia/index.ts +++ b/src/plugins/pinia/index.ts @@ -1,7 +1,7 @@ import { PiniaColada } from '@pinia/colada'; import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'; -export function setupPinia(app: import('vue').App) { +export function install({ app }: { app: import('vue').App }) { app.use(createPinia().use(piniaPluginPersistedstate)); app.use(PiniaColada, {}); } diff --git a/src/plugins/primevue/index.ts b/src/plugins/primevue/index.ts index e1ec536..f8ea859 100644 --- a/src/plugins/primevue/index.ts +++ b/src/plugins/primevue/index.ts @@ -6,7 +6,7 @@ import Aura from '@primevue/themes/aura'; import zhCN from 'primelocale/zh-CN.json'; import PrimeVue from 'primevue/config'; -export function setupPrimeVue(app: import('vue').App) { +export function install({ app }: { app: import('vue').App }) { app.use(PrimeVue, { locale: { ...zhCN['zh-CN'], diff --git a/src/plugins/router/index.ts b/src/plugins/router/index.ts index ad2b5e5..8af5701 100644 --- a/src/plugins/router/index.ts +++ b/src/plugins/router/index.ts @@ -14,14 +14,14 @@ router.onError((error) => { console.debug('🚨 [router error]: ', error); }); -function setupRouter(app: import('vue').App) { +export { router }; +export function install({ app }: { app: import('vue').App }) { app // Register the plugin before the router .use(DataLoaderPlugin, { router }) // adding the router will trigger the initial navigation .use(router); } -export { router, setupRouter }; // ======================================================================== // =========================== Router Guards ============================== // ======================================================================== diff --git a/src/plugins/vue-i18n/index.ts b/src/plugins/vue-i18n/index.ts index e873c59..bd2f6e9 100644 --- a/src/plugins/vue-i18n/index.ts +++ b/src/plugins/vue-i18n/index.ts @@ -7,7 +7,7 @@ import { createI18n } from 'vue-i18n'; import messages from '@intlify/unplugin-vue-i18n/messages'; console.debug(`messages :>> `, messages); -export function setupVueI18n(app: import('vue').App) { +export function install({ app }: { app: import('vue').App }) { app.use( // https://vue-i18n.intlify.dev/guide/essentials/started.html#registering-the-i18n-plugin createI18n({