vite.config.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { defineConfig } from "vite"
  2. import solidPlugin from "vite-plugin-solid"
  3. import pages from "vite-plugin-pages"
  4. import fs from "fs"
  5. import path from "path"
  6. import { generateHydrationScript, getAssets } from "solid-js/web"
  7. export default defineConfig({
  8. plugins: [
  9. pages({
  10. exclude: ["**/~*", "**/components/*"],
  11. }),
  12. solidPlugin({ ssr: true }),
  13. {
  14. name: "vite-plugin-solid-ssr-render",
  15. apply: (config, env) => {
  16. return env.command === "build" && !config.build?.ssr
  17. },
  18. closeBundle: async () => {
  19. console.log("Pre-rendering pages...")
  20. const dist = path.resolve("dist")
  21. try {
  22. const serverEntryPath = path.join(dist, "server/entry-server.js")
  23. const serverEntry = await import(serverEntryPath + "?t=" + Date.now())
  24. const template = fs.readFileSync(
  25. path.join(dist, "client/index.html"),
  26. "utf-8",
  27. )
  28. fs.writeFileSync(path.join(dist, "client/fallback.html"), template)
  29. const routes = ["/"]
  30. for (const route of routes) {
  31. const { app } = await serverEntry.render({ url: route })
  32. const html = template
  33. .replace("<!--ssr-outlet-->", app)
  34. .replace("<!--ssr-head-->", generateHydrationScript())
  35. .replace("<!--ssr-assets-->", getAssets())
  36. const filePath = path.join(
  37. dist,
  38. `client${route === "/" ? "/index" : route}.html`,
  39. )
  40. fs.mkdirSync(path.dirname(filePath), {
  41. recursive: true,
  42. })
  43. fs.writeFileSync(filePath, html)
  44. console.log(`Pre-rendered: ${filePath}`)
  45. }
  46. } catch (error) {
  47. console.error("Error during pre-rendering:", error)
  48. }
  49. },
  50. },
  51. ],
  52. server: {
  53. port: 3000,
  54. host: "0.0.0.0",
  55. },
  56. build: {
  57. target: "esnext",
  58. },
  59. })