vite.config.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { fileURLToPath, URL } from "node:url";
  2. import { defineConfig, loadEnv } from "vite";
  3. import vue from "@vitejs/plugin-vue";
  4. import vueJsx from "@vitejs/plugin-vue-jsx";
  5. import Components from "unplugin-vue-components/vite";
  6. import {ElementPlusResolver, VantResolver} from "unplugin-vue-components/resolvers";
  7. import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
  8. import AutoImport from 'unplugin-auto-import/vite';
  9. import path from "path";
  10. import mockDevServerPlugin from "vite-plugin-mock-dev-server";
  11. import vueSetupExtend from "vite-plugin-vue-setup-extend";
  12. import viteCompression from "vite-plugin-compression";
  13. import { createHtmlPlugin } from "vite-plugin-html";
  14. import { enableCDN } from "./build/cdn";
  15. import { ViteImageOptimizer } from 'vite-plugin-image-optimizer';
  16. // 当前工作目录路径
  17. const root: string = process.cwd();
  18. // https://vitejs.dev/config/
  19. export default defineConfig(({ mode }) => {
  20. // 环境变量
  21. const env = loadEnv(mode, root, "");
  22. return {
  23. base: env.VITE_PUBLIC_PATH || "/",
  24. plugins: [
  25. vue(),
  26. vueJsx(),
  27. mockDevServerPlugin(),
  28. // vant 组件自动按需引入
  29. Components({
  30. dts: "src/typings/components.d.ts",
  31. resolvers: [VantResolver()]
  32. }),
  33. // svg icon
  34. createSvgIconsPlugin({
  35. // 指定图标文件夹
  36. iconDirs: [path.resolve(root, "src/icons/svg")],
  37. // 指定 symbolId 格式
  38. symbolId: "icon-[dir]-[name]"
  39. }),
  40. // 允许 setup 语法糖上添加组件名属性
  41. vueSetupExtend(),
  42. // 生产环境 gzip 压缩资源
  43. viteCompression(),
  44. // 注入模板数据
  45. createHtmlPlugin({
  46. inject: {
  47. data: {
  48. ENABLE_ERUDA: env.VITE_ENABLE_ERUDA || "false"
  49. }
  50. }
  51. }),
  52. // 自动引入组件
  53. AutoImport({
  54. // 自动导入 Vue 相关函数
  55. imports: ['vue', 'vue-router', '@vueuse/core', 'pinia'],
  56. dts: './auto-imports.d.ts',
  57. eslintrc: {
  58. enabled: false,
  59. filepath: './.eslintrc-auto-import.json',
  60. globalsPropValue: true
  61. },
  62. resolvers: [
  63. ElementPlusResolver()
  64. ],
  65. vueTemplate: true, // 是否在 vue 模板中自动导入
  66. }),
  67. // 生产环境默认不启用 CDN 加速
  68. enableCDN(env.VITE_CDN_DEPS),
  69. ViteImageOptimizer()
  70. ],
  71. resolve: {
  72. alias: {
  73. "@": fileURLToPath(new URL("./src", import.meta.url))
  74. }
  75. },
  76. server: {
  77. host: true,
  78. port: Number(env.VITE_APP_PORT),
  79. open: true
  80. // 仅在 proxy 中配置的代理前缀, mock-dev-server 才会拦截并 mock
  81. // doc: https://github.com/pengzhanbo/vite-plugin-mock-dev-server
  82. // proxy: {
  83. // "^/dev-api": {
  84. // target: ""
  85. // }
  86. // }
  87. },
  88. css: {
  89. preprocessorOptions: {
  90. scss: { api: 'modern-compiler' },
  91. }
  92. },
  93. build: {
  94. rollupOptions: {
  95. output: {
  96. chunkFileNames: "static/js/[name]-[hash].js",
  97. entryFileNames: "static/js/[name]-[hash].js",
  98. assetFileNames: "static/[ext]/[name]-[hash].[ext]"
  99. }
  100. }
  101. }
  102. };
  103. });