vite.config.ts 3.0 KB

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