@@ -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+
86104export 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