From 6564aca947b18e0d4defa0d8e65e0510462466ab Mon Sep 17 00:00:00 2001 From: "lcj.licunjie" <1067532060@qq.com> Date: Tue, 3 Jun 2025 23:32:18 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=E6=B2=99=E7=AE=B1=E6=89=A7=E8=A1=8Cjs?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=97=B6=E5=A2=9E=E5=8A=A0=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/sandbox/src/constant.ts | 68 ++++++++++++++++++++++++++++++++ packages/sandbox/src/index.ts | 6 ++- 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 packages/sandbox/src/constant.ts diff --git a/packages/sandbox/src/constant.ts b/packages/sandbox/src/constant.ts new file mode 100644 index 00000000..26df7344 --- /dev/null +++ b/packages/sandbox/src/constant.ts @@ -0,0 +1,68 @@ + +export const globalsInES2015 = window.Proxy + ? [ + 'Array', + 'ArrayBuffer', + 'Boolean', + 'constructor', + 'DataView', + 'Date', + 'decodeURI', + 'decodeURIComponent', + 'encodeURI', + 'encodeURIComponent', + 'Error', + 'escape', + 'eval', + 'EvalError', + 'Float32Array', + 'Float64Array', + 'Function', + 'hasOwnProperty', + 'Infinity', + 'Int16Array', + 'Int32Array', + 'Int8Array', + 'isFinite', + 'isNaN', + 'isPrototypeOf', + 'JSON', + 'Map', + 'Math', + 'NaN', + 'Number', + 'Object', + 'parseFloat', + 'parseInt', + 'Promise', + 'propertyIsEnumerable', + 'Proxy', + 'RangeError', + 'ReferenceError', + 'Reflect', + 'RegExp', + 'Set', + 'String', + 'Symbol', + 'SyntaxError', + 'toLocaleString', + 'toString', + 'TypeError', + 'Uint16Array', + 'Uint32Array', + 'Uint8Array', + 'Uint8ClampedArray', + 'undefined', + 'unescape', + 'URIError', + 'valueOf', + 'WeakMap', + 'WeakSet', + ].filter((p) => /* just keep the available properties in current window context */ p in window) + : []; + const overwrittenGlobals = ['window', 'self', 'hasOwnProperty'] + export const cachedGlobals = Array.from( + new Set( + globalsInES2015.concat(overwrittenGlobals).concat('requestAnimationFrame') + ), + ); \ No newline at end of file diff --git a/packages/sandbox/src/index.ts b/packages/sandbox/src/index.ts index b91cf98e..71b6d37c 100644 --- a/packages/sandbox/src/index.ts +++ b/packages/sandbox/src/index.ts @@ -1,3 +1,4 @@ +import { cachedGlobals } from './constant'; export interface SandboxProps { multiMode?: boolean; } @@ -99,7 +100,7 @@ export default class Sandbox { if (!originalWindow.hasOwnProperty(p)) { // record value added in sandbox propertyAdded[p] = value; - // eslint-disable-next-line no-prototype-builtins + // eslint-disable-next-line no-prototype-builtins } else if (!originalValues.hasOwnProperty(p)) { // if it is already been setted in original window, record it's original value originalValues[p] = originalWindow[p]; @@ -191,6 +192,9 @@ export default class Sandbox { this.createProxySandbox(); } try { + // Concatenate scopedGlobalVariables into variable declarations to cache global variables, avoiding proxy traversal on every use. + const scopedGlobalVariableDefinition = cachedGlobals.length ? `const {${cachedGlobals.join(',')}}=sandbox;` : ''; + script =scopedGlobalVariableDefinition +script const execScript = `with (sandbox) {;${script}\n}`; // eslint-disable-next-line no-new-func const code = new Function('sandbox', execScript).bind(this.sandbox); From 1d26b2cb96f3ea42c122828f6ab2ab6bd9d4fbf0 Mon Sep 17 00:00:00 2001 From: ClarkXia Date: Wed, 23 Jul 2025 21:19:20 +0800 Subject: [PATCH 2/2] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/sandbox/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sandbox/src/index.ts b/packages/sandbox/src/index.ts index 71b6d37c..3f54570c 100644 --- a/packages/sandbox/src/index.ts +++ b/packages/sandbox/src/index.ts @@ -194,7 +194,7 @@ export default class Sandbox { try { // Concatenate scopedGlobalVariables into variable declarations to cache global variables, avoiding proxy traversal on every use. const scopedGlobalVariableDefinition = cachedGlobals.length ? `const {${cachedGlobals.join(',')}}=sandbox;` : ''; - script =scopedGlobalVariableDefinition +script + script = scopedGlobalVariableDefinition + script; const execScript = `with (sandbox) {;${script}\n}`; // eslint-disable-next-line no-new-func const code = new Function('sandbox', execScript).bind(this.sandbox);