From 4f28907340a254bf407f18a7b8c187290c263f34 Mon Sep 17 00:00:00 2001 From: huseeiin Date: Thu, 29 Jan 2026 14:53:40 +0300 Subject: [PATCH 1/5] feat: `vite preview` --- packages/start/src/config/dev-server.ts | 41 +++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/packages/start/src/config/dev-server.ts b/packages/start/src/config/dev-server.ts index 6d783312e..04d1cd2e4 100644 --- a/packages/start/src/config/dev-server.ts +++ b/packages/start/src/config/dev-server.ts @@ -6,11 +6,48 @@ import { type ViteDevServer, } from "vite"; import { VITE_ENVIRONMENTS } from "./constants.ts"; +import { join, resolve } from "node:path"; +import { H3, serveStatic } from "h3"; +import { stat, readFile } from "node:fs/promises"; + +type Server = { + default: { fetch: (req: Request) => Promise }; +}; export function devServer(): Array { return [ { name: "solid-start-dev-server", + async configurePreviewServer(vitePreviewServer) { + const { default: h3App }: Server = await import( + resolve(process.cwd(), "dist/server/entry-server.js") + ); + const app = new H3(); + app.use("/_build/**", event => { + return serveStatic(event, { + indexNames: ["/index.html"], + headers: { "cache-control": "public, max-age=3156000, immutable" }, + getContents: id => readFile(join(process.cwd(), "dist/client", id)), + getMeta: async id => { + const stats = await stat(join("dist/client", id)).catch(() => {}); + if (stats?.isFile()) { + return { + size: stats.size, + mtime: stats.mtimeMs, + }; + } + }, + }); + }); + app.mount("/", h3App); + + vitePreviewServer.middlewares.use(async (req, res) => { + const webReq = new NodeRequest({ req, res }); + + const webRes = await app.fetch(webReq); + sendNodeResponse(res, webRes); + }); + }, configureServer(viteDevServer) { (globalThis as any).VITE_DEV_SERVER = viteDevServer; return async () => { @@ -40,9 +77,7 @@ export function devServer(): Array { const webReq = new NodeRequest({ req, res }); try { - const serverEntry: { - default: { fetch: (req: Request) => Promise }; - } = await serverEnv.runner.import("./src/entry-server.tsx"); + const serverEntry: Server = await serverEnv.runner.import("./src/entry-server.tsx"); const webRes = await serverEntry.default.fetch(webReq); From c6641f0244019d739b50384fea11cbead5a095d5 Mon Sep 17 00:00:00 2001 From: huseeiin Date: Thu, 29 Jan 2026 14:59:20 +0300 Subject: [PATCH 2/5] add changeset --- .changeset/moody-hands-check.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/moody-hands-check.md diff --git a/.changeset/moody-hands-check.md b/.changeset/moody-hands-check.md new file mode 100644 index 000000000..fde7ef434 --- /dev/null +++ b/.changeset/moody-hands-check.md @@ -0,0 +1,5 @@ +--- +"@solidjs/start": minor +--- + +add `vite preview` support From ade9c523f8b48331eec3393fe420330141456aaa Mon Sep 17 00:00:00 2001 From: huseeiin Date: Thu, 29 Jan 2026 16:50:55 +0300 Subject: [PATCH 3/5] fix public assets --- packages/start/src/config/dev-server.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/start/src/config/dev-server.ts b/packages/start/src/config/dev-server.ts index 04d1cd2e4..77a2e0252 100644 --- a/packages/start/src/config/dev-server.ts +++ b/packages/start/src/config/dev-server.ts @@ -41,12 +41,14 @@ export function devServer(): Array { }); app.mount("/", h3App); - vitePreviewServer.middlewares.use(async (req, res) => { - const webReq = new NodeRequest({ req, res }); + return async () => { + vitePreviewServer.middlewares.use(async (req, res) => { + const webReq = new NodeRequest({ req, res }); - const webRes = await app.fetch(webReq); - sendNodeResponse(res, webRes); - }); + const webRes = await app.fetch(webReq); + sendNodeResponse(res, webRes); + }); + }; }, configureServer(viteDevServer) { (globalThis as any).VITE_DEV_SERVER = viteDevServer; From 987329b19ab379de6057500c068f80ad5e2e5a68 Mon Sep 17 00:00:00 2001 From: huseeiin Date: Thu, 29 Jan 2026 17:11:12 +0300 Subject: [PATCH 4/5] fix streaming --- packages/start/src/config/dev-server.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/start/src/config/dev-server.ts b/packages/start/src/config/dev-server.ts index 77a2e0252..03612578b 100644 --- a/packages/start/src/config/dev-server.ts +++ b/packages/start/src/config/dev-server.ts @@ -43,6 +43,8 @@ export function devServer(): Array { return async () => { vitePreviewServer.middlewares.use(async (req, res) => { + res.setHeader("Content-Encoding", "identity"); + const webReq = new NodeRequest({ req, res }); const webRes = await app.fetch(webReq); From da2093251515794ac687539e43d22f89fb08868f Mon Sep 17 00:00:00 2001 From: huseeiin Date: Thu, 29 Jan 2026 17:12:10 +0300 Subject: [PATCH 5/5] add comment --- packages/start/src/config/dev-server.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/start/src/config/dev-server.ts b/packages/start/src/config/dev-server.ts index 03612578b..15aac15d8 100644 --- a/packages/start/src/config/dev-server.ts +++ b/packages/start/src/config/dev-server.ts @@ -43,6 +43,7 @@ export function devServer(): Array { return async () => { vitePreviewServer.middlewares.use(async (req, res) => { + // fix streaming because vite uses gzip by default res.setHeader("Content-Encoding", "identity"); const webReq = new NodeRequest({ req, res });