feat: move syntax highlighting off main thread via Web Worker pool

Adds a 2-worker pool in use-syntax-highlight.ts so shiki tokenisation
runs off the main thread. Callers continue to receive null while the
worker is in flight and a LineTokenMap once it resolves — no caller
changes needed.

Fallback: if Worker construction is blocked (e.g. CSP), the hook falls
back to the existing createHighlighter singleton but processes 200 lines
at a time, yielding between chunks via scheduler.yield()/setTimeout(0)
to avoid long tasks.

Also adds worker.format:'es' to vite.config.ts (required when the app
uses code-splitting) and covers all paths with Vitest tests.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lukas May
2026-03-06 19:39:31 +01:00
parent 2eccde0ee1
commit 0608900a53
5 changed files with 501 additions and 30 deletions

View File

@@ -10,6 +10,11 @@ export default defineConfig({
"@": path.resolve(__dirname, "./src"),
},
},
worker: {
// ES module workers are required when the app uses code-splitting (Rollup
// can't bundle IIFE workers alongside dynamic imports).
format: "es",
},
server: {
proxy: {
"/trpc": {