diff --git a/AGENTS.md b/AGENTS.md index b1d593d23..1621c0367 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -451,7 +451,7 @@ This repo currently resolves `vite` to `@voidzero-dev/vite-plus-core`, which bun - Prefer `oxc` over `esbuild` for new JavaScript transform config - Prefer `optimizeDeps.rolldownOptions` over `optimizeDeps.esbuildOptions` - Prefer `build.rolldownOptions` / `worker.rolldownOptions` over adding new `*.rollupOptions` config -- When touching existing `build.rollupOptions` or `manualChunks`, preserve Vite 7 compatibility but treat them as migration targets, not patterns to copy forward +- When touching existing `build.rollupOptions` or `manualChunks`, treat them as migration targets to Rolldown equivalents, not patterns to copy forward - If something breaks only on Vite 8, check the newer `build.target` baseline and stricter CommonJS default import behavior first ### Virtual Module Resolution Quirks diff --git a/README.md b/README.md index eb127dd7c..6a181526f 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ This will: The migration is non-destructive -- your existing Next.js setup continues to work alongside vinext. It does not modify `next.config`, `tsconfig.json`, or any source files, and it does not remove Next.js dependencies. -vinext supports both Vite 7 and Vite 8. If you bring custom Vite config or plugins from an older setup, note that Vite 8 now defaults to Rolldown, Oxc, Lightning CSS, and a newer browser baseline. Prefer `oxc`, `optimizeDeps.rolldownOptions`, and `build.rolldownOptions` over older `esbuild` and `build.rollupOptions` knobs, and override `build.target` if you still need older browsers. If a dependency only breaks on Vite 8 because of stricter CommonJS default import handling, fix the import or use `legacy.inconsistentCjsInterop: true` as a temporary escape hatch. See the [Vite 8 migration guide](https://vite.dev/guide/migration). +vinext targets Vite 8, which defaults to Rolldown, Oxc, Lightning CSS, and a newer browser baseline. If you bring custom Vite config or plugins from an older setup, prefer `oxc`, `optimizeDeps.rolldownOptions`, and `build.rolldownOptions` over older `esbuild` and `build.rollupOptions` knobs, and override `build.target` if you still need older browsers. If a dependency breaks because of stricter CommonJS default import handling, fix the import or use `legacy.inconsistentCjsInterop: true` as a temporary escape hatch. See the [Vite 8 migration guide](https://vite.dev/guide/migration). ```bash npm run dev:vinext # Start the vinext dev server (port 3001) @@ -556,7 +556,7 @@ These are intentional exclusions: These benchmarks measure **compilation and bundling speed**, not production serving performance. Next.js and vinext have fundamentally different default approaches: Next.js statically pre-renders pages at build time (making builds slower but production serving faster for static content), while vinext server-renders all pages on each request. To make the comparison apples-to-apples, the benchmark app uses `export const dynamic = "force-dynamic"` to disable Next.js static pre-rendering — both frameworks are doing the same work: compiling, bundling, and preparing server-rendered routes. -The benchmark app is a shared 33-route App Router application (server components, client components, dynamic routes, nested layouts, API routes) built identically by both tools. We compare Next.js 16 (Turbopack) against vinext on both Vite 7 (Rollup) and Vite 8 (Rolldown). Turbopack and Rolldown both parallelize across cores, so results on machines with more cores may differ significantly. +The benchmark app is a shared 33-route App Router application (server components, client components, dynamic routes, nested layouts, API routes) built identically by both tools. We compare Next.js (Turbopack) against vinext (Vite 8). Both Turbopack and Rolldown parallelize across cores, so results on machines with more cores may differ significantly. We measure three things: diff --git a/benchmarks/.gitignore b/benchmarks/.gitignore index 1f7039c60..ab6870520 100644 --- a/benchmarks/.gitignore +++ b/benchmarks/.gitignore @@ -4,22 +4,18 @@ app/ # Copies of shared app in each project (generated by generate-app.mjs) nextjs/app/ vinext/app/ -vinext-rolldown/app/ # Build outputs nextjs/.next/ vinext/dist/ -vinext-rolldown/dist/ # Dependencies (each project has its own) nextjs/node_modules/ vinext/node_modules/ -vinext-rolldown/node_modules/ # Lock files nextjs/package-lock.json vinext/package-lock.json -vinext-rolldown/package-lock.json # Next.js generated files nextjs/next-env.d.ts diff --git a/benchmarks/generate-app.mjs b/benchmarks/generate-app.mjs index 30f3f7ccf..5dac09bb3 100644 --- a/benchmarks/generate-app.mjs +++ b/benchmarks/generate-app.mjs @@ -577,7 +577,7 @@ console.log( // Copy to each benchmark project (symlinks don't work with Turbopack) import { cpSync } from "node:fs"; const BASE = dirname(new URL(import.meta.url).pathname); -for (const project of ["nextjs", "vinext", "vinext-rolldown"]) { +for (const project of ["nextjs", "vinext"]) { const dest = join(BASE, project, "app"); rmSync(dest, { recursive: true, force: true }); cpSync(APP, dest, { recursive: true }); diff --git a/benchmarks/nextjs/package.json b/benchmarks/nextjs/package.json index ab3e22d1b..e0e5313f4 100644 --- a/benchmarks/nextjs/package.json +++ b/benchmarks/nextjs/package.json @@ -7,7 +7,7 @@ "start": "next start" }, "dependencies": { - "next": "16.1.7", + "next": "16.2.1", "react": "19.2.4", "react-dom": "19.2.4" } diff --git a/benchmarks/run.mjs b/benchmarks/run.mjs index bb9161ed4..14cce7c32 100644 --- a/benchmarks/run.mjs +++ b/benchmarks/run.mjs @@ -1,6 +1,6 @@ #!/usr/bin/env node /** - * Benchmark harness: compares Next.js 16 (Turbopack) vs vinext (Vite 7/Rollup) vs vinext (Vite 8/Rolldown) + * Benchmark harness: compares Next.js (Turbopack) vs vinext (Vite 8) * * Metrics: * 1. Production build time (hyperfine) @@ -10,7 +10,7 @@ * 5. Memory usage (peak RSS during build and dev) * * Prerequisites: hyperfine, autocannon (npm i -g autocannon) - * Usage: node benchmarks/run.mjs [--runs N] [--dev-runs N] [--skip-build] [--skip-dev] [--skip-ssr] [--skip-rolldown] + * Usage: node benchmarks/run.mjs [--runs N] [--dev-runs N] [--skip-build] [--skip-dev] [--skip-ssr] */ import { execSync, spawn } from "node:child_process"; @@ -33,7 +33,6 @@ const DEV_RUNS = parseInt(args.find((a) => a.startsWith("--dev-runs="))?.split(" const SKIP_BUILD = args.includes("--skip-build"); const SKIP_DEV = args.includes("--skip-dev"); const SKIP_SSR = args.includes("--skip-ssr"); -const SKIP_ROLLDOWN = args.includes("--skip-rolldown"); // ─── Helpers ─────────────────────────────────────────────────────────────────── function exec(cmd, opts = {}) { @@ -228,13 +227,10 @@ async function main() { }, nextjs: {}, vinext: {}, - vinextRolldown: {}, }; const nextjsDir = join(__dirname, "nextjs"); const vinextDir = join(__dirname, "vinext"); - const vinextRolldownDir = join(__dirname, "vinext-rolldown"); - const hasRolldown = !SKIP_ROLLDOWN && existsSync(join(vinextRolldownDir, "package.json")); // Detect actual installed versions for reproducibility try { @@ -253,16 +249,6 @@ async function main() { } catch { /* deps not installed yet */ } - if (hasRolldown) { - try { - const rdPkg = JSON.parse( - readFileSync(join(vinextRolldownDir, "node_modules", "vite", "package.json"), "utf-8"), - ); - results.system.viteRolldownVersion = rdPkg.version; - } catch { - /* deps not installed yet */ - } - } // ─── 1. Production Build Time ────────────────────────────────────────────── if (!SKIP_BUILD) { @@ -271,7 +257,6 @@ async function main() { // Clean previous builds exec("rm -rf .next", { cwd: nextjsDir }); exec("rm -rf dist", { cwd: vinextDir }); - if (hasRolldown) exec("rm -rf dist", { cwd: vinextRolldownDir }); // Ensure plugin is built console.log(" Building vinext plugin..."); @@ -284,16 +269,10 @@ async function main() { exec("./node_modules/.bin/next build --turbopack", { cwd: nextjsDir, timeout: 120000 }); exec("rm -rf .next", { cwd: nextjsDir }); - console.log(" Warmup: vinext (Rollup) build..."); + console.log(" Warmup: vinext build..."); exec("./node_modules/.bin/vp build", { cwd: vinextDir, timeout: 120000 }); exec("rm -rf dist", { cwd: vinextDir }); - if (hasRolldown) { - console.log(" Warmup: vinext (Rolldown) build..."); - exec("./node_modules/.bin/vp build", { cwd: vinextRolldownDir, timeout: 120000 }); - exec("rm -rf dist", { cwd: vinextRolldownDir }); - } - // Measured runs with hyperfine (single invocation with --shuffle for fair ordering) console.log(`\n Running ${RUNS} build iterations with hyperfine (randomized order)...\n`); @@ -314,11 +293,6 @@ async function main() { `--command-name nextjs 'rm -rf ${nextjsDir}/.next && ./node_modules/.bin/next build --turbopack'`, `--command-name vinext 'cd ${vinextDir} && rm -rf dist && ./node_modules/.bin/vp build'`, ]; - if (hasRolldown) { - cmds.push( - `--command-name rolldown 'cd ${vinextRolldownDir} && rm -rf dist && ./node_modules/.bin/vp build'`, - ); - } console.log(" Timing all builds (shuffled)..."); const hfJson = exec( @@ -333,15 +307,13 @@ async function main() { results.nextjs.buildTime = parseHyperfineResult(r); } else if (r.command.includes(vinextDir)) { results.vinext.buildTime = parseHyperfineResult(r); - } else if (hasRolldown && r.command.includes(vinextRolldownDir)) { - results.vinextRolldown.buildTime = parseHyperfineResult(r); } } results.buildMethodology = "hyperfine --shuffle (randomized)"; } catch { // Fallback: manual timing with randomized runner order to eliminate positional bias console.log(" hyperfine failed, falling back to manual timing..."); - const buildTimes = { nextjs: [], vinext: [], rolldown: [] }; + const buildTimes = { nextjs: [], vinext: [] }; const buildRunners = [ { @@ -362,22 +334,6 @@ async function main() { buildTimes.vinext.push(performance.now() - start); }, }, - ...(hasRolldown - ? [ - { - key: "rolldown", - run: () => { - exec("rm -rf dist", { cwd: vinextRolldownDir }); - const start = performance.now(); - exec("./node_modules/.bin/vp build", { - cwd: vinextRolldownDir, - timeout: 120000, - }); - buildTimes.rolldown.push(performance.now() - start); - }, - }, - ] - : []), ]; const buildRunOrders = []; @@ -407,14 +363,6 @@ async function main() { min: Math.min(...buildTimes.vinext), max: Math.max(...buildTimes.vinext), }; - if (hasRolldown && buildTimes.rolldown.length) { - results.vinextRolldown.buildTime = { - mean: avg(buildTimes.rolldown), - stddev: stddev(buildTimes.rolldown), - min: Math.min(...buildTimes.rolldown), - max: Math.max(...buildTimes.rolldown), - }; - } results.buildMethodology = "manual timing (randomized)"; results.buildRunOrders = buildRunOrders; } @@ -441,30 +389,19 @@ async function main() { ` Next.js: ${njsSize.files} files, ${formatBytes(njsSize.raw)} raw, ${formatBytes(njsSize.gzip)} gzip`, ); - // vinext (Rollup): client bundles are in dist/client + // vinext: client bundles are in dist/client const ncSize = bundleSize(join(vinextDir, "dist", "client")); results.vinext.bundleSize = ncSize; console.log( - ` vinext (Rollup): ${ncSize.files} files, ${formatBytes(ncSize.raw)} raw, ${formatBytes(ncSize.gzip)} gzip`, + ` vinext: ${ncSize.files} files, ${formatBytes(ncSize.raw)} raw, ${formatBytes(ncSize.gzip)} gzip`, ); - - // vinext (Rolldown): client bundles are in dist/client - if (hasRolldown) { - exec("rm -rf dist", { cwd: vinextRolldownDir }); - exec("./node_modules/.bin/vp build", { cwd: vinextRolldownDir, timeout: 120000 }); - const rdSize = bundleSize(join(vinextRolldownDir, "dist", "client")); - results.vinextRolldown.bundleSize = rdSize; - console.log( - ` vinext (Rolldown): ${rdSize.files} files, ${formatBytes(rdSize.raw)} raw, ${formatBytes(rdSize.gzip)} gzip`, - ); - } } // ─── 3. Dev Server Cold Start ────────────────────────────────────────────── if (!SKIP_DEV) { console.log("\n=== Dev Server Cold Start ===\n"); - const devResults = { nextjs: [], vinext: [], rolldown: [] }; + const devResults = { nextjs: [], vinext: [] }; // Define the runners; order is randomized each iteration to eliminate // positional bias (first-after-kill penalties, OS cache warming, etc.) @@ -484,7 +421,7 @@ async function main() { }, { key: "vinext", - label: "vinext (Rollup)", + label: "vinext", run: async () => { exec("rm -rf node_modules/.vite", { cwd: vinextDir }); return startAndMeasure( @@ -495,23 +432,6 @@ async function main() { ); }, }, - ...(hasRolldown - ? [ - { - key: "rolldown", - label: "vinext (Rolldown)", - run: async () => { - exec("rm -rf node_modules/.vite", { cwd: vinextRolldownDir }); - return startAndMeasure( - "./node_modules/.bin/vp", - ["dev", "--port", "4102"], - vinextRolldownDir, - "http://localhost:4102", - ); - }, - }, - ] - : []), ]; const runOrders = []; @@ -549,13 +469,6 @@ async function main() { meanRssKb: avg(devResults.vinext.map((r) => r.peakRssKb)), runs: devResults.vinext, }; - if (hasRolldown && devResults.rolldown.length) { - results.vinextRolldown.devColdStart = { - meanMs: avg(devResults.rolldown.map((r) => r.coldStartMs)), - meanRssKb: avg(devResults.rolldown.map((r) => r.peakRssKb)), - runs: devResults.rolldown, - }; - } results.devRunOrders = runOrders; } @@ -586,16 +499,11 @@ async function main() { md += `- **Build runs**: ${results.buildRuns}\n`; md += `- **Dev cold start runs**: ${results.devRuns}\n`; if (results.system.nextjsVersion) md += `- **Next.js**: ${results.system.nextjsVersion}\n`; - if (results.system.viteVersion) md += `- **Vite (Rollup)**: ${results.system.viteVersion}\n`; - if (results.system.viteRolldownVersion) - md += `- **Vite (Rolldown)**: ${results.system.viteRolldownVersion}\n`; + if (results.system.viteVersion) md += `- **Vite**: ${results.system.viteVersion}\n`; md += "\n"; md += `> **Note:** TypeScript type checking is disabled for the Next.js build (\`typescript.ignoreBuildErrors: true\`) so that build timings measure bundler/compilation speed only. Vite does not type-check during build.\n\n`; md += `> **Methodology:** Build and dev cold start runs are executed in randomized order to eliminate positional bias from filesystem caches, CPU thermal state, and residual process state.\n\n`; - const hasRolldownResults = - results.vinextRolldown && Object.keys(results.vinextRolldown).length > 0; - // Format a speed ratio comparison: "2.1x faster" or "1.3x slower" function fmtSpeedup(baseline, value) { if (!baseline || !value) return "N/A"; @@ -617,12 +525,8 @@ async function main() { md += `## Production Build Time\n\n`; md += `| Framework | Mean | StdDev | Min | Max | vs Next.js |\n`; md += `|-----------|------|--------|-----|-----|------------|\n`; - md += `| Next.js 16 (Turbopack) | ${formatMs(results.nextjs.buildTime.mean)} | ±${formatMs(results.nextjs.buildTime.stddev)} | ${formatMs(results.nextjs.buildTime.min)} | ${formatMs(results.nextjs.buildTime.max)} | baseline |\n`; - md += `| vinext (Vite 7 / Rollup) | ${formatMs(results.vinext.buildTime.mean)} | ±${formatMs(results.vinext.buildTime.stddev)} | ${formatMs(results.vinext.buildTime.min)} | ${formatMs(results.vinext.buildTime.max)} | ${fmtSpeedup(results.nextjs.buildTime.mean, results.vinext.buildTime.mean)} |\n`; - - if (hasRolldownResults && results.vinextRolldown.buildTime) { - md += `| vinext (Vite 8 / Rolldown) | ${formatMs(results.vinextRolldown.buildTime.mean)} | ±${formatMs(results.vinextRolldown.buildTime.stddev)} | ${formatMs(results.vinextRolldown.buildTime.min)} | ${formatMs(results.vinextRolldown.buildTime.max)} | ${fmtSpeedup(results.nextjs.buildTime.mean, results.vinextRolldown.buildTime.mean)} |\n`; - } + md += `| Next.js (Turbopack) | ${formatMs(results.nextjs.buildTime.mean)} | ±${formatMs(results.nextjs.buildTime.stddev)} | ${formatMs(results.nextjs.buildTime.min)} | ${formatMs(results.nextjs.buildTime.max)} | baseline |\n`; + md += `| vinext (Vite 8) | ${formatMs(results.vinext.buildTime.mean)} | ±${formatMs(results.vinext.buildTime.stddev)} | ${formatMs(results.vinext.buildTime.min)} | ${formatMs(results.vinext.buildTime.max)} | ${fmtSpeedup(results.nextjs.buildTime.mean, results.vinext.buildTime.mean)} |\n`; md += "\n"; } @@ -630,12 +534,8 @@ async function main() { md += `## Production Bundle Size (Client)\n\n`; md += `| Framework | Files | Raw | Gzipped | vs Next.js (gzip) |\n`; md += `|-----------|-------|-----|----------|--------------------|\n`; - md += `| Next.js 16 | ${results.nextjs.bundleSize.files} | ${formatBytes(results.nextjs.bundleSize.raw)} | ${formatBytes(results.nextjs.bundleSize.gzip)} | baseline |\n`; - md += `| vinext (Rollup) | ${results.vinext.bundleSize.files} | ${formatBytes(results.vinext.bundleSize.raw)} | ${formatBytes(results.vinext.bundleSize.gzip)} | ${fmtSizeReduction(results.nextjs.bundleSize.gzip, results.vinext.bundleSize.gzip)} |\n`; - - if (hasRolldownResults && results.vinextRolldown.bundleSize) { - md += `| vinext (Rolldown) | ${results.vinextRolldown.bundleSize.files} | ${formatBytes(results.vinextRolldown.bundleSize.raw)} | ${formatBytes(results.vinextRolldown.bundleSize.gzip)} | ${fmtSizeReduction(results.nextjs.bundleSize.gzip, results.vinextRolldown.bundleSize.gzip)} |\n`; - } + md += `| Next.js (Turbopack) | ${results.nextjs.bundleSize.files} | ${formatBytes(results.nextjs.bundleSize.raw)} | ${formatBytes(results.nextjs.bundleSize.gzip)} | baseline |\n`; + md += `| vinext (Vite 8) | ${results.vinext.bundleSize.files} | ${formatBytes(results.vinext.bundleSize.raw)} | ${formatBytes(results.vinext.bundleSize.gzip)} | ${fmtSizeReduction(results.nextjs.bundleSize.gzip, results.vinext.bundleSize.gzip)} |\n`; md += "\n"; } @@ -643,12 +543,8 @@ async function main() { md += `## Dev Server Cold Start\n\n`; md += `| Framework | Mean Cold Start | Mean Peak RSS | vs Next.js |\n`; md += `|-----------|----------------|----------------|------------|\n`; - md += `| Next.js 16 (Turbopack) | ${formatMs(results.nextjs.devColdStart.meanMs)} | ${Math.round(results.nextjs.devColdStart.meanRssKb / 1024)} MB | baseline |\n`; - md += `| vinext (Vite 7 / Rollup) | ${formatMs(results.vinext.devColdStart.meanMs)} | ${Math.round(results.vinext.devColdStart.meanRssKb / 1024)} MB | ${fmtSpeedup(results.nextjs.devColdStart.meanMs, results.vinext.devColdStart.meanMs)} |\n`; - - if (hasRolldownResults && results.vinextRolldown.devColdStart) { - md += `| vinext (Vite 8 / Rolldown) | ${formatMs(results.vinextRolldown.devColdStart.meanMs)} | ${Math.round(results.vinextRolldown.devColdStart.meanRssKb / 1024)} MB | ${fmtSpeedup(results.nextjs.devColdStart.meanMs, results.vinextRolldown.devColdStart.meanMs)} |\n`; - } + md += `| Next.js (Turbopack) | ${formatMs(results.nextjs.devColdStart.meanMs)} | ${Math.round(results.nextjs.devColdStart.meanRssKb / 1024)} MB | baseline |\n`; + md += `| vinext (Vite 8) | ${formatMs(results.vinext.devColdStart.meanMs)} | ${Math.round(results.vinext.devColdStart.meanRssKb / 1024)} MB | ${fmtSpeedup(results.nextjs.devColdStart.meanMs, results.vinext.devColdStart.meanMs)} |\n`; md += "\n"; } diff --git a/benchmarks/vinext-rolldown/package.json b/benchmarks/vinext-rolldown/package.json deleted file mode 100644 index d114e67cc..000000000 --- a/benchmarks/vinext-rolldown/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "benchmark-vinext-rolldown", - "private": true, - "type": "module", - "scripts": { - "dev": "vp dev", - "build": "vp build", - "preview": "vp preview" - }, - "dependencies": { - "@vitejs/plugin-react": "catalog:", - "react": "catalog:", - "react-dom": "catalog:", - "react-server-dom-webpack": "catalog:", - "vinext": "workspace:*" - }, - "devDependencies": { - "@vitejs/plugin-rsc": "catalog:", - "vite": "catalog:", - "vite-plus": "catalog:" - } -} diff --git a/benchmarks/vinext-rolldown/tsconfig.json b/benchmarks/vinext-rolldown/tsconfig.json deleted file mode 100644 index d899beda7..000000000 --- a/benchmarks/vinext-rolldown/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "lib": ["dom", "dom.iterable", "esnext"], - "module": "esnext", - "moduleResolution": "bundler", - "jsx": "react-jsx", - "strict": true, - "noEmit": true, - "skipLibCheck": true, - "esModuleInterop": true, - "resolveJsonModule": true, - "isolatedModules": true, - "paths": { - "@/*": ["./*"] - } - }, - "include": ["**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] -} diff --git a/benchmarks/vinext-rolldown/vite.config.ts b/benchmarks/vinext-rolldown/vite.config.ts deleted file mode 100644 index 88f1c2014..000000000 --- a/benchmarks/vinext-rolldown/vite.config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { defineConfig } from "vite-plus"; -import vinext from "vinext"; - -export default defineConfig({ - plugins: [vinext()], -}); diff --git a/examples/benchmarks/README.md b/examples/benchmarks/README.md index 95f35eaae..e74329131 100644 --- a/examples/benchmarks/README.md +++ b/examples/benchmarks/README.md @@ -2,7 +2,7 @@ A dashboard for viewing vinext performance benchmarks, built with the App Router on Cloudflare Workers. -Compares build times and metrics across Next.js 16 (Turbopack), vinext (Rollup), and vinext (Rolldown) on every merge to main. +Compares build times and metrics across Next.js (Turbopack) and vinext (Vite 8) on every merge to main. Uses a D1 database for benchmark storage and Tailwind CSS for styling. diff --git a/examples/benchmarks/app/components/dashboard.tsx b/examples/benchmarks/app/components/dashboard.tsx index c43382e21..055ce9821 100644 --- a/examples/benchmarks/app/components/dashboard.tsx +++ b/examples/benchmarks/app/components/dashboard.tsx @@ -272,13 +272,13 @@ function CommitList({ commits }: { commits: BenchmarkCommit[] }) { Commit Date - Build Time (vinext Rolldown) - Client Bundle Size (vinext Rolldown) + Build Time (vinext) + Client Bundle Size (vinext) {commits.map((c) => { - const rd = c.runners.vinext_rolldown; + const vn = c.runners.vinext; return ( @@ -295,8 +295,8 @@ function CommitList({ commits }: { commits: BenchmarkCommit[] }) { {new Date(c.commitDate).toLocaleDateString()} - {rd ? formatMs(rd.buildTimeMean) : "-"} - {rd ? formatBytes(rd.bundleSizeGzip) : "-"} + {vn ? formatMs(vn.buildTimeMean) : "-"} + {vn ? formatBytes(vn.bundleSizeGzip) : "-"} ); })} diff --git a/examples/benchmarks/app/components/format.ts b/examples/benchmarks/app/components/format.ts index 4730b0801..7e122ca2b 100644 --- a/examples/benchmarks/app/components/format.ts +++ b/examples/benchmarks/app/components/format.ts @@ -50,13 +50,11 @@ export function isImprovement(label: string | null): boolean { } export const RUNNER_LABELS: Record = { - nextjs: "Next.js 16 (Turbopack)", - vinext: "vinext (Vite 7 / Rollup)", - vinext_rolldown: "vinext (Vite 8 / Rolldown)", + nextjs: "Next.js (Turbopack)", + vinext: "vinext (Vite 8)", }; export const RUNNER_COLORS: Record = { nextjs: "var(--color-chart-nextjs, #f97316)", vinext: "var(--color-chart-vinext, #3b82f6)", - vinext_rolldown: "var(--color-chart-rolldown, #8b5cf6)", }; diff --git a/examples/benchmarks/app/page.tsx b/examples/benchmarks/app/page.tsx index aadaec245..aef13b950 100644 --- a/examples/benchmarks/app/page.tsx +++ b/examples/benchmarks/app/page.tsx @@ -10,8 +10,8 @@ export default function HomePage() {

Performance Dashboard

- Benchmarks run on every merge to main. Comparing Next.js 16 (Turbopack) vs vinext - (Rollup) vs vinext (Rolldown). + Benchmarks run on every merge to main. Comparing Next.js (Turbopack) vs vinext (Vite + 8).

diff --git a/examples/benchmarks/app/styles.css b/examples/benchmarks/app/styles.css index 8c88282ba..1c2d3b3c2 100644 --- a/examples/benchmarks/app/styles.css +++ b/examples/benchmarks/app/styles.css @@ -5,7 +5,6 @@ @theme { --color-chart-nextjs: #f97316; --color-chart-vinext: #3b82f6; - --color-chart-rolldown: #8b5cf6; --color-faster: #22c55e; --color-slower: #ef4444; diff --git a/examples/benchmarks/migrations/0001_init.sql b/examples/benchmarks/migrations/0001_init.sql index 8c1bbb9d0..08dde6034 100644 --- a/examples/benchmarks/migrations/0001_init.sql +++ b/examples/benchmarks/migrations/0001_init.sql @@ -1,5 +1,5 @@ -- Benchmark results: one row per runner per commit. --- Three rows per benchmark run (nextjs, vinext, vinext_rolldown). +-- Two rows per benchmark run (nextjs, vinext). CREATE TABLE IF NOT EXISTS benchmark_results ( id INTEGER PRIMARY KEY AUTOINCREMENT, @@ -11,7 +11,7 @@ CREATE TABLE IF NOT EXISTS benchmark_results ( -- Run metadata run_date TEXT NOT NULL, - runner TEXT NOT NULL CHECK(runner IN ('nextjs', 'vinext', 'vinext_rolldown')), + runner TEXT NOT NULL CHECK(runner IN ('nextjs', 'vinext')), -- Build time (ms) build_time_mean REAL, diff --git a/examples/benchmarks/migrations/0002_remove_rolldown_runner.sql b/examples/benchmarks/migrations/0002_remove_rolldown_runner.sql new file mode 100644 index 000000000..4b5b16b2c --- /dev/null +++ b/examples/benchmarks/migrations/0002_remove_rolldown_runner.sql @@ -0,0 +1,5 @@ +-- Remove vinext_rolldown benchmark data. +-- The Vite 7 / Rollup runner was identical to the Vite 8 / Rolldown runner +-- (both resolved to the same Vite version), so the data was duplicated. +-- Going forward only 'nextjs' and 'vinext' runners are tracked. +DELETE FROM benchmark_results WHERE runner = 'vinext_rolldown'; diff --git a/examples/benchmarks/worker/index.ts b/examples/benchmarks/worker/index.ts index 1993292f2..cb0837e76 100644 --- a/examples/benchmarks/worker/index.ts +++ b/examples/benchmarks/worker/index.ts @@ -16,7 +16,6 @@ interface Env { const RUNNER_MAP: Record = { nextjs: "nextjs", vinext: "vinext", - vinextRolldown: "vinext_rolldown", }; export default { diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index feca49d72..23d8db266 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,7 +4,6 @@ packages: - tests/fixtures/* - tests/fixtures/ecosystem/* - benchmarks/vinext - - benchmarks/vinext-rolldown catalog: "@cloudflare/kumo": ^1.6.0