中医古籍标引
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

109 Zeilen
3.0KB

  1. import { resolve } from "path";
  2. import { PluginOption } from "vite";
  3. import { VitePWA } from "vite-plugin-pwa";
  4. import { visualizer } from "rollup-plugin-visualizer";
  5. import { createHtmlPlugin } from "vite-plugin-html";
  6. import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
  7. import vue from "@vitejs/plugin-vue";
  8. import vueJsx from "@vitejs/plugin-vue-jsx";
  9. import eslintPlugin from "vite-plugin-eslint";
  10. import viteCompression from "vite-plugin-compression";
  11. import vueSetupExtend from "unplugin-vue-setup-extend-plus/vite";
  12. /**
  13. * 创建 vite 插件
  14. * @param viteEnv
  15. */
  16. export const createVitePlugins = (viteEnv: ViteEnv): (PluginOption | PluginOption[])[] => {
  17. const { VITE_GLOB_APP_TITLE, VITE_REPORT, VITE_PWA } = viteEnv;
  18. return [
  19. vue(),
  20. // vue 可以使用 jsx/tsx 语法
  21. vueJsx(),
  22. // esLint 报错信息显示在浏览器界面上
  23. eslintPlugin(),
  24. // name 可以写在 script 标签上
  25. vueSetupExtend({}),
  26. // 创建打包压缩配置
  27. createCompression(viteEnv),
  28. // 注入变量到 html 文件
  29. createHtmlPlugin({
  30. inject: {
  31. data: { title: VITE_GLOB_APP_TITLE }
  32. }
  33. }),
  34. // 使用 svg 图标
  35. createSvgIconsPlugin({
  36. iconDirs: [resolve(process.cwd(), "src/assets/icons")],
  37. symbolId: "icon-[dir]-[name]"
  38. }),
  39. // vitePWA
  40. VITE_PWA && createVitePwa(viteEnv),
  41. // 是否生成包预览,分析依赖包大小做优化处理
  42. VITE_REPORT && (visualizer({ filename: "stats.html", gzipSize: true, brotliSize: true }) as PluginOption)
  43. ];
  44. };
  45. /**
  46. * @description 根据 compress 配置,生成不同的压缩规则
  47. * @param viteEnv
  48. */
  49. const createCompression = (viteEnv: ViteEnv): PluginOption | PluginOption[] => {
  50. const { VITE_BUILD_COMPRESS = "none", VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE } = viteEnv;
  51. const compressList = VITE_BUILD_COMPRESS.split(",");
  52. const plugins: PluginOption[] = [];
  53. if (compressList.includes("gzip")) {
  54. plugins.push(
  55. viteCompression({
  56. ext: ".gz",
  57. algorithm: "gzip",
  58. deleteOriginFile: VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE
  59. })
  60. );
  61. }
  62. if (compressList.includes("brotli")) {
  63. plugins.push(
  64. viteCompression({
  65. ext: ".br",
  66. algorithm: "brotliCompress",
  67. deleteOriginFile: VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE
  68. })
  69. );
  70. }
  71. return plugins;
  72. };
  73. /**
  74. * @description VitePwa
  75. * @param viteEnv
  76. */
  77. const createVitePwa = (viteEnv: ViteEnv): PluginOption | PluginOption[] => {
  78. const { VITE_GLOB_APP_TITLE } = viteEnv;
  79. return VitePWA({
  80. registerType: "autoUpdate",
  81. manifest: {
  82. name: VITE_GLOB_APP_TITLE,
  83. short_name: VITE_GLOB_APP_TITLE,
  84. theme_color: "#ffffff",
  85. icons: [
  86. {
  87. src: "/logo.png",
  88. sizes: "192x192",
  89. type: "image/png"
  90. },
  91. {
  92. src: "/logo.png",
  93. sizes: "512x512",
  94. type: "image/png"
  95. },
  96. {
  97. src: "/logo.png",
  98. sizes: "512x512",
  99. type: "image/png",
  100. purpose: "any maskable"
  101. }
  102. ]
  103. }
  104. });
  105. };