mirror of
https://github.com/vastxie/99AI.git
synced 2025-11-11 11:13:43 +08:00
v4.3.0
This commit is contained in:
25
admin/vite/plugins/app-info.ts
Normal file
25
admin/vite/plugins/app-info.ts
Normal 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',
|
||||
},
|
||||
),
|
||||
)
|
||||
},
|
||||
}
|
||||
}
|
||||
33
admin/vite/plugins/archiver.ts
Normal file
33
admin/vite/plugins/archiver.ts
Normal 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()
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
15
admin/vite/plugins/auto-import.ts
Executable file
15
admin/vite/plugins/auto-import.ts
Executable 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
11
admin/vite/plugins/banner.ts
Executable 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
|
||||
*/
|
||||
`)
|
||||
}
|
||||
12
admin/vite/plugins/components.ts
Executable file
12
admin/vite/plugins/components.ts
Executable 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',
|
||||
})
|
||||
}
|
||||
24
admin/vite/plugins/compression.ts
Executable file
24
admin/vite/plugins/compression.ts
Executable 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
|
||||
}
|
||||
5
admin/vite/plugins/console.ts
Normal file
5
admin/vite/plugins/console.ts
Normal 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
6
admin/vite/plugins/devtools.ts
Executable 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
50
admin/vite/plugins/index.ts
Executable 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
7
admin/vite/plugins/layouts.ts
Executable file
@@ -0,0 +1,7 @@
|
||||
import Layouts from 'vite-plugin-vue-meta-layouts'
|
||||
|
||||
export default function createLayouts() {
|
||||
return Layouts({
|
||||
defaultLayout: 'index',
|
||||
})
|
||||
}
|
||||
40
admin/vite/plugins/minify.ts
Normal file
40
admin/vite/plugins/minify.ts
Normal 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
11
admin/vite/plugins/mock.ts
Executable 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
10
admin/vite/plugins/pages.ts
Executable 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
11
admin/vite/plugins/svg-icon.ts
Executable 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
5
admin/vite/plugins/unocss.ts
Executable file
@@ -0,0 +1,5 @@
|
||||
import Unocss from 'unocss/vite'
|
||||
|
||||
export default function createUnocss() {
|
||||
return Unocss()
|
||||
}
|
||||
Reference in New Issue
Block a user