Move the build to vite 8, and chunk the way rolldown wants

@vitejs/plugin-react 6 peers on vite ^8 and nothing lower, so the build
had to move before the plugin could. vite 8 bundles with rolldown rather
than rollup, which is most of what is here.

The object form of `manualChunks` -- a chunk name against the list of
packages in it -- is gone; rolldown takes groups tested against module
paths instead. Same two chunks come out, `vendor` and `icons`, with the
same contents; `icons` is tried first because the first matching group
wins. `rollupOptions` is now a deprecated alias, so it is spelled
`rolldownOptions`.

The lockfile is regenerated rather than patched. vitest depends on vite
itself, and an incremental install was happy to leave 6.4.3 hoisted for
vitest while web built against 8.3.0 -- two majors in one tree, which is
not a state to ship. A clean install collapses to one.

vite 8 wants Node ^20.19 || >=22.12, above the >=20.10 the README and
engines promised, so both say 20.19 now. CI and the image are on 22 and
were never affected.

Rolldown reports two modules that are imported both statically and
dynamically, so the dynamic import cannot split them out. That is true
of the source either way -- store/sieve.ts has three static importers
and one dynamic -- and is left alone here.
This commit is contained in:
2026-09-10 08:03:40 -07:00
parent d90a1cef93
commit 53ccaad468
5 changed files with 601 additions and 1484 deletions
+1 -1
View File
@@ -347,7 +347,7 @@ missing.
## Development ## Development
Requirements: Node ≥ 20.10 (22 recommended), npm ≥ 10. Requirements: Node ≥ 20.19 (22 recommended), npm ≥ 10.
```bash ```bash
npm install npm install
+581 -1476
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -10,7 +10,7 @@
"web" "web"
], ],
"engines": { "engines": {
"node": ">=20.10" "node": ">=20.19"
}, },
"scripts": { "scripts": {
"dev": "concurrently -n server,web -c blue,magenta \"npm run dev -w server\" \"npm run dev -w web\"", "dev": "concurrently -n server,web -c blue,magenta \"npm run dev -w server\" \"npm run dev -w web\"",
+2 -2
View File
@@ -25,10 +25,10 @@
"devDependencies": { "devDependencies": {
"@types/react": "^19.0.10", "@types/react": "^19.0.10",
"@types/react-dom": "^19.2.7", "@types/react-dom": "^19.2.7",
"@vitejs/plugin-react": "^4.3.4", "@vitejs/plugin-react": "^6.1.1",
"jsdom": "^26.0.0", "jsdom": "^26.0.0",
"typescript": "^5.7.3", "typescript": "^5.7.3",
"vite": "^6.2.0", "vite": "^8.3.0",
"vitest": "^4.1.11" "vitest": "^4.1.11"
} }
} }
+16 -4
View File
@@ -44,11 +44,23 @@ export default defineConfig({
build: { build: {
target: "es2022", target: "es2022",
sourcemap: false, sourcemap: false,
rollupOptions: { rolldownOptions: {
output: { output: {
manualChunks: { /*
vendor: ["wouter", "zustand", "dompurify", "@tanstack/react-virtual"], * Rolldown, which vite 8 bundles with, dropped the object form of
icons: ["lucide-react"], * `manualChunks` -- naming a chunk and listing the packages in it --
* and takes groups matched against module paths instead. Same two
* chunks out the other end; `icons` is listed first because groups are
* tried in order and the first match wins.
*/
codeSplitting: {
groups: [
{ name: "icons", test: /node_modules[\\/]lucide-react[\\/]/ },
{
name: "vendor",
test: /node_modules[\\/](wouter|zustand|dompurify|@tanstack[\\/]react-virtual)[\\/]/,
},
],
}, },
}, },
}, },