Skip to content

Commit 5b9c37d

Browse files
committed
✨ 优化加载逻辑 #135
1 parent 826d164 commit 5b9c37d

File tree

6 files changed

+73
-50
lines changed

6 files changed

+73
-50
lines changed

build/assets/template/background.html

-4
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,7 @@
22
<html>
33
<head>
44
<meta charset="UTF-8" />
5-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6-
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
7-
<title><%= htmlWebpackPlugin.options.title %></title>
85
</head>
9-
106
<body>
117
<iframe
128
src="/src/sandbox.html"

src/app/message/center.ts

+7-5
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,12 @@ export default class MessageCenter
1616
extends MessageHander
1717
implements IMessageBroadcast
1818
{
19-
sandbox: Window;
19+
sandbox?: Window;
2020

2121
logger: Logger;
2222

2323
constructor() {
2424
super();
25-
// eslint-disable-next-line no-undef
26-
this.sandbox = sandbox;
2725
this.logger = LoggerCore.getInstance().logger({
2826
component: "messageCenter",
2927
});
@@ -33,6 +31,10 @@ export default class MessageCenter
3331

3432
streamMap: Map<string, string> = new Map();
3533

34+
setSandbox(sandbox: Window) {
35+
this.sandbox = sandbox;
36+
}
37+
3638
public start() {
3739
// 基于chrome.runtime.onConnect去做
3840
chrome.runtime.onConnect.addListener((port) => {
@@ -80,7 +82,7 @@ export default class MessageCenter
8082
});
8183
});
8284
const sandboxMessage = new WarpChannelManager((data) => {
83-
this.sandbox.postMessage(data, "*");
85+
this.sandbox?.postMessage(data, "*");
8486
});
8587
// 监听沙盒消息
8688
window.addEventListener("message", (event) => {
@@ -124,7 +126,7 @@ export default class MessageCenter
124126
return;
125127
}
126128
if (target.tag === "sandbox") {
127-
this.sandbox.postMessage(data, "*");
129+
this.sandbox?.postMessage(data, "*");
128130
return;
129131
}
130132
const connectMap = this.connectMap.get(target.tag);

src/background.ts

+31-29
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import SystemManager from "./app/service/system/manager";
1818
import SynchronizeManager from "./app/service/synchronize/manager";
1919
import SubscribeManager from "./app/service/subscribe/manager";
2020

21+
console.log(new Date().getTime(), "bg");
22+
2123
// 数据库初始化
2224
migrate();
2325
// 初始化日志组件
@@ -28,12 +30,11 @@ const loggerCore = new LoggerCore({
2830
});
2931

3032
loggerCore.logger().debug("background start");
31-
// 沙盒通讯
32-
// eslint-disable-next-line no-undef
33-
const sandboxConnect = new MessageSandbox(sandbox);
3433
// 通讯中心
3534
const center = new MessageCenter();
3635
center.start();
36+
console.log(new Date().getTime(), "bg");
37+
3738
IoC.registerInstance(MessageCenter, center).alias([
3839
MessageHander,
3940
MessageBroadcast,
@@ -44,33 +45,34 @@ ListenerMessage(new LoggerDAO(), center);
4445
IoC.instance(SystemConfig).init();
4546

4647
// 等待沙盒启动后再进行后续的步骤
47-
const sandboxOnload = () => {
48-
IoC.instance(SystemManager).init();
49-
// 资源管理器
50-
const resourceManager = new ResourceManager(center);
51-
// value管理器
52-
const valueManager = new ValueManager(center, center);
53-
const runtime = new Runtime(
54-
center,
55-
sandboxConnect,
56-
resourceManager,
57-
valueManager
58-
);
59-
IoC.registerInstance(Runtime, runtime);
60-
// 脚本后台处理器
61-
runtime.start();
62-
// 值后台处理器
63-
valueManager.start();
64-
// 资源后台处理器
65-
resourceManager.start();
66-
(IoC.instance(ScriptManager) as ScriptManager).start();
67-
(IoC.instance(SubscribeManager) as SubscribeManager).start();
68-
// 同步处理器
69-
IoC.instance(SynchronizeManager).start();
70-
return Promise.resolve(true);
71-
};
48+
IoC.instance(SystemManager).init();
49+
// 资源管理器
50+
const resourceManager = new ResourceManager(center);
51+
// value管理器
52+
const valueManager = new ValueManager(center, center);
53+
const runtime = new Runtime(center, resourceManager, valueManager);
54+
IoC.registerInstance(Runtime, runtime);
55+
// 脚本后台处理器
56+
runtime.start();
57+
// 值后台处理器
58+
valueManager.start();
59+
// 资源后台处理器
60+
resourceManager.start();
61+
(IoC.instance(ScriptManager) as ScriptManager).start();
62+
(IoC.instance(SubscribeManager) as SubscribeManager).start();
63+
// 同步处理器
64+
IoC.instance(SynchronizeManager).start();
7265

73-
center.setHandler("sandboxOnload", sandboxOnload);
66+
// 监听沙盒加载
67+
window.onload = () => {
68+
// 沙盒通讯
69+
// eslint-disable-next-line no-undef
70+
const sandboxConnect = new MessageSandbox(sandbox);
71+
runtime.startSandbox(sandboxConnect);
72+
};
73+
center.setHandler("sandboxOnload", () => {
74+
return Promise.resolve(true);
75+
});
7476
// 启动gm api的监听
7577
const gm = new GMApi(center, new PermissionVerify());
7678
gm.start();

src/runtime/background/gm_api.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,7 @@ export default class GMApi {
632632
@PermissionVerify.API({
633633
listener() {
634634
PermissionVerify.textarea.style.display = "none";
635-
document.body.appendChild(PermissionVerify.textarea);
635+
document.documentElement.appendChild(PermissionVerify.textarea);
636636
document.addEventListener("copy", (e: ClipboardEvent) => {
637637
if (!GMApi.clipboardData || !e.clipboardData) {
638638
return;

src/runtime/background/runtime.ts

+33-11
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export type ScriptMenu = {
5656
// 后台脚本将会将代码注入到沙盒中
5757
@IoC.Singleton(MessageHander, MessageSandbox, ResourceManager, ValueManager)
5858
export default class Runtime extends Manager {
59-
messageSandbox: MessageSandbox;
59+
messageSandbox?: MessageSandbox;
6060

6161
scriptDAO: ScriptDAO;
6262

@@ -82,13 +82,11 @@ export default class Runtime extends Manager {
8282

8383
constructor(
8484
message: MessageHander,
85-
messageSandbox: MessageSandbox,
8685
resourceManager: ResourceManager,
8786
valueManager: ValueManager
8887
) {
8988
super(message, "runtime");
9089
this.scriptDAO = new ScriptDAO();
91-
this.messageSandbox = messageSandbox;
9290
this.resourceManager = resourceManager;
9391
this.valueManager = valueManager;
9492
this.scriptFlag = randomString(8);
@@ -136,25 +134,27 @@ export default class Runtime extends Manager {
136134
// 监听脚本运行状态
137135
this.listenScriptRunStatus();
138136

137+
// 启动普通脚本
139138
this.scriptDAO.table.toArray((items) => {
140139
items.forEach((item) => {
141140
// 容错处理
142141
if (!item) {
143142
this.logger.error("script is null");
144143
return;
145144
}
145+
if (item.type !== SCRIPT_TYPE_NORMAL) {
146+
return;
147+
}
146148
// 加载所有的脚本
147149
if (item.status === SCRIPT_STATUS_ENABLE) {
148150
this.enable(item);
149-
if (item.type !== SCRIPT_TYPE_NORMAL) {
150-
this.runBackScript.set(item.id, item);
151-
}
152-
} else if (item.type === SCRIPT_TYPE_NORMAL) {
151+
} else {
153152
// 只处理未开启的普通页面脚本
154153
this.disable(item);
155154
}
156155
});
157156
});
157+
158158
// 接受消息,注入脚本
159159
// 获取注入源码
160160
const { scriptFlag } = this;
@@ -503,6 +503,28 @@ export default class Runtime extends Manager {
503503
);
504504
}
505505

506+
// 启动沙盒相关脚本
507+
startSandbox(messageSandbox: MessageSandbox) {
508+
this.messageSandbox = messageSandbox;
509+
this.scriptDAO.table.toArray((items) => {
510+
items.forEach((item) => {
511+
// 容错处理
512+
if (!item) {
513+
this.logger.error("script is null");
514+
return;
515+
}
516+
if (item.type === SCRIPT_TYPE_NORMAL) {
517+
return;
518+
}
519+
// 加载所有的脚本
520+
if (item.status === SCRIPT_STATUS_ENABLE) {
521+
this.enable(item);
522+
this.runBackScript.set(item.id, item);
523+
}
524+
});
525+
});
526+
}
527+
506528
listenScriptRunStatus() {
507529
// 监听沙盒发送的脚本运行状态消息
508530
this.message.setHandler(
@@ -644,7 +666,7 @@ export default class Runtime extends Manager {
644666
this.runBackScript.set(script.id, script);
645667
return new Promise((resolve, reject) => {
646668
this.messageSandbox
647-
.syncSend("enable", script)
669+
?.syncSend("enable", script)
648670
.then(() => {
649671
resolve(true);
650672
})
@@ -660,7 +682,7 @@ export default class Runtime extends Manager {
660682
this.runBackScript.delete(script.id);
661683
return new Promise((resolve, reject) => {
662684
this.messageSandbox
663-
.syncSend("disable", script.id)
685+
?.syncSend("disable", script.id)
664686
.then(() => {
665687
resolve(true);
666688
})
@@ -673,14 +695,14 @@ export default class Runtime extends Manager {
673695

674696
async startBackgroundScript(script: Script) {
675697
const scriptRes = await this.buildScriptRunResource(script);
676-
this.messageSandbox.syncSend("start", scriptRes);
698+
this.messageSandbox?.syncSend("start", scriptRes);
677699
return Promise.resolve(true);
678700
}
679701

680702
stopBackgroundScript(scriptId: number) {
681703
return new Promise((resolve, reject) => {
682704
this.messageSandbox
683-
.syncSend("stop", scriptId)
705+
?.syncSend("stop", scriptId)
684706
.then((resp) => {
685707
resolve(resp);
686708
})

webpack.config.ts

+1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ const config: Configuration = {
8282
removeComments: true,
8383
},
8484
chunks: ["background"],
85+
scriptLoading: "blocking",
8586
}),
8687
new HtmlWebpackPlugin({
8788
filename: `${dist}/ext/src/confirm.html`,

0 commit comments

Comments
 (0)