vite.config.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import { fileURLToPath, URL } from 'node:url';
  2. import path from 'path';
  3. import { defineConfig } from 'vite';
  4. import vue from '@vitejs/plugin-vue';
  5. import vueJsx from '@vitejs/plugin-vue-jsx';
  6. import { createHtmlPlugin } from 'vite-plugin-html';
  7. import AutoImport from 'unplugin-auto-import/vite';
  8. import Components from 'unplugin-vue-components/vite';
  9. import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
  10. const IS_PRODUCTION = process.env.NODE_ENV === 'production';
  11. // 当前场景
  12. const SCENE = process.env.VITE_APP_SCENE;
  13. // 是否离线包
  14. const OFFLINE = Boolean(Number(process.env.VITE_APP_OFFLINE));
  15. const extensions = ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'];
  16. if (SCENE != null) {
  17. console.log('当前场景:', SCENE);
  18. extensions.unshift(
  19. `.${SCENE}.mjs`,
  20. `.${SCENE}.js`,
  21. `.${SCENE}.ts`,
  22. `.${SCENE}.jsx`,
  23. `.${SCENE}.tsx`,
  24. `.${SCENE}.json`,
  25. `.${SCENE}.vue`
  26. );
  27. if (OFFLINE) {
  28. extensions.unshift(
  29. `.${SCENE}.offline.mjs`,
  30. `.${SCENE}.offline.js`,
  31. `.${SCENE}.offline.ts`,
  32. `.${SCENE}.offline.jsx`,
  33. `.${SCENE}.offline.tsx`,
  34. `.${SCENE}.offline.json`,
  35. `.${SCENE}.offline.vue`
  36. );
  37. }
  38. }
  39. // https://vite.dev/config/
  40. export default defineConfig(() => {
  41. return {
  42. base: './',
  43. plugins: [
  44. createHtmlPlugin({
  45. inject: {
  46. data: {
  47. title: process.env.TITLE,
  48. },
  49. },
  50. }),
  51. vue(),
  52. vueJsx(),
  53. AutoImport({
  54. resolvers: [
  55. ElementPlusResolver({
  56. importStyle: 'sass',
  57. }),
  58. ],
  59. }),
  60. Components({
  61. resolvers: [
  62. ElementPlusResolver({
  63. importStyle: 'sass',
  64. }),
  65. ],
  66. }),
  67. ],
  68. resolve: {
  69. alias: {
  70. '@': fileURLToPath(new URL('./src/index', import.meta.url)),
  71. },
  72. extensions,
  73. },
  74. server: {
  75. port: Number(process.env.PORT) || 81,
  76. host: '0.0.0.0',
  77. strictPort: true,
  78. cors: true,
  79. },
  80. build: {
  81. outDir: IS_PRODUCTION && SCENE ? `build/${SCENE}` : 'build',
  82. assetsDir: 'assets',
  83. sourcemap: process.env.SOURCE_MAP === 'true',
  84. rollupOptions: {
  85. input: {
  86. index: path.resolve(__dirname, 'index.html'),
  87. },
  88. output: {
  89. manualChunks: {
  90. vendors: ['vue', 'element-plus', 'swiper'],
  91. },
  92. },
  93. },
  94. },
  95. css: {
  96. preprocessorOptions: {
  97. scss: {
  98. api: 'modern-compiler',
  99. additionalData: `@use "@/assets/el${SCENE ? '.' + SCENE : ''}.scss" as *;`,
  100. },
  101. },
  102. },
  103. };
  104. });