Watch mode now rebuilds only the pages affected by a change, template and markdown caches survive across rebuilds, Liquid renders ~15% faster, and CSS edits hot-swap stylesheets without a page reload.
Added
Incremental watch rebuilds. Editing a page or partial in watch mode now
recompiles only the pages whose last render actually touched the changed
file, instead of the whole site. The engines track which templates each page
pulled in, and the search index, sitemap and nav are patched in place from
the previous build's entries. Anything that can't be proven identical to a
full build — deletions, renames, collection membership changes, a
published flip, front matter drift that would shift the shared nav —
falls back to a full compile automatically, so output is always the same
as a from-scratch build.
Engine-owned data files go incremental too (v1.5.3). A changed .json
can be a data file feeding the globals or engine-owned markup (Shopify
templates/*.json, section groups). Engines now claim theirs, so a Shopify
template edit takes the incremental path instead of reloading all data and
full-compiling.
CSS hot-swap in livereload. When everything in a reload window is CSS,
the changed stylesheets are swapped in place — styles update without a page
reload, no flicker, no lost scroll position or form state. Anything else
still triggers a full refresh.
Changed
Livereload fires on build completion, not on file change. The livereload
server no longer watches the filesystem — previously every output file
written during a build could fire its own reload, flickering the browser
mid-write. Now the rebuild chains signal a single debounced refresh once
their compile settles: one save, one reload, after dist is current.
Caches survive across watch rebuilds. Compiled templates and rendered
markdown are no longer thrown away on every compile; only the changed file's
entries are invalidated. Repeat rebuilds skip re-parsing everything that
didn't change.
Liquid renders ~15% faster. The Liquid engine uses the synchronous
render path — thousands of small renders were paying for promise
scaffolding, not template work. All built-in filters and tags are
sync-compatible.
Page writes are async. Output files are written with non-blocking I/O,
so writing one page overlaps rendering the next.
Search index keywords are memoized. Keyword extraction is cached per
page and reused when the rendered content hasn't changed, so regenerating
the search index on a one-page rebuild doesn't re-extract every page.
Data files are memoized. JSON/YAML data files are cached by mtime+size —
a watch change to one data file re-reads only that file instead of
re-parsing all of them.
Fixed
Nunjucks includes with a single includePaths entry resolve again. The
loader built a one-element brace glob ({_partials}/**), which glob treats
as literal characters — the pattern never matched and the template was
reported missing. A single path now skips the braces.
The Nunjucks loader no longer crashes on an unresolvable template path — a
missing template logs an error instead of throwing on undefined.