First stable on the 7.4 line. Aggregates everything from the 7.4.0-beta.1 → 7.4.0-beta.8 cycle. See CHANGELOG.md for the per-beta breakdown.
Features
- FuseWorker — parallel search via Web Workers (9ba192c). New
FuseWorkerclass shards the collection across workers, runs searches in parallel, and preserves the same result ordering asFuse. See the Web Workers guide. - token-search:
tokenMatch: 'all' | 'any'option for AND/OR semantics (#827, 9f979d0). Default'any'preserves existing behavior;'all'requires every query word to match somewhere in a record (term-centric AND), useful for filter-style queries. - token-search: customizable tokenizer with unicode-aware default (#821, 8e55cae). New
tokenize?: RegExp | (text: string) => string[]option; the default regex now segments CJK, Cyrillic, Greek, Arabic, etc. out of the box.
Bug Fixes
- matches: report array-path keys as dotted strings (acd54e8). Previously
match.keyleaked a rawstring[]for keys declared as path arrays (e.g.keys: [['author', 'firstName']]), contradicting the documentedFuseResultMatch.key: stringtype. Now emits the canonical dotted string ('author.firstName'). Behavior change: consumers relying on the array shape need to update. - bitap: restrict highlight indices to matched window (#792, 622f105). Closes #505, #611, #691, #793.
- index: correct doc-index alignment for
Fuse<string>with blank docs (0b8e3ca). - core: invalidate searcher cache on collection mutation (fcf4228).
- token-search: renumber inverted index after doc removal (ea9356d).
- workers: preserve global
refIndexacross shards (e4217f9), match Fuse ordering and reject non-cloneable options (d571390), rejectuseTokenSearchinFuseWorker(8c6183d). - match: explicitly reject
useTokenSearchinFuse.match(3959d91). - correct
fieldCountaccounting and add reverse lookup in inverted index (54e702c). - guard against empty-string crash in
fieldNorm(e550ab1); skip consecutive spaces infieldNormword counting (5929af6). - types: resolve typecheck errors and align
KeyStoretypes (dbc115d). - docs: reflect data edits in playground demo (#825, 6eff909).
Performance
- reuse bit arrays in Bitap search instead of allocating per error level (ec9b446)
- replace
forEachwithforloops in search hot paths (1945f49) - fast-path
Math.powwhen exponent is 1 incomputeScore(c82de57) - pre-allocate records array and use
forloops inFuseIndex.create(5800036) - replace regex with loop for word counting in
fieldNorm(5517a9b) - use
filterinstead of reverse-splice inremoveAll/remove(c74823b, 8372b0a) - token-search: drop unused postings from inverted index (5ea216f)
Internal
- refactor: replace extended-search matcher classes with plain functions (f8d61c9)
- bench: consolidate
benchmark/intobench/and add npm scripts (3b3a4c6) - ci: update Node matrix to 20, 22, 24 (b906906)
- chore(deps): pin secure versions via npm overrides (3a1b118)
Docs
- Migrated the site from VuePress to VitePress (663ee53)
- New articles: "Using Fuse.js with React" (512bc7d), "Fuse.js vs Semantic Search" (5f93b4d)
- New interactive demos in the fuzzy search article (edit distance, Bitap, threshold, search window)
- Web Workers documentation and demo
- Fuse Cloud landing page with waitlist
Behavior changes worth noting
FuseResultMatch.keynow returns a dotted string for array-path keys (was a rawstring[]in violation of the documented type). If you were doingmatch.key.join('.')to recover the dotted form, drop the.join.