mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2025-12-17 17:51:24 +01:00
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:
parent
996b653421
commit
91bd678535
2 changed files with 31 additions and 5 deletions
|
|
@ -463,7 +463,7 @@ Add your lore here...
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
// List all notes with basic info
|
// List all notes with basic info (reads frontmatter - slow for large vaults)
|
||||||
async function listAllNotes() {
|
async function listAllNotes() {
|
||||||
const allFiles = await getVaultFiles();
|
const allFiles = await getVaultFiles();
|
||||||
const notes = [];
|
const notes = [];
|
||||||
|
|
@ -495,6 +495,25 @@ Add your lore here...
|
||||||
return notes;
|
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 {
|
return {
|
||||||
init,
|
init,
|
||||||
config,
|
config,
|
||||||
|
|
@ -509,7 +528,8 @@ Add your lore here...
|
||||||
findNoteByFmgId,
|
findNoteByFmgId,
|
||||||
generateNoteTemplate,
|
generateNoteTemplate,
|
||||||
searchNotes,
|
searchNotes,
|
||||||
listAllNotes
|
listAllNotes,
|
||||||
|
listAllNotePaths
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -300,16 +300,19 @@ async function promptCreateNewNote(elementId, elementType, coordinates) {
|
||||||
};
|
};
|
||||||
|
|
||||||
const showBrowse = async () => {
|
const showBrowse = async () => {
|
||||||
resultsDiv.innerHTML = "<p>Loading all notes...</p>";
|
resultsDiv.innerHTML = "<p>Loading file list...</p>";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const allNotes = await ObsidianBridge.listAllNotes();
|
// Use fast path-only listing (doesn't read file contents)
|
||||||
|
const allNotes = await ObsidianBridge.listAllNotePaths();
|
||||||
|
|
||||||
if (allNotes.length === 0) {
|
if (allNotes.length === 0) {
|
||||||
resultsDiv.innerHTML = "<p style='color: #999;'>No notes in vault</p>";
|
resultsDiv.innerHTML = "<p style='color: #999;'>No notes in vault</p>";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INFO && console.log(`Displaying ${allNotes.length} notes in folder tree`);
|
||||||
|
|
||||||
// Build folder tree
|
// Build folder tree
|
||||||
const tree = buildFolderTree(allNotes);
|
const tree = buildFolderTree(allNotes);
|
||||||
resultsDiv.innerHTML = renderFolderTree(tree, allNotes);
|
resultsDiv.innerHTML = renderFolderTree(tree, allNotes);
|
||||||
|
|
@ -321,12 +324,15 @@ async function promptCreateNewNote(elementId, elementType, coordinates) {
|
||||||
$("#alert").dialog("close");
|
$("#alert").dialog("close");
|
||||||
try {
|
try {
|
||||||
const note = allNotes[index];
|
const note = allNotes[index];
|
||||||
|
// Read the file content only when clicked
|
||||||
const content = await ObsidianBridge.getNote(note.path);
|
const content = await ObsidianBridge.getNote(note.path);
|
||||||
|
const {frontmatter} = ObsidianBridge.parseFrontmatter(content);
|
||||||
|
|
||||||
resolve({
|
resolve({
|
||||||
path: note.path,
|
path: note.path,
|
||||||
name: note.name,
|
name: note.name,
|
||||||
content,
|
content,
|
||||||
frontmatter: note.frontmatter
|
frontmatter
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
reject(error);
|
reject(error);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue