plugins.ts 3.4 KB

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