Skip to content

Commit 1fe8d20

Browse files
authored
♻️ 优化注入代码 减少不必要的行数 (#1246)
* 减少不必要的行数 * unit test fix
1 parent 524a47c commit 1fe8d20

2 files changed

Lines changed: 30 additions & 16 deletions

File tree

src/app/service/content/utils.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ describe("utils", () => {
5050
expect(result).toContain("try {");
5151
expect(result).toContain("} catch (e) {");
5252
expect(result).toContain("with(arguments[0]||this.$)");
53-
expect(result).toContain("return (async function(){");
53+
expect(result).toContain("return(async function(){");
5454
});
5555

5656
it.concurrent("应该处理自定义脚本代码参数", () => {

src/app/service/content/utils.ts

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,24 @@ export function compileScriptCode(scriptRes: ScriptRunResource, scriptCode?: str
8383
});
8484
}
8585

86+
const addTryCatch = (code: string) =>
87+
`
88+
try {
89+
{{functionBody}}
90+
} catch (e) {
91+
if (e.message && e.stack) {
92+
console.error("ERROR: Execution of script '" + arguments[1] + "' failed! " + e.message);
93+
console.log(e.stack);
94+
} else {
95+
console.error(e);
96+
}
97+
}
98+
`
99+
.trim()
100+
.replace(/[\r\n]/g, "")
101+
.replace(/\s+/g, " ")
102+
.replace("{{functionBody}}", code);
103+
86104
export function compileScriptCodeByResource(resource: CompileScriptCodeResource): string {
87105
const requireCode = resource.require.map((r) => r.content).join("\n;");
88106
const preCode = requireCode; // 不需要 async 封装
@@ -93,21 +111,17 @@ export function compileScriptCodeByResource(resource: CompileScriptCodeResource)
93111
// 使用sandboxContext时,arguments[0]为undefined, this.$则为一次性Proxy变量,用于全域拦截context
94112
// 非沙盒环境时,先读取 arguments[0],因此不会读取页面环境的 this.$
95113
// 在UserScripts API中,由于执行不是在物件导向里呼叫,使用arrow function的话会把this改变。须使用 .call(this) [ 或 .bind(this)() ]
96-
const codeBody = `try {
97-
with(arguments[0]||this.$){
98-
${preCode}
99-
return (async function(){
100-
${code}
101-
}).call(this);
102-
}
103-
} catch (e) {
104-
if (e.message && e.stack) {
105-
console.error("ERROR: Execution of script '" + arguments[1] + "' failed! " + e.message);
106-
console.log(e.stack);
107-
} else {
108-
console.error(e);
109-
}
110-
}`;
114+
115+
const joinedCode = [
116+
"with(arguments[0]||this.$){",
117+
`${preCode}`,
118+
"return(async function(){",
119+
`${code}`,
120+
"}).call(this);}",
121+
]
122+
.filter(Boolean)
123+
.join("\n");
124+
const codeBody = addTryCatch(joinedCode);
111125
return `${codeBody}${sourceMapTo(`${resource.name}.user.js`)}\n`;
112126
}
113127

0 commit comments

Comments
 (0)