vite.config.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { defineConfig } from "vite";
  2. import vue from "@vitejs/plugin-vue";
  3. import path from "path";
  4. import { createRequire } from 'module';
  5. const require = createRequire(import.meta.url);
  6. const prerender = require('vite-plugin-prerender');
  7. export default defineConfig(({ mode }) => {
  8. console.log(`🔨 Vite build mode: ${mode}`);
  9. const outDir = process.env.VITE_OUT_DIR || 'dist';
  10. return {
  11. server: {
  12. hmr: false
  13. },
  14. plugins: [
  15. vue(),
  16. ...(mode === 'production' ? [
  17. prerender({
  18. staticDir: path.join(__dirname, outDir),
  19. routes: [
  20. '/', '/en/', '/me/', '/ru/', '/ua/',
  21. '/en/portfolio', '/me/portfolio', '/ru/portfolio', '/ua/portfolio',
  22. '/en/about', '/me/about', '/ru/about', '/ua/about',
  23. '/en/blog', '/me/blog', '/ru/blog', '/ua/blog',
  24. '/en/contact', '/me/contact', '/ru/contact', '/ua/contact',
  25. '/en/help', '/me/help', '/ru/help', '/ua/help',
  26. '/en/guidelines', '/me/guidelines', '/ru/guidelines', '/ua/guidelines',
  27. '/en/nuances', '/me/nuances', '/ru/nuances', '/ua/nuances',
  28. '/en/privacy', '/me/privacy', '/ru/privacy', '/ua/privacy',
  29. '/en/terms', '/me/terms', '/ru/terms', '/ua/terms',
  30. '/en/careers', '/me/careers', '/ru/careers', '/ua/careers',
  31. '/en/scanning', '/me/scanning', '/ru/scanning', '/ua/scanning',
  32. ],
  33. renderer: new prerender.PuppeteerRenderer({
  34. renderAfterDocumentEvent: 'render-event',
  35. injectProperty: '__PRERENDER_INJECTED',
  36. maxTimeout: 30000,
  37. headless: true,
  38. args: [
  39. '--no-sandbox',
  40. '--disable-setuid-sandbox',
  41. '--disable-dev-shm-usage',
  42. '--disable-gpu',
  43. '--single-process'
  44. ],
  45. consoleHandler: (route: string, message: any) => {
  46. console.log(`[🔨 Prerender Console - ${route}] ${message.text()}`);
  47. }
  48. }),
  49. postProcess(renderedRoute: any) {
  50. console.log(`[🔨 Prerender] Finished: ${renderedRoute.route}`);
  51. return renderedRoute;
  52. }
  53. })
  54. ] : [])
  55. ],
  56. resolve: {
  57. alias: {
  58. "@": path.resolve(__dirname, "./src"),
  59. },
  60. },
  61. build: {
  62. outDir: outDir,
  63. target: 'es2018',
  64. chunkSizeWarningLimit: 1000,
  65. cssMinify: true,
  66. minify: 'esbuild',
  67. rollupOptions: {
  68. output: {
  69. manualChunks: {
  70. 'three-vendor': ['three'],
  71. 'ui-vendor': ['lucide-vue-next', '@vueuse/core'],
  72. }
  73. }
  74. }
  75. },
  76. esbuild: {
  77. legalComments: 'none',
  78. target: 'es2018',
  79. },
  80. test: {
  81. globals: true,
  82. environment: "jsdom",
  83. },
  84. };
  85. });