From 78d1b3ad08a19b8db69fdb186e328557549e30b1 Mon Sep 17 00:00:00 2001 From: ychebotaev Date: Thu, 30 Jan 2025 23:14:20 +0500 Subject: [PATCH 1/2] Faster search by offload fuse to worker --- assets/js/fastsearch.js | 87 ++++++++++++++++++++++++++++------------- 1 file changed, 60 insertions(+), 27 deletions(-) diff --git a/assets/js/fastsearch.js b/assets/js/fastsearch.js index 9484e751..5461b871 100644 --- a/assets/js/fastsearch.js +++ b/assets/js/fastsearch.js @@ -1,21 +1,26 @@ import * as params from '@params'; -let fuse; // holds our search engine let resList = document.getElementById('searchResults'); let sInput = document.getElementById('searchInput'); let first, last, current_elem = null let resultsAvailable = false; +const currentScriptSrc = document.currentScript.src +let data, options + +/** @type {Worker} */ +let fuseWorker + // load our search index window.onload = function () { let xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status === 200) { - let data = JSON.parse(xhr.responseText); + data = JSON.parse(xhr.responseText); if (data) { // fuse.js options; check fuse.js website for details - let options = { + options = { distance: 100, threshold: 0.4, ignoreLocation: true, @@ -41,7 +46,55 @@ window.onload = function () { ignoreLocation: params.fuseOpts.ignorelocation ?? true } } - fuse = new Fuse(data, options); // build the index from the json file + // fuse = new Fuse(data, options); // build the index from the json file + + fetch(currentScriptSrc) + .then(resp => resp.text()) + .then(currentScriptCode => { + const m = currentScriptCode.match(/Fuse=t\(\);/) + const fuseScript = currentScriptCode.slice(0, m.index) + 'Fuse=t();' + + const workerScript = ` + ${fuseScript}; + + let data = ${JSON.stringify(data)}; + let options = ${JSON.stringify(options)}; + let fuse = new Fuse(data, options); + + onmessage = (e) => { + const results = fuse.search(e.data) + + postMessage(results) + } + ` + const workerScriptBlob = new Blob([workerScript], { type: 'script/js' }) + const workerScriptUrl = URL.createObjectURL(workerScriptBlob) + + fuseWorker = new Worker(workerScriptUrl) + + fuseWorker.addEventListener('message', (ev) => { + const results = ev.data + + if (results.length !== 0) { + // build our html if result exists + let resultSet = ''; // our results bucket + + for (let item in results) { + resultSet += `
  • ${results[item].item.title} »
    ` + + `
  • ` + } + + resList.innerHTML = resultSet; + resultsAvailable = true; + first = resList.firstChild; + last = resList.lastChild; + } else { + resultsAvailable = false; + resList.innerHTML = ''; + } + }) + }) + } } else { console.log(xhr.responseText); @@ -76,30 +129,10 @@ function reset() { sInput.onkeyup = function (e) { // run a search query (for "term") every time a letter is typed // in the search box - if (fuse) { - let results; - if (params.fuseOpts) { - results = fuse.search(this.value.trim(), {limit: params.fuseOpts.limit}); // the actual query being run using fuse.js along with options - } else { - results = fuse.search(this.value.trim()); // the actual query being run using fuse.js - } - if (results.length !== 0) { - // build our html if result exists - let resultSet = ''; // our results bucket + if (fuseWorker) { + // const results = fuse.search(this.value.trim()); // the actual query being run using fuse.js - for (let item in results) { - resultSet += `
  • ${results[item].item.title} »
    ` + - `
  • ` - } - - resList.innerHTML = resultSet; - resultsAvailable = true; - first = resList.firstChild; - last = resList.lastChild; - } else { - resultsAvailable = false; - resList.innerHTML = ''; - } + fuseWorker.postMessage(this.value.trim()) } } From eebef5fd7f7bb98073b7dcfaa8e4a5c343ebc2db Mon Sep 17 00:00:00 2001 From: ychebotaev Date: Thu, 30 Jan 2025 23:18:55 +0500 Subject: [PATCH 2/2] Remove unnecessary comments --- assets/js/fastsearch.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/assets/js/fastsearch.js b/assets/js/fastsearch.js index 5461b871..2270f7b8 100644 --- a/assets/js/fastsearch.js +++ b/assets/js/fastsearch.js @@ -46,7 +46,6 @@ window.onload = function () { ignoreLocation: params.fuseOpts.ignorelocation ?? true } } - // fuse = new Fuse(data, options); // build the index from the json file fetch(currentScriptSrc) .then(resp => resp.text()) @@ -130,8 +129,6 @@ sInput.onkeyup = function (e) { // run a search query (for "term") every time a letter is typed // in the search box if (fuseWorker) { - // const results = fuse.search(this.value.trim()); // the actual query being run using fuse.js - fuseWorker.postMessage(this.value.trim()) } }