| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- import { defineConfig } from "vite"
- import solidPlugin from "vite-plugin-solid"
- import pages from "vite-plugin-pages"
- import fs from "fs"
- import path from "path"
- import { generateHydrationScript, getAssets } from "solid-js/web"
- export default defineConfig({
- plugins: [
- pages({
- exclude: ["**/~*", "**/components/*"],
- }),
- solidPlugin({ ssr: true }),
- {
- name: "vite-plugin-solid-ssr-render",
- apply: (config, env) => {
- return env.command === "build" && !config.build?.ssr
- },
- closeBundle: async () => {
- console.log("Pre-rendering pages...")
- const dist = path.resolve("dist")
- try {
- const serverEntryPath = path.join(dist, "server/entry-server.js")
- const serverEntry = await import(serverEntryPath + "?t=" + Date.now())
- const template = fs.readFileSync(
- path.join(dist, "client/index.html"),
- "utf-8",
- )
- fs.writeFileSync(path.join(dist, "client/fallback.html"), template)
- const routes = ["/"]
- for (const route of routes) {
- const { app } = await serverEntry.render({ url: route })
- const html = template
- .replace("<!--ssr-outlet-->", app)
- .replace("<!--ssr-head-->", generateHydrationScript())
- .replace("<!--ssr-assets-->", getAssets())
- const filePath = path.join(
- dist,
- `client${route === "/" ? "/index" : route}.html`,
- )
- fs.mkdirSync(path.dirname(filePath), {
- recursive: true,
- })
- fs.writeFileSync(filePath, html)
- console.log(`Pre-rendered: ${filePath}`)
- }
- } catch (error) {
- console.error("Error during pre-rendering:", error)
- }
- },
- },
- ],
- server: {
- port: 3000,
- host: "0.0.0.0",
- },
- build: {
- target: "esnext",
- },
- })
|