This commit is contained in:
vastxie
2025-05-31 02:28:46 +08:00
parent 0f7adc5c65
commit 86e2eecc1f
1808 changed files with 183083 additions and 86701 deletions

View File

@@ -0,0 +1,25 @@
import boxen from 'boxen'
import picocolors from 'picocolors'
import type { Plugin } from 'vite'
export default function appInfo(): Plugin {
return {
name: 'appInfo',
apply: 'serve',
async buildStart() {
const { bold, green, cyan, bgGreen, underline } = picocolors
// eslint-disable-next-line no-console
console.log(
boxen(
`${bold(green(`${bgGreen('Fantastic-admin')} 驱动`))}\n\n${underline('https://fantastic-admin.github.io')}\n\n当前使用${cyan('基础版')}`,
{
padding: 1,
margin: 1,
borderStyle: 'double',
textAlignment: 'center',
},
),
)
},
}
}

View File

@@ -0,0 +1,33 @@
import fs from 'node:fs'
import dayjs from 'dayjs'
import archiver from 'archiver'
import type { Plugin } from 'vite'
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
export default function createArchiver(env): Plugin {
const { VITE_BUILD_ARCHIVE } = env
let outDir: string
return {
name: 'vite-plugin-archiver',
apply: 'build',
configResolved(resolvedConfig) {
outDir = resolvedConfig.build.outDir
},
async closeBundle() {
if (['zip', 'tar'].includes(VITE_BUILD_ARCHIVE)) {
await sleep(1000)
const archive = archiver(VITE_BUILD_ARCHIVE, {
...(VITE_BUILD_ARCHIVE === 'zip' && { zlib: { level: 9 } }),
...(VITE_BUILD_ARCHIVE === 'tar' && { gzip: true, gzipOptions: { level: 9 } }),
})
const output = fs.createWriteStream(`${outDir}.${dayjs().format('YYYY-MM-DD-HH-mm-ss')}.${VITE_BUILD_ARCHIVE === 'zip' ? 'zip' : 'tar.gz'}`)
archive.pipe(output)
archive.directory(outDir, false)
archive.finalize()
}
},
}
}

View File

@@ -0,0 +1,15 @@
import autoImport from 'unplugin-auto-import/vite'
export default function createAutoImport() {
return autoImport({
imports: [
'vue',
'vue-router',
'pinia',
],
dts: './src/types/auto-imports.d.ts',
dirs: [
'./src/utils/composables/**',
],
})
}

11
admin/vite/plugins/banner.ts Executable file
View File

@@ -0,0 +1,11 @@
import banner from 'vite-plugin-banner'
export default function createBanner() {
return banner(`
/**
* 由 Fantastic-admin 提供技术支持
* Powered by Fantastic-admin
* https://fantastic-admin.github.io
*/
`)
}

View File

@@ -0,0 +1,12 @@
import components from 'unplugin-vue-components/vite'
export default function createComponents() {
return components({
dirs: [
'src/components',
'src/layouts/ui-kit',
],
include: [/\.vue$/, /\.vue\?vue/, /\.tsx$/],
dts: './src/types/components.d.ts',
})
}

View File

@@ -0,0 +1,24 @@
import { compression } from 'vite-plugin-compression2'
import type { PluginOption } from 'vite'
export default function createCompression(env, isBuild) {
const plugin: (PluginOption | PluginOption[])[] = []
if (isBuild) {
const { VITE_BUILD_COMPRESS } = env
const compressList = VITE_BUILD_COMPRESS.split(',')
if (compressList.includes('gzip')) {
plugin.push(
compression(),
)
}
if (compressList.includes('brotli')) {
plugin.push(
compression({
exclude: [/\.(br)$/, /\.(gz)$/],
algorithm: 'brotliCompress',
}),
)
}
}
return plugin
}

View File

@@ -0,0 +1,5 @@
import TurboConsole from 'unplugin-turbo-console/vite'
export default function createConsole() {
return TurboConsole()
}

6
admin/vite/plugins/devtools.ts Executable file
View File

@@ -0,0 +1,6 @@
import VueDevTools from 'vite-plugin-vue-devtools'
export default function createDevtools(env) {
const { VITE_OPEN_DEVTOOLS } = env
return VITE_OPEN_DEVTOOLS === 'true' && VueDevTools()
}

50
admin/vite/plugins/index.ts Executable file
View File

@@ -0,0 +1,50 @@
import vueLegacy from '@vitejs/plugin-legacy'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import type { PluginOption } from 'vite'
import appInfo from './app-info'
import createArchiver from './archiver'
import createAutoImport from './auto-import'
import createBanner from './banner'
import createComponents from './components'
import createCompression from './compression'
import createConsole from './console'
import createDevtools from './devtools'
import createLayouts from './layouts'
import createMinify from './minify'
import createMock from './mock'
import createPages from './pages'
import createSvgIcon from './svg-icon'
import createUnocss from './unocss'
export default function createVitePlugins(viteEnv, isBuild = false) {
const vitePlugins: (PluginOption | PluginOption[])[] = [
appInfo(),
vue(),
vueJsx(),
vueLegacy({
renderLegacyChunks: false,
modernPolyfills: [
'es.array.at',
'es.array.find-last',
],
}),
]
vitePlugins.push(createDevtools(viteEnv))
vitePlugins.push(createAutoImport())
vitePlugins.push(createComponents())
vitePlugins.push(createUnocss())
vitePlugins.push(createSvgIcon(isBuild))
vitePlugins.push(createMock(viteEnv, isBuild))
vitePlugins.push(createLayouts())
vitePlugins.push(createPages())
vitePlugins.push(...createCompression(viteEnv, isBuild))
vitePlugins.push(createArchiver(viteEnv))
vitePlugins.push(createConsole())
vitePlugins.push(createBanner())
if (isBuild) {
vitePlugins.push(createMinify())
}
return vitePlugins
}

7
admin/vite/plugins/layouts.ts Executable file
View File

@@ -0,0 +1,7 @@
import Layouts from 'vite-plugin-vue-meta-layouts'
export default function createLayouts() {
return Layouts({
defaultLayout: 'index',
})
}

View File

@@ -0,0 +1,40 @@
import type { PluginOption } from 'vite'
/**
* 配置代码混淆
* @returns {PluginOption} Vite插件
*/
export default function createMinify(): PluginOption {
return {
name: 'vite:minify-config',
enforce: 'post',
apply: 'build',
config(config) {
// 确保build配置存在
config.build = config.build || {}
// 配置Terser混淆选项
config.build.minify = 'terser'
config.build.terserOptions = {
compress: {
// 生产环境去除console
drop_console: true,
drop_debugger: true,
},
format: {
// 去除注释
comments: false,
},
mangle: {
// 混淆变量名
toplevel: true,
safari10: true,
},
// 混淆类名
keep_classnames: false,
// 混淆函数名
keep_fnames: false,
}
}
}
}

11
admin/vite/plugins/mock.ts Executable file
View File

@@ -0,0 +1,11 @@
import { vitePluginFakeServer } from 'vite-plugin-fake-server'
export default function createMock(env, isBuild) {
const { VITE_BUILD_MOCK } = env
return vitePluginFakeServer({
logger: !isBuild,
include: 'src/mock',
infixName: false,
enableProd: isBuild && VITE_BUILD_MOCK === 'true',
})
}

10
admin/vite/plugins/pages.ts Executable file
View File

@@ -0,0 +1,10 @@
import Pages from 'vite-plugin-pages'
export default function createPages() {
return Pages({
dirs: 'src/views',
exclude: [
'**/components/**/*.vue',
],
})
}

11
admin/vite/plugins/svg-icon.ts Executable file
View File

@@ -0,0 +1,11 @@
import path from 'node:path'
import process from 'node:process'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
export default function createSvgIcon(isBuild) {
return createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/')],
symbolId: 'icon-[dir]-[name]',
svgoOptions: isBuild,
})
}

5
admin/vite/plugins/unocss.ts Executable file
View File

@@ -0,0 +1,5 @@
import Unocss from 'unocss/vite'
export default function createUnocss() {
return Unocss()
}