plugins.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. import path from 'node:path'
  2. import process from 'node:process'
  3. import vueLegacy from '@vitejs/plugin-legacy'
  4. import vue from '@vitejs/plugin-vue'
  5. import vueJsx from '@vitejs/plugin-vue-jsx'
  6. import boxen from 'boxen'
  7. import picocolors from 'picocolors'
  8. import Unocss from 'unocss/vite'
  9. import autoImport from 'unplugin-auto-import/vite'
  10. import TurboConsole from 'unplugin-turbo-console/vite'
  11. import components from 'unplugin-vue-components/vite'
  12. import { loadEnv, type PluginOption } from 'vite'
  13. import AppLoading from 'vite-plugin-app-loading'
  14. import Archiver from 'vite-plugin-archiver'
  15. import banner from 'vite-plugin-banner'
  16. import { compression } from 'vite-plugin-compression2'
  17. import { vitePluginFakeServer } from 'vite-plugin-fake-server'
  18. import Pages from 'vite-plugin-pages'
  19. import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
  20. import VueDevTools from 'vite-plugin-vue-devtools'
  21. import Layouts from 'vite-plugin-vue-meta-layouts'
  22. export default function createVitePlugins(mode: string, isBuild = false) {
  23. const viteEnv = loadEnv(mode, process.cwd())
  24. const vitePlugins: (PluginOption | PluginOption[])[] = [
  25. vue(),
  26. vueJsx(),
  27. vueLegacy({
  28. renderLegacyChunks: false,
  29. modernPolyfills: [
  30. 'es.array.at',
  31. 'es.array.find-last',
  32. ],
  33. }),
  34. // https://github.com/vuejs/devtools-next
  35. viteEnv.VITE_OPEN_DEVTOOLS === 'true' && VueDevTools(),
  36. // https://github.com/unplugin/unplugin-auto-import
  37. autoImport({
  38. imports: [
  39. 'vue',
  40. 'vue-router',
  41. 'pinia',
  42. ],
  43. dts: './src/types/auto-imports.d.ts',
  44. dirs: [
  45. './src/utils/composables/**',
  46. ],
  47. }),
  48. // https://github.com/unplugin/unplugin-vue-components
  49. components({
  50. dirs: [
  51. 'src/components',
  52. 'src/layouts/ui-kit',
  53. ],
  54. include: [/\.vue$/, /\.vue\?vue/, /\.tsx$/],
  55. dts: './src/types/components.d.ts',
  56. }),
  57. Unocss(),
  58. // https://github.com/vbenjs/vite-plugin-svg-icons
  59. createSvgIconsPlugin({
  60. iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/')],
  61. symbolId: 'icon-[dir]-[name]',
  62. svgoOptions: isBuild,
  63. }),
  64. // https://github.com/condorheroblog/vite-plugin-fake-server
  65. vitePluginFakeServer({
  66. logger: !isBuild,
  67. include: 'src/mock',
  68. infixName: false,
  69. enableProd: isBuild && viteEnv.VITE_BUILD_MOCK === 'true',
  70. }),
  71. // https://github.com/dishait/vite-plugin-vue-meta-layouts
  72. Layouts({
  73. defaultLayout: 'index',
  74. }),
  75. // https://github.com/hannoeru/vite-plugin-pages
  76. Pages({
  77. dirs: 'src/views',
  78. exclude: [
  79. '**/components/**/*.vue',
  80. ],
  81. }),
  82. // https://github.com/nonzzz/vite-plugin-compression
  83. viteEnv.VITE_BUILD_COMPRESS?.split(',').includes('gzip') && compression(),
  84. viteEnv.VITE_BUILD_COMPRESS?.split(',').includes('brotli') && compression({
  85. exclude: [/\.(br)$/, /\.(gz)$/],
  86. algorithm: 'brotliCompress',
  87. }),
  88. viteEnv.VITE_BUILD_ARCHIVE && Archiver({
  89. archiveType: viteEnv.VITE_BUILD_ARCHIVE,
  90. }),
  91. AppLoading('loading.html'),
  92. // https://github.com/unplugin/unplugin-turbo-console
  93. TurboConsole(),
  94. // https://github.com/chengpeiquan/vite-plugin-banner
  95. banner(`
  96. /**
  97. * 由 Fantastic-admin 提供技术支持
  98. * Powered by Fantastic-admin
  99. * https://fantastic-admin.hurui.me
  100. */
  101. `),
  102. {
  103. name: 'vite-plugin-debug-plugin',
  104. enforce: 'pre',
  105. transform: (code, id) => {
  106. if (/src\/main.ts$/.test(id)) {
  107. if (viteEnv.VITE_APP_DEBUG_TOOL === 'eruda') {
  108. code = code.concat(`
  109. import eruda from 'eruda'
  110. eruda.init()
  111. `)
  112. }
  113. else if (viteEnv.VITE_APP_DEBUG_TOOL === 'vconsole') {
  114. code = code.concat(`
  115. import VConsole from 'vconsole'
  116. new VConsole()
  117. `)
  118. }
  119. return {
  120. code,
  121. map: null,
  122. }
  123. }
  124. },
  125. },
  126. {
  127. name: 'vite-plugin-disable-devtool',
  128. enforce: 'pre',
  129. transform: (code, id) => {
  130. if (/src\/main.ts$/.test(id)) {
  131. if (viteEnv.VITE_APP_DISABLE_DEVTOOL === 'true') {
  132. code = code.concat(`
  133. import DisableDevtool from 'disable-devtool'
  134. DisableDevtool()
  135. `)
  136. }
  137. return {
  138. code,
  139. map: null,
  140. }
  141. }
  142. },
  143. },
  144. {
  145. name: 'vite-plugin-terminal-info',
  146. apply: 'serve',
  147. async buildStart() {
  148. const { bold, green, cyan, bgGreen, underline } = picocolors
  149. // eslint-disable-next-line no-console
  150. console.log(
  151. boxen(
  152. `${bold(green(`由 ${bgGreen('Fantastic-admin')} 驱动`))}\n\n${underline('https://fantastic-admin.hurui.me')}\n\n当前使用:${cyan('基础版')}`,
  153. {
  154. padding: 1,
  155. margin: 1,
  156. borderStyle: 'double',
  157. textAlignment: 'center',
  158. },
  159. ),
  160. )
  161. },
  162. },
  163. ]
  164. return vitePlugins
  165. }