vite.config.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import { defineConfig } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. import path from 'path'
  4. import AutoImport from 'unplugin-auto-import/vite'
  5. import Components from 'unplugin-vue-components/vite'
  6. import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
  7. import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
  8. import viteCompression from 'vite-plugin-compression'
  9. import DefineOptions from 'unplugin-vue-define-options/vite'
  10. import legacy from '@vitejs/plugin-legacy'
  11. // eslint
  12. import eslintPlugin from 'vite-plugin-eslint'
  13. import esbuild from 'rollup-plugin-esbuild'
  14. // https://vitejs.dev/config/
  15. export default defineConfig(({ command }) => {
  16. return {
  17. plugins: [
  18. vue(),
  19. DefineOptions(),
  20. createSvgIconsPlugin({
  21. iconDirs: [path.resolve(process.cwd(), 'src/icons/svg')],
  22. symbolId: 'icon-[dir]-[name]'
  23. }),
  24. // 自动引入内容
  25. AutoImport({
  26. imports: [
  27. 'vue',
  28. 'vue-router'
  29. ],
  30. dirs: [
  31. 'src/hooks/**',
  32. 'src/stores/**',
  33. 'src/utils/**'
  34. ],
  35. resolvers: command === 'build' ? [ElementPlusResolver()] : [],
  36. dts: 'src/auto-import/imports.d.ts',
  37. eslintrc: {
  38. enabled: true
  39. }
  40. }),
  41. // 自动引入组件
  42. Components({
  43. dirs: [
  44. 'src/components'
  45. ],
  46. resolvers: command === 'build' ? [ElementPlusResolver()] : [],
  47. dts: 'src/auto-import/components.d.ts'
  48. }),
  49. // 对大于 1k 的文件进行压缩
  50. viteCompression({
  51. threshold: 10240
  52. })
  53. ].concat(getDynamicPlugins(command))
  54. .concat(
  55. // eslint
  56. command !== 'build' ? [eslintPlugin({ include: ['src/**/*.js', 'src/**/*.vue', 'src/*.js', 'src/*.vue'] })] : []
  57. ),
  58. server: {
  59. host: true,
  60. port: 9527,
  61. open: true
  62. },
  63. resolve: {
  64. alias: {
  65. '@': path.resolve(__dirname, 'src'),
  66. 'vue-i18n': 'vue-i18n/dist/vue-i18n.cjs.js'
  67. }
  68. },
  69. build: {
  70. base: './',
  71. rollupOptions: {
  72. // 静态资源分类打包
  73. output: {
  74. chunkFileNames: 'static/js/[name]-[hash].js',
  75. entryFileNames: 'static/js/[name]-[hash].js',
  76. assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
  77. // 静态资源分拆打包
  78. manualChunks (id) {
  79. if (id.includes('node_modules')) {
  80. if (id.toString().indexOf('.pnpm/') !== -1) {
  81. return id.toString().split('.pnpm/')[1].split('/')[0].toString()
  82. } else if (id.toString().indexOf('node_modules/') !== -1) {
  83. return id.toString().split('node_modules/')[1].split('/')[0].toString()
  84. }
  85. }
  86. }
  87. }
  88. },
  89. sourcemap: false,
  90. minify: 'terser',
  91. reportCompressedSize: false
  92. }
  93. }
  94. })
  95. /**
  96. * 根据运行环境加载动态插件
  97. * @param {String} command serve: 开发环境 || 预览环境;build: 构建环境
  98. */
  99. function getDynamicPlugins (command) {
  100. const dynamicPlugins = [
  101. command === 'serve' ?
  102. // esbuild 在开发环境兼容低版本浏览器
  103. {
  104. ...esbuild({
  105. target: 'chrome64',
  106. include: /\.vue|.ts|.js$/,
  107. loaders: {
  108. '.vue': 'js'
  109. }
  110. }),
  111. enforce: 'post'
  112. } :
  113. // 在构建时使用 legacy 处理兼容
  114. legacy({
  115. // 兼容浏览器列表
  116. targets: ['chrome >= 51', 'firefox >= 54', 'safari >= 12', 'Android >= 7']
  117. })
  118. ]
  119. return dynamicPlugins
  120. }