From 4f28907340a254bf407f18a7b8c187290c263f34 Mon Sep 17 00:00:00 2001 From: huseeiin Date: Thu, 29 Jan 2026 14:53:40 +0300 Subject: [PATCH 1/8] 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/8] 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/8] 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/8] 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/8] 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 }); From 7941ea6b0168ced9ca166c05aa1a4932b0896780 Mon Sep 17 00:00:00 2001 From: huseeiin Date: Tue, 3 Feb 2026 16:16:56 +0300 Subject: [PATCH 6/8] no need to serve assets with h3 --- packages/start/src/config/dev-server.ts | 51 ++++++------------------- 1 file changed, 12 insertions(+), 39 deletions(-) diff --git a/packages/start/src/config/dev-server.ts b/packages/start/src/config/dev-server.ts index 15aac15d8..5687fad38 100644 --- a/packages/start/src/config/dev-server.ts +++ b/packages/start/src/config/dev-server.ts @@ -6,50 +6,21 @@ 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); - - return async () => { - vitePreviewServer.middlewares.use(async (req, res) => { - // fix streaming because vite uses gzip by default - res.setHeader("Content-Encoding", "identity"); - + configurePreviewServer(server) { + return () => { + globalThis.canSendFastNodeStreams = true; + server.middlewares.use(async (req, res) => { + res.setHeader("content-encoding", "identity"); const webReq = new NodeRequest({ req, res }); - - const webRes = await app.fetch(webReq); - sendNodeResponse(res, webRes); + const def: { + default: { fetch: (req: Request) => Promise }; + } = await import(process.cwd() + "/dist/server/entry-server.js"); + sendNodeResponse(res, await def.default.fetch(webReq)); }); }; }, @@ -82,7 +53,9 @@ export function devServer(): Array { const webReq = new NodeRequest({ req, res }); try { - const serverEntry: Server = await serverEnv.runner.import("./src/entry-server.tsx"); + const serverEntry: { + default: { fetch: (req: Request) => Promise }; + } = await serverEnv.runner.import("./src/entry-server.tsx"); const webRes = await serverEntry.default.fetch(webReq); From 0929c4b4eb617811f5c8ceeb1fe085a41da3a045 Mon Sep 17 00:00:00 2001 From: huseeiin Date: Tue, 3 Feb 2026 18:09:51 +0300 Subject: [PATCH 7/8] fix casing --- packages/start/src/config/dev-server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/start/src/config/dev-server.ts b/packages/start/src/config/dev-server.ts index 5687fad38..ae19f91f9 100644 --- a/packages/start/src/config/dev-server.ts +++ b/packages/start/src/config/dev-server.ts @@ -13,7 +13,7 @@ export function devServer(): Array { name: "solid-start-dev-server", configurePreviewServer(server) { return () => { - globalThis.canSendFastNodeStreams = true; + globalThis.CAN_SEND_FAST_NODE_STREAMS = true; server.middlewares.use(async (req, res) => { res.setHeader("content-encoding", "identity"); const webReq = new NodeRequest({ req, res }); From b9373f841d8b16bc32030d85c5546ec17eb78831 Mon Sep 17 00:00:00 2001 From: huseeiin Date: Wed, 4 Feb 2026 10:00:25 +0300 Subject: [PATCH 8/8] delete type --- packages/start/src/config/dev-server.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/start/src/config/dev-server.ts b/packages/start/src/config/dev-server.ts index ae19f91f9..d88a8cb0d 100644 --- a/packages/start/src/config/dev-server.ts +++ b/packages/start/src/config/dev-server.ts @@ -13,7 +13,6 @@ export function devServer(): Array { name: "solid-start-dev-server", configurePreviewServer(server) { return () => { - globalThis.CAN_SEND_FAST_NODE_STREAMS = true; server.middlewares.use(async (req, res) => { res.setHeader("content-encoding", "identity"); const webReq = new NodeRequest({ req, res });