plugins.ts 5.0 KB

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