Skip to content

Commit baef917

Browse files
committed
feat(search): use dexie.js instead of localStorage
1 parent 1e9d2f0 commit baef917

File tree

4 files changed

+36
-18
lines changed

4 files changed

+36
-18
lines changed

package-lock.json

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"*.js": "eslint --fix"
3737
},
3838
"dependencies": {
39+
"dexie": "^4.0.8",
3940
"medium-zoom": "^1.1.0",
4041
"opencollective-postinstall": "^2.0.2",
4142
"prismjs": "^1.29.0",

src/plugins/search/search.js

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,24 @@ import {
22
getAndRemoveConfig,
33
getAndRemoveDocsifyIgnoreConfig,
44
} from '../../core/render/utils.js';
5+
import Dexie from 'dexie';
56

6-
let INDEXS = {};
7+
let INDEXES = {};
8+
9+
const db = new Dexie('DocsifySearchDB');
10+
db.version(1).stores({
11+
search: 'key, value',
12+
});
13+
14+
async function saveData(maxAge, expireKey, indexKey) {
15+
await db.search.put({ key: expireKey, value: Date.now() + maxAge });
16+
await db.search.put({ key: indexKey, value: JSON.stringify(INDEXES) });
17+
}
18+
19+
async function getData(key) {
20+
const item = await db.search.get(key);
21+
return item ? item.value : null;
22+
}
723

824
const LOCAL_STORAGE = {
925
EXPIRE_KEY: 'docsify.search.expires',
@@ -73,11 +89,6 @@ function getListData(token) {
7389
return token.text;
7490
}
7591

76-
function saveData(maxAge, expireKey, indexKey) {
77-
localStorage.setItem(expireKey, Date.now() + maxAge);
78-
localStorage.setItem(indexKey, JSON.stringify(INDEXS));
79-
}
80-
8192
export function genIndex(path, content = '', router, depth) {
8293
const tokens = window.marked.lexer(content);
8394
const slugify = window.Docsify.slugify;
@@ -149,10 +160,10 @@ export function ignoreDiacriticalMarks(keyword) {
149160
export function search(query) {
150161
const matchingResults = [];
151162
let data = [];
152-
Object.keys(INDEXS).forEach(key => {
163+
Object.keys(INDEXES).forEach(key => {
153164
data = [
154165
...data,
155-
...Object.keys(INDEXS[key]).map(page => INDEXS[key][page]),
166+
...Object.keys(INDEXES[key]).map(page => INDEXES[key][page]),
156167
];
157168
});
158169

@@ -235,7 +246,7 @@ export function search(query) {
235246
return matchingResults.sort((r1, r2) => r2.score - r1.score);
236247
}
237248

238-
export function init(config, vm) {
249+
export async function init(config, vm) {
239250
const isAuto = config.paths === 'auto';
240251
const paths = isAuto ? getAllPaths(vm.router) : config.paths;
241252

@@ -269,12 +280,12 @@ export function init(config, vm) {
269280
const expireKey = resolveExpireKey(config.namespace) + namespaceSuffix;
270281
const indexKey = resolveIndexKey(config.namespace) + namespaceSuffix;
271282

272-
const isExpired = localStorage.getItem(expireKey) < Date.now();
283+
const isExpired = (await getData(expireKey)) < Date.now();
273284

274-
INDEXS = JSON.parse(localStorage.getItem(indexKey));
285+
INDEXES = JSON.parse(await getData(indexKey));
275286

276287
if (isExpired) {
277-
INDEXS = {};
288+
INDEXES = {};
278289
} else if (!isAuto) {
279290
return;
280291
}
@@ -283,14 +294,16 @@ export function init(config, vm) {
283294
let count = 0;
284295

285296
paths.forEach(path => {
286-
if (INDEXS[path]) {
297+
if (INDEXES[path]) {
287298
return count++;
288299
}
289300

290301
Docsify.get(vm.router.getFile(path), false, vm.config.requestHeaders).then(
291-
result => {
292-
INDEXS[path] = genIndex(path, result, vm.router, config.depth);
293-
len === ++count && saveData(config.maxAge, expireKey, indexKey);
302+
async result => {
303+
INDEXES[path] = genIndex(path, result, vm.router, config.depth);
304+
if (len === ++count) {
305+
await saveData(config.maxAge, expireKey, indexKey);
306+
}
294307
},
295308
);
296309
});

test/integration/example.test.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ describe('Creating a Docsify site (integration tests in Jest)', function () {
2020
const docsifyInitConfig = {
2121
config: {
2222
name: 'Docsify Name',
23-
themeColor: 'red',
2423
},
2524
markdown: {
2625
coverpage: `
@@ -76,7 +75,6 @@ describe('Creating a Docsify site (integration tests in Jest)', function () {
7675

7776
// Verify config options
7877
expect(typeof window.$docsify).toBe('object');
79-
expect(window.$docsify).toHaveProperty('themeColor', 'red');
8078
expect(document.querySelector('.app-name').textContent).toContain(
8179
'Docsify Name',
8280
);

0 commit comments

Comments
 (0)