perf(obsidian): optimize folder tree for large vaults

The previous implementation read ALL file contents to get frontmatter
when browsing notes, which caused massive slowdown for large vaults
(13k+ files = 13k+ HTTP requests).

Changes:
- Add listAllNotePaths() function that only gets file paths (fast)
- Build folder tree from paths only, no content reading
- Lazy load file content only when user clicks on a file
- Change message from "Loading all notes" to "Loading file list"
- Add logging to show file count being displayed

Performance improvement:
- Before: O(n) HTTP requests where n = number of files
- After: O(1) - just the recursive directory scan
- File content loaded on-demand (1 request per clicked file)

This makes the folder tree instant even for vaults with 10k+ files.
This commit is contained in:
Claude 2025-11-14 05:18:07 +00:00
parent 996b653421
commit 91bd678535
No known key found for this signature in database
2 changed files with 31 additions and 5 deletions

View file

@ -463,7 +463,7 @@ Add your lore here...
return results;
}
// List all notes with basic info
// List all notes with basic info (reads frontmatter - slow for large vaults)
async function listAllNotes() {
const allFiles = await getVaultFiles();
const notes = [];
@ -495,6 +495,25 @@ Add your lore here...
return notes;
}
// List just file paths (fast - no content reading)
async function listAllNotePaths() {
const allFiles = await getVaultFiles();
INFO && console.log(`listAllNotePaths: Found ${allFiles.length} files`);
// Convert to note objects with just path and name
const notes = allFiles.map(filePath => ({
path: filePath,
name: filePath.split("/").pop().replace(".md", ""),
folder: filePath.includes("/") ? filePath.substring(0, filePath.lastIndexOf("/")) : ""
}));
// Sort by path
notes.sort((a, b) => a.path.localeCompare(b.path));
return notes;
}
return {
init,
config,
@ -509,7 +528,8 @@ Add your lore here...
findNoteByFmgId,
generateNoteTemplate,
searchNotes,
listAllNotes
listAllNotes,
listAllNotePaths
};
})();