Skip to content

Commit 2a23841

Browse files
committed
feat(search): use dexie.js instead of localStorage
1 parent 90c0b02 commit 2a23841

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
getAndRemoveDocisfyIgnoreConfig,
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

@@ -240,7 +251,7 @@ export function search(query) {
240251
return matchingResults.sort((r1, r2) => r2.score - r1.score);
241252
}
242253

243-
export function init(config, vm) {
254+
export async function init(config, vm) {
244255
const isAuto = config.paths === 'auto';
245256
const paths = isAuto ? getAllPaths(vm.router) : config.paths;
246257

@@ -274,12 +285,12 @@ export function init(config, vm) {
274285
const expireKey = resolveExpireKey(config.namespace) + namespaceSuffix;
275286
const indexKey = resolveIndexKey(config.namespace) + namespaceSuffix;
276287

277-
const isExpired = localStorage.getItem(expireKey) < Date.now();
288+
const isExpired = (await getData(expireKey)) < Date.now();
278289

279-
INDEXS = JSON.parse(localStorage.getItem(indexKey));
290+
INDEXES = JSON.parse(await getData(indexKey));
280291

281292
if (isExpired) {
282-
INDEXS = {};
293+
INDEXES = {};
283294
} else if (!isAuto) {
284295
return;
285296
}
@@ -288,14 +299,16 @@ export function init(config, vm) {
288299
let count = 0;
289300

290301
paths.forEach(path => {
291-
if (INDEXS[path]) {
302+
if (INDEXES[path]) {
292303
return count++;
293304
}
294305

295306
Docsify.get(vm.router.getFile(path), false, vm.config.requestHeaders).then(
296-
result => {
297-
INDEXS[path] = genIndex(path, result, vm.router, config.depth);
298-
len === ++count && saveData(config.maxAge, expireKey, indexKey);
307+
async result => {
308+
INDEXES[path] = genIndex(path, result, vm.router, config.depth);
309+
if (len === ++count) {
310+
await saveData(config.maxAge, expireKey, indexKey);
311+
}
299312
},
300313
);
301314
});

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)