如何解决FLP中"String as JavaScript"错误?(异步模块加载)
解答
一、异步模块加载与CSP的关联
启用异步模块加载后,Launchpad会切换为ES模块(ES Modules)机制加载前端资源,这一模式直接触发SAP强制执行的严格CSP规则:
- ES模块的安全设计天然禁止通过字符串求值(如
eval()、new Function())执行代码,因此SAP的CSP规则中移除了unsafe-eval权限——这个权限原本允许部分非规范的字符串代码执行。 - 未启用异步加载时,部分依赖
unsafe-eval的代码可能绕过检查运行,但异步模式下浏览器会严格执行CSP规则,直接拦截所有依赖字符串求值的代码,从而出现上述报错。
简言之:异步模块加载是触发严格CSP规则的开关,CSP规则的收紧直接限制了依赖unsafe-eval的代码运行。
二、SAPUI5代码调整方案
要符合SAP的CSP规则,核心是彻底移除所有依赖unsafe-eval的代码逻辑,具体调整点如下:
- 禁用动态代码执行API:删除所有
eval()、new Function()、setTimeout("字符串代码")、setInterval("字符串代码")这类写法。例如将setTimeout("myFunc()", 1000)改为setTimeout(myFunc, 1000)。 - 规范SAPUI5 API使用:
- 避免使用
jQuery.globalEval()这类隐含执行字符串的API,改用sap.ui.define/sap.ui.require模块导入或直接函数调用。 - 检查自定义控件、渲染器或扩展中的动态代码逻辑,替换为静态代码或SAPUI5提供的安全替代API。
- 避免使用
- 采用模块化加载:确保所有SAPUI5模块、第三方库都通过官方模块化机制加载,禁止通过动态创建
<script>标签、字符串拼接路径等方式加载资源。 - 排查第三方依赖:确认引入的第三方库是否兼容CSP规范,替换掉依赖
unsafe-eval的版本,或改用无此类依赖的替代库。 - 移除
javascript:伪协议:将所有通过javascript:触发的交互逻辑,替换为SAPUI5标准事件绑定方式(如attachPress、attachChange等)。
内容的提问来源于stack exchange,提问作者Boghyon Hoffmann
相关产品推荐
相关产品推荐

