vite.config.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { defineConfig } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. import WindiCSS from 'vite-plugin-windicss'
  4. const PUBLIC_URL_PREFIXES = ['images/', 'CanalPage/', 'SymbiosisPage/']
  5. const PUBLIC_URL_RE = new RegExp(
  6. `url\\(\\s*(['"]?)\\.\\/(${PUBLIC_URL_PREFIXES.join('|')})([^'")]+)\\1\\s*\\)`,
  7. 'g',
  8. )
  9. /** 让 CSS 里的 ./public 路径不要被 Vite 当模块解析,构建后再写成相对 CSS 文件的路径 */
  10. function preservePublicCssUrls() {
  11. return {
  12. name: 'preserve-public-css-urls',
  13. enforce: 'pre',
  14. transform(code, id) {
  15. if (!/\.(vue|css|scss)($|\?)/.test(id) || !code.includes('url(')) return
  16. const next = code.replace(
  17. PUBLIC_URL_RE,
  18. (_m, quote, folder, rest) => `url(${quote}/${folder}${rest}${quote})`,
  19. )
  20. if (next !== code) return { code: next, map: null }
  21. },
  22. generateBundle(_opts, bundle) {
  23. const replacements = [
  24. ['url(/images/', 'url(../images/'],
  25. ["url('/images/", "url('../images/"],
  26. ['url("/images/', 'url("../images/'],
  27. ['url(/CanalPage/', 'url(../CanalPage/'],
  28. ["url('/CanalPage/", "url('../CanalPage/"],
  29. ['url("/CanalPage/', 'url("../CanalPage/'],
  30. ['url(/SymbiosisPage/', 'url(../SymbiosisPage/'],
  31. ["url('/SymbiosisPage/", "url('../SymbiosisPage/"],
  32. ['url("/SymbiosisPage/', 'url("../SymbiosisPage/'],
  33. ]
  34. for (const item of Object.values(bundle)) {
  35. if (item.type !== 'asset' || !item.fileName.endsWith('.css')) continue
  36. let source = String(item.source)
  37. for (const [from, to] of replacements) source = source.split(from).join(to)
  38. item.source = source
  39. }
  40. },
  41. }
  42. }
  43. export default defineConfig({
  44. base: './',
  45. plugins: [
  46. preservePublicCssUrls(),
  47. vue({
  48. template: {
  49. transformAssetUrls: {
  50. includeAbsolute: false,
  51. tags: {},
  52. },
  53. },
  54. }),
  55. WindiCSS(),
  56. ],
  57. css: {
  58. postcss: './postcss.config.js',
  59. preprocessorOptions: {
  60. scss: { api: 'modern-compiler' },
  61. },
  62. },
  63. server: {
  64. port: 3000,
  65. open: true,
  66. },
  67. })