From d9fdded7fb1af74d780777fb65e512f14d2aec8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E4=B9=8B?= Date: Wed, 23 Apr 2025 18:07:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 31 ++++-- src/app/migrate.ts | 107 +++++++++++++++++++-- src/app/service/service_worker/index.ts | 10 +- src/app/service/service_worker/resource.ts | 14 ++- src/app/service/service_worker/runtime.ts | 16 +-- src/offscreen.ts | 1 - src/pages/confirm/main.tsx | 3 - src/pages/import/main.tsx | 3 - src/pages/install/main.tsx | 3 - src/pages/options/main.tsx | 3 - src/pages/popup/main.tsx | 3 - src/service_worker.ts | 3 +- 12 files changed, 156 insertions(+), 41 deletions(-) diff --git a/.gitignore b/.gitignore index 80f0d14..712080a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,16 +1,31 @@ -# Local -.DS_Store -*.local -*.log* +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* -# Dist node_modules -dist/ +dist +dist-ssr +*.local -# IDE -.vscode/* +# Editor directories and files +.vscode !.vscode/extensions.json .idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? coverage +CHANGELOG.md + tailwind.config.js + +.env diff --git a/src/app/migrate.ts b/src/app/migrate.ts index ffd1a30..e2aac01 100644 --- a/src/app/migrate.ts +++ b/src/app/migrate.ts @@ -1,8 +1,9 @@ import { db } from "./repo/dao"; -import { Script } from "./repo/scripts"; +import { Script, ScriptAndCode, ScriptCodeDAO, ScriptDAO } from "./repo/scripts"; +import { Subscribe, SubscribeDAO } from "./repo/subscribe"; // 0.10.0重构,重命名字段,统一使用小峰驼 -function renameField(): void { +function renameField() { db.version(16) .stores({ scripts: @@ -33,9 +34,100 @@ function renameField(): void { export: "++id,&scriptId", }); // 将脚本数据迁移到chrome.storage - // db.version(18) - // .stores({}) - // .upgrade((tx) => {}); + db.version(18).upgrade(async (tx) => { + // 迁移脚本 + const scripts = await tx.table("scripts").toArray(); + const scriptDAO = new ScriptDAO(); + const scriptCodeDAO = new ScriptCodeDAO(); + await Promise.all( + scripts.map((script: ScriptAndCode) => { + const { + uuid, + name, + namespace, + author, + originDomain, + subscribeUrl, + type, + sort, + status, + runStatus, + metadata, + createtime, + checktime, + code, + } = script; + return scriptDAO + .save({ + uuid, + name, + namespace, + author, + originDomain, + subscribeUrl, + type, + sort, + status, + runStatus, + metadata, + createtime, + checktime, + }) + .then((s) => + scriptCodeDAO.save({ + uuid: s.uuid, + code, + }) + ); + }) + ); + // 迁移订阅 + const subscribe = await tx.table("subscribe").toArray(); + const subscribeDAO = new SubscribeDAO(); + await Promise.all( + subscribe.map((s: Subscribe) => { + const { url, name, code, author, scripts, metadata, status, createtime, updatetime, checktime } = s; + return subscribeDAO.save({ + url, + name, + code, + author, + scripts, + metadata, + status, + createtime, + updatetime, + checktime, + }); + }) + ); + // 迁移value + interface MV2Value { + id: number; + scriptId: number; + storageName?: string; + key: string; + value: any; + createtime: number; + updatetime: number; + } + const values = await tx.table("value").toArray(); + const valueDAO = new ScriptCodeDAO(); + await Promise.all( + values.map((v) => { + const { scriptId, storageName, key, value, createtime } = v; + return valueDAO.save({ + scriptId, + storageName, + key, + value, + createtime, + }); + }) + ); + // 迁移permission + }); + return db.open(); } export default function migrate() { @@ -90,7 +182,8 @@ export default function migrate() { value: "++id,scriptId,storageName,key,createtime", }) .upgrade((tx) => { - tx.table("value") + return tx + .table("value") .toCollection() .modify((value) => { if (value.namespace) { @@ -112,5 +205,5 @@ export default function migrate() { permission: "++id,scriptId,[scriptId+permission+permissionValue],createtime,updatetime", }); // 使用小峰驼统一命名规范 - renameField(); + return renameField(); } diff --git a/src/app/service/service_worker/index.ts b/src/app/service/service_worker/index.ts index d6903af..7990090 100644 --- a/src/app/service/service_worker/index.ts +++ b/src/app/service/service_worker/index.ts @@ -35,7 +35,15 @@ export default class ServiceWorkerManager { const value = new ValueService(this.api.group("value"), this.sender); const script = new ScriptService(systemConfig, this.api.group("script"), this.mq, value, resource); script.init(); - const runtime = new RuntimeService(systemConfig, this.api.group("runtime"), this.sender, this.mq, value, script); + const runtime = new RuntimeService( + systemConfig, + this.api.group("runtime"), + this.sender, + this.mq, + value, + script, + resource + ); runtime.init(); const popup = new PopupService(this.api.group("popup"), this.mq, runtime); popup.init(); diff --git a/src/app/service/service_worker/resource.ts b/src/app/service/service_worker/resource.ts index 722807b..4da28c3 100644 --- a/src/app/service/service_worker/resource.ts +++ b/src/app/service/service_worker/resource.ts @@ -36,12 +36,22 @@ export class ResourceService { return Promise.resolve(undefined); } + cache: Map = new Map(); + public async getScriptResources(script: Script): Promise<{ [key: string]: Resource }> { - return Promise.resolve({ + // 优先从内存中获取 + if (this.cache.has(script.uuid)) { + return Promise.resolve(this.cache.get(script.uuid) || {}); + } + // 资源不存在,重新加载 + const res = await Promise.resolve({ ...((await this.getResourceByType(script, "require")) || {}), ...((await this.getResourceByType(script, "require-css")) || {}), ...((await this.getResourceByType(script, "resource")) || {}), }); + // 缓存到内存 + this.cache.set(script.uuid, res); + return res; } async getResourceByType(script: Script, type: ResourceType): Promise<{ [key: string]: Resource }> { @@ -159,6 +169,8 @@ export class ResourceService { } public async addResource(url: string, uuid: string, type: ResourceType): Promise { + // 删除缓存 + this.cache.delete(uuid); const u = this.parseUrl(url); let result = await this.getResourceModel(u.url); // 资源不存在,重新加载 diff --git a/src/app/service/service_worker/runtime.ts b/src/app/service/service_worker/runtime.ts index 11fda21..23d09ef 100644 --- a/src/app/service/service_worker/runtime.ts +++ b/src/app/service/service_worker/runtime.ts @@ -26,8 +26,9 @@ import Logger from "@App/app/logger/logger"; import LoggerCore from "@App/app/logger/core"; import PermissionVerify from "./permission_verify"; import { SystemConfig } from "@App/pkg/config/config"; +import { ResourceService } from "./resource"; -// 为了优化性能,存储到缓存时删除了code与value +// 为了优化性能,存储到缓存时删除了code、value与resource export interface ScriptMatchInfo extends ScriptRunResouce { matches: string[]; excludeMatches: string[]; @@ -54,7 +55,8 @@ export class RuntimeService { private sender: MessageSend, private mq: MessageQueue, private value: ValueService, - private script: ScriptService + private script: ScriptService, + private resource: ResourceService ) {} async init() { @@ -212,18 +214,18 @@ export class RuntimeService { return scriptRes; }); - const enableScript = scripts.filter((item) => item); + const enableScript = scripts.filter((item) => item) as ScriptMatchInfo[]; await Promise.all([ // 加载value ...enableScript.map(async (script) => { const value = await this.value.getScriptValue(script!); - script!.value = value; + script.value = value; }), // 加载resource ...enableScript.map(async (script) => { - // const resource = await this.script.buildScriptRunResource(script!); - // script!.resource = resource; + const resource = await this.resource.getScriptResources(script); + script.resource = resource; }), ]); @@ -328,8 +330,10 @@ export class RuntimeService { this.scriptMatchCache.forEach((val, key) => { scriptMatch[key] = val; // 优化性能,将不需要的信息去掉 + // 而且可能会超过缓存的存储限制 scriptMatch[key].code = ""; scriptMatch[key].value = {}; + scriptMatch[key].resource = {}; }); return await Cache.getInstance().set("scriptMatch", scriptMatch); } diff --git a/src/offscreen.ts b/src/offscreen.ts index ca8bc1d..c0e2ca4 100644 --- a/src/offscreen.ts +++ b/src/offscreen.ts @@ -4,7 +4,6 @@ import DBWriter from "./app/logger/db_writer"; import { LoggerDAO } from "./app/repo/logger"; import { OffscreenManager } from "./app/service/offscreen"; -// 初始化数据库 migrate(); function main() { diff --git a/src/pages/confirm/main.tsx b/src/pages/confirm/main.tsx index 488abc3..08e1a84 100644 --- a/src/pages/confirm/main.tsx +++ b/src/pages/confirm/main.tsx @@ -8,12 +8,9 @@ import "@App/index.css"; import { Provider } from "react-redux"; import { store } from "@App/pages/store/store.ts"; import LoggerCore from "@App/app/logger/core.ts"; -import migrate from "@App/app/migrate.ts"; import { LoggerDAO } from "@App/app/repo/logger.ts"; import DBWriter from "@App/app/logger/db_writer.ts"; -// 初始化数据库 -migrate(); // 初始化日志组件 const loggerCore = new LoggerCore({ writer: new DBWriter(new LoggerDAO()), diff --git a/src/pages/import/main.tsx b/src/pages/import/main.tsx index 7c5685c..0aced25 100644 --- a/src/pages/import/main.tsx +++ b/src/pages/import/main.tsx @@ -8,12 +8,9 @@ import "@App/index.css"; import { Provider } from "react-redux"; import { store } from "@App/pages/store/store.ts"; import LoggerCore from "@App/app/logger/core.ts"; -import migrate from "@App/app/migrate.ts"; import { LoggerDAO } from "@App/app/repo/logger.ts"; import DBWriter from "@App/app/logger/db_writer.ts"; -// 初始化数据库 -migrate(); // 初始化日志组件 const loggerCore = new LoggerCore({ writer: new DBWriter(new LoggerDAO()), diff --git a/src/pages/install/main.tsx b/src/pages/install/main.tsx index 4a85f4a..ed8a1a9 100644 --- a/src/pages/install/main.tsx +++ b/src/pages/install/main.tsx @@ -8,12 +8,9 @@ import "@App/index.css"; import { Provider } from "react-redux"; import { store } from "@App/pages/store/store.ts"; import LoggerCore from "@App/app/logger/core.ts"; -import migrate from "@App/app/migrate.ts"; import { LoggerDAO } from "@App/app/repo/logger.ts"; import DBWriter from "@App/app/logger/db_writer.ts"; -// 初始化数据库 -migrate(); // 初始化日志组件 const loggerCore = new LoggerCore({ writer: new DBWriter(new LoggerDAO()), diff --git a/src/pages/options/main.tsx b/src/pages/options/main.tsx index 07af97e..6837f09 100644 --- a/src/pages/options/main.tsx +++ b/src/pages/options/main.tsx @@ -8,15 +8,12 @@ import "@arco-design/web-react/dist/css/arco.css"; import "@App/locales/locales"; import "@App/index.css"; import "./index.css"; -import migrate from "@App/app/migrate.ts"; import LoggerCore from "@App/app/logger/core.ts"; import { LoggerDAO } from "@App/app/repo/logger.ts"; import DBWriter from "@App/app/logger/db_writer.ts"; import registerEditor from "@App/pkg/utils/monaco-editor.ts"; import storeSubscribe from "../store/subscribe.ts"; -// 初始化数据库 -migrate(); registerEditor(); // 初始化日志组件 const loggerCore = new LoggerCore({ diff --git a/src/pages/popup/main.tsx b/src/pages/popup/main.tsx index 0dfb338..bcae2c1 100644 --- a/src/pages/popup/main.tsx +++ b/src/pages/popup/main.tsx @@ -2,7 +2,6 @@ import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App.tsx"; import LoggerCore from "@App/app/logger/core.ts"; -import migrate from "@App/app/migrate.ts"; import { LoggerDAO } from "@App/app/repo/logger.ts"; import DBWriter from "@App/app/logger/db_writer.ts"; import "@arco-design/web-react/dist/css/arco.css"; @@ -12,8 +11,6 @@ import "./index.css"; import { Provider } from "react-redux"; import { store } from "../store/store.ts"; -// 初始化数据库 -migrate(); // 初始化日志组件 const loggerCore = new LoggerCore({ writer: new DBWriter(new LoggerDAO()), diff --git a/src/service_worker.ts b/src/service_worker.ts index 1127401..9a3d196 100644 --- a/src/service_worker.ts +++ b/src/service_worker.ts @@ -1,5 +1,4 @@ import ServiceWorkerManager from "./app/service/service_worker"; -import migrate from "./app/migrate"; import LoggerCore from "./app/logger/core"; import DBWriter from "./app/logger/db_writer"; import { LoggerDAO } from "./app/repo/logger"; @@ -7,8 +6,8 @@ import { ExtensionMessage } from "@Packages/message/extension_message"; import { Server } from "@Packages/message/server"; import { MessageQueue } from "@Packages/message/message_queue"; import { ServiceWorkerMessageSend } from "@Packages/message/window_message"; +import migrate from "./app/migrate"; -// 初始化数据库 migrate(); const OFFSCREEN_DOCUMENT_PATH = "src/offscreen.html";