import { dirname, resolve } from 'node:path' import process from 'node:process' import { fileURLToPath } from 'node:url' import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite' import legacy from '@vitejs/plugin-legacy' import vue from '@vitejs/plugin-vue' import UnoCSS from 'unocss/vite' import { loadEnv } from 'vite' import viteCompression from 'vite-plugin-compression' import { mockDevServerPlugin } from 'vite-plugin-mock-dev-server' import { VitePWA } from 'vite-plugin-pwa' import Sitemap from 'vite-plugin-sitemap' import VueDevTools from 'vite-plugin-vue-devtools' import { createViteVConsole } from './vconsole' export function createVitePlugins(mode: string) { const env = loadEnv(mode, process.cwd()) return [ vue({ template: { compilerOptions: { // 注册自定义组件micro-app 防止控制台警告 isCustomElement: tag => tag.startsWith('micro-app'), }, }, }), // https://github.com/jbaubree/vite-plugin-sitemap Sitemap({ outDir: `./dist/${env.VITE_APP_OUT_DIR}`, }), // https://github.com/pengzhanbo/vite-plugin-mock-dev-server mockDevServerPlugin(), // 生产环境 gzip 压缩资源 viteCompression({ algorithm: 'gzip', // 文件大于10240b(10kb)时才压缩文件 threshold: 10240, // 禁止在控制台输出压缩结果 verbose: false, // 压缩完文件后删除源文件 deleteOriginFile: false, }), // https://github.com/intlify/bundle-tools/tree/main/packages/unplugin-vue-i18n VueI18nPlugin({ // locale messages resource pre-compile option include: resolve(dirname(fileURLToPath(import.meta.url)), '../../src/locales/**'), }), legacy({ targets: ['defaults', 'not IE 11'], }), // https://github.com/antfu/unocss // see uno.config.ts for config UnoCSS(), // https://github.com/vadxq/vite-plugin-vconsole createViteVConsole(mode), // https://github.com/vuejs/devtools-next VueDevTools(), // https://github.com/antfu/vite-plugin-pwa VitePWA({ registerType: 'autoUpdate', includeAssets: ['favicon.svg', 'safari-pinned-tab.svg'], manifest: { name: 'af-mobile-client-vue3', short_name: 'af-mobile-client-vue3', theme_color: '#ffffff', icons: [ { src: '/pwa-192x192.png', sizes: '192x192', type: 'image/png', }, { src: '/pwa-512x512.png', sizes: '512x512', type: 'image/png', }, { src: '/pwa-512x512.png', sizes: '512x512', type: 'image/png', purpose: 'any maskable', }, ], }, }), ] }