如何找到加载缓慢的 SAPUI5 应用程序的加载瓶颈

2023-12-06

我正在构建一个自定义 SAPUI5 应用程序,其中包含七个图表(sap.viz.ui5.controls.VizFrame)在页面的标题内容中(嵌套在sap.suite.ui.commons.ChartContainer)和网格表(sap.ui.table.Table)在主要内容区域。图表和表格的数据由 OData V2 服务提供,并且该应用程序在最新版本 (1.81.0) 上独立运行。

问题是应用程序的加载时间较长。需要 7 到 20 秒。这对于“更复杂”的应用程序来说很常见吗?我试图找到瓶颈,但一切看起来都很好。许多网络请求都会被缓存(它们需要 0 毫秒),但是它们之间有轻微的延迟,我不明白为什么。此外,尽管我使用的是data-sap-async="true" in my index.html file:

[弃用] 主线程上的同步 XMLHttpRequest 已弃用,因为它会对最终用户的体验产生不利影响。如需更多帮助,请检查https://xhr.spec.whatwg.org/。 [syncXHRFix-dbg.js:211:15]

我的index.html和manifest.json的代码片段

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Loading - Customer Fact Sheet</title>
        <script id="sap-ui-bootstrap"
            src="resources/sap-ui-core.js"
            data-sap-ui-theme="sap_fiori_3"
            data-sap-ui-resourceroots='{"com.schott.fiori.customerfactsheet.customerfactsheet-fiori3": "./"}'
            data-sap-ui-compatVersion="edge"
            data-sap-ui-oninit="module:sap/ui/core/ComponentSupport"
            data-sap-ui-async="true"
            data-sap-ui-frameOptions="trusted">
        </script>
        <link href="https://www.schott.com/static/assets/gfx/favicon/SCHOTT_16.png" rel="shortcut icon" type="image/png" />
    </head>
    <body class="sapUiBody">
        <div data-sap-ui-component data-name="com.schott.fiori.customerfactsheet.customerfactsheet-fiori3" data-id="container" data-settings='{"id" : "customerfactsheet-fiori3"}'></div>
    </body>
</html>
{
    "_version": "1.12.0",
    "sap.app": {
        "id": "com.schott.fiori.customerfactsheet.customerfactsheet-fiori3",
        "type": "application",
        "i18n": "i18n/i18n.properties",
        "applicationVersion": {
            "version": "1.0.0"
        },
        "title": "{{appTitle}}",
        "description": "{{appDescription}}",
        "sourceTemplate": {
            "id": "servicecatalog.connectivityComponentForManifest",
            "version": "0.0.0"
        },
        "dataSources": {
            "YODATA_SD_CFS_MATRIX_SRV": {
                "uri": "/sap/opu/odata/sap/YODATA_SD_CFS_MATRIX_SRV/",
                "type": "OData",
                "settings": {
                    "localUri": "localService/metadata.xml"
                }
            }
        }
    },
    "sap.ui": {
        "technology": "UI5",
        "icons": {
            "icon": "",
            "favIcon": "",
            "phone": "",
            "phone@2": "",
            "tablet": "",
            "tablet@2": ""
        },
        "deviceTypes": {
            "desktop": true,
            "tablet": true,
            "phone": true
        }
    },
    "sap.ui5": {
        "flexEnabled": false,
        "rootView": {
            "viewName": "com.schott.fiori.customerfactsheet.customerfactsheet-fiori3.view.Main",
            "type": "XML",
            "async": true,
            "id": "Main"
        },
        "dependencies": {
            "minUI5Version": "1.65.6",
            "libs": {
                "sap.ui.layout": {},
                "sap.ui.core": {},
                "sap.m": {}
            }
        },
        "contentDensities": {
            "compact": true,
            "cozy": false
        },
        "models": {
            "i18n": {
                "type": "sap.ui.model.resource.ResourceModel",
                "settings": {
                    "bundleName": "com.schott.fiori.customerfactsheet.customerfactsheet-fiori3.i18n.i18n"
                }
            },
            "": {
                "type": "sap.ui.model.odata.v2.ODataModel",
                "settings": {
                    "defaultOperationMode": "Client",
                    "defaultBindingMode": "OneWay",
                    "defaultCountMode": "Request"
                },
                "dataSource": "YODATA_SD_CFS_MATRIX_SRV",
                "preload": true
            }
        },
        "resources": {
            "css": [{
                "uri": "css/style.css"
            }]
        },
        "routing": {
            "config": {
                "routerClass": "sap.m.routing.Router",
                "viewType": "XML",
                "async": true,
                "viewPath": "com.schott.fiori.customerfactsheet.customerfactsheet-fiori3.view",
                "controlAggregation": "pages",
                "controlId": "app",
                "clearControlAggregation": false
            },
            "routes": [{
                "name": "RouteMain",
                "pattern": "RouteMain",
                "target": ["TargetMain"]
            }],
            "targets": {
                "TargetMain": {
                    "viewType": "XML",
                    "transition": "slide",
                    "clearControlAggregation": false,
                    "viewId": "Main",
                    "viewName": "Main"
                }
            }
        }
    },
    "sap.platform.hcp": {
        "uri": "webapp",
        "_version": "1.1.0"
    }
}

我的网络选项卡的屏幕截图

Network 1

Network 2

Network 3

Network 4


正如“网络”选项卡所示,有许多模块按顺序一一加载,其中许多模块甚至通过同步 XHR 加载。最重要的任务是避免使用同步 XHR。

  • 确保没有调试模式,sap-ui-debug, sap-ui-xx-componentPreload or sap-ui-xx-libraryPreloadFiles不必要地活跃。

  • 确保异步模块加载处于活动状态:

    • In a 中央 Fiori 启动板(“工作区”)场景:参考如何让UI5内容兼容FLP设置“异步模块加载”?
    • 如果您可以控制引导程序配置,请确保启动板或应用程序的初始 HTML 文档包含该属性data-sap-ui-async="true"在引导脚本中(id="sap-ui-bootstrap").
  • 我看到在manifest.json仅声明了少数库。然而,根据“网络”选项卡,该应用程序使用来自其他库的控件,这些控件未在dependencies。参考如何避免将 UI5 控件作为单个模块加载?为决议。

  • 对于独立应用程序:预加载第三方 JS 文件,即not预先异步地作为应用程序包或库包的一部分。如果您检查引发者在“网络”选项卡中的列中,您可以检测通过同步 XHR 加载的更多模块。将这些模块添加到data-sap-ui-modules应该避免它:

    <script id="sap-ui-bootstrap"
       src="..."
       data-sap-ui-modules="sap/ui/thirdparty/datajs,sap/ui/thirdparty/require"
       data-sap-ui-...="..."
    ></script>
    

    The sap/ui/thirdparty/datajs is required by v2.ODataModel. The sap/ui/thirdparty/require module by the sap.viz library. Both modules are usually fetched via loadSyncXHR. The above snippet fixes it. You might find more such modules.

总的来说,上述几点应该已经显着改善了初始加载时间。有关更多性能指南,请浏览绩效检查表.


其他需要考虑的事项

I18n

为了减少请求数量,请考虑完全放弃 i18n 支持if该应用程序仅针对使用相同语言的特定人群。对 i18n 文本包的多个请求成本高昂,如果配置不正确,可能会导致同步 XHR。那里is一种异步加载 i18n 资源并指定应用程序支持的区域设置的方法,但这是另一个主题了。

O数据模型

  • 考虑设置countMode to "None"在聚合绑定信息中,其中$count并不是真正需要的,因为$count后端计算往往成本高昂。
  • The defaultOperationMode被设定为"Client"在您的情况下,它会立即获取所有实体并减慢初始应用程序加载速度。相反,利用延迟加载应用内容, $filter查询,则growing特色于sap.m.ListBase控制,以及sap.ui.table.Table控制(如果适用)。参考“桌子:我应该选择哪一张?”
  • Request $metadata并尽早添加注释preload: true to the /sap.ui5/models/<model name>/部分。
    "": {
      "dataSource": "MyV2Source",
      "settings": {
        "defaultBindingMode": "TwoWay",
        "preliminaryContext": true
      },
      "preload": true
    }
    

UI5工具

通过 UI5 工具构建应用程序包这减少了服务器请求的数量,如果是独立构建,也减少了应用程序的大小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何找到加载缓慢的 SAPUI5 应用程序的加载瓶颈 的相关文章

  • 我如何能够以两行显示标题,并且每行的字体大小不同?

    我正在使用 Google Chart API 创建时间线图 并希望将图的标题修改为两行 问题 我如何能够显示具有不同字体大小的两线图表标题 电流输出 理想输出 相关研究 我唯一能找到的是有人试图用饼图来做到这一点 但我尝试了但无法使其发挥作
  • 由于 apollo-client 未定义,无法解构 GraphQL 查询?

    我正在寻找调试与错误消息相关的问题 未捕获的类型错误 无法解构 0 apollo client WEBPACK IMPORTED MODULE 4 useQuery 因为它未定义 Context 我正在为我的 React js 项目设置后端
  • 渲染货币和符号并与来自不同单元格的数据相结合

    我正在使用最新的 jQuery DataTables v1 10 7 我正在尝试将数字解析为以下格式 239 90 USD 我可以使用此命令使货币正常工作 columns data Price render fn dataTable ren
  • Javascript Promise“then”始终运行,即使 Promise 未能执行

    我希望当调用第二个 then 时不执行第三个 then 但是 即使 Promise 被拒绝 调用第二个 then 并且代码返回 rejected 然后返回 undefined 它仍然调用第三个 then 如何不运行第三个 then 这样 未
  • 为什么 iife 在一个简单的例子中不起作用?

    我不明白为什么函数表达式调用不起作用并抛出错误 你能给我解释一下吗 var a function x alert x function a 1 谢谢大家 任务比我想象的要容易得多 这是因为 JS 将 IIFE 解析为函数的参数调用 这样做时
  • 如何更改 Google Maps v3 API for Directions 中的开始和结束标记图像

    我使用 DirectionsRender 绘制了一条路线 但我不知道如何用我自己的标记替换通用的 Google 标记 我知道并在正常的谷歌地图情况下使用它 但发现很难用开始和结束的方向标记来做到这一点 如果这是一个愚蠢的问题 感谢您的任何建
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 图像无法在带有 DOM 的 IE 中加载:控制台中的 7009 错误(无法解码)

    当在 IE 中的单个页面上加载许多图像时 在 IE11 中重现 其中一些图像开始加载失败 并在控制台中出现类似以下警告的内容 DOM7009 无法解码 URL 处的图像 某些唯一的 url 当我查看网络流量时 似乎确实从服务器收到了每个图像
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • 将 GMT 时间转换为当地时间

    我以这种格式从我的服务器获取 GMT 时间 Fri 18 Oct 2013 11 38 23 GMT 我的要求是使用Javascript将此时间转换为本地时间 例如 如果用户来自印度 首先我需要采用时区 5 30并将其添加到我的服务器时间并
  • 如何制作没有 ng-repeat 的模板并使用 Angular-drag-and-drop-lists 将数据传递到 $scope?

    我想用角度拖放列表 https github com marceljuenemann angular drag and drop lists使用我自己的网格模板到所见即所得编辑器 如何构建我自己的 HTML 模板而不需要ng repeat因
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • Firebase 函数 onWrite 未被调用

    我正在尝试使用 Firebase 函数实现一个触发器 该触发器会复制数据库中的一些数据 我想观看所有添加的内容votes user vote 结构为 我尝试的代码是 const functions require firebase func
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • Three.js 各种大小的粒子

    我是 Three js 的新手 正在尝试找出添加 1000 个粒子的最佳方法 每个粒子都有不同的大小和颜色 每个粒子的纹理是通过绘制画布创建的 通过使用粒子系统 所有粒子都具有相同的颜色和大小 为每个粒子创建一个粒子系统是非常低效的 有没有
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points

随机推荐

  • 正则表达式未使用 Unicode 字符范围

    NOTE 又被问到一个问题模式中带有 Uxxxxxxxx 字符的 C 正则表达式已经 这个问题的不同之处在于它不是关于如何计算代理对 而是关于如何在正则表达式中表达高于 0 的 unicode 平面 从我的问题中应该可以清楚地看出 我已经理
  • 如何在ListView中创建可点击的链接?

    我正在尝试使 URL 在 ListView 项目内可单击 我该怎么做呢 我希望它的工作方式是用户以纯文本形式存储链接 然后当我检索链接时 我想让它们在 ListView 中可单击 这是我在 read GetString 2 提取 URL 值
  • Node.js MySQL 插入问题[重复]

    这个问题在这里已经有答案了 考虑 exports adduser function connection return function req res Get form values var username req body usern
  • 如何将字符串的一部分转换为斜体?

    我要实现animal getScientificName如斜体 代码如下 我正在使用列表视图并在列表视图中设置文本 我不仅希望文本视图的一部分显示为斜体 无论如何我可以做到这一点 我附上了下面的部分代码 感谢您的帮助 String list
  • SwipeRefreshLayout 内的 Horizo​​ntalScrollView

    我实施了新的SwipeRefreshLayout我的应用程序中的组件 它适用于任何垂直视图 例如ListView GridView and ScrollView 它在水平视图中表现非常糟糕 例如HorizontalScrollView 当向
  • 使用节点的本机 mongoDB 驱动程序流式传输查询结果

    我在 mongoDB 集合中有 100 000 条记录 并尝试使用本机驱动程序在 node js 应用程序中检索它们 我按照中的例子CursorStream 的 MongoDB 文档但出现错误 RangeError Maximum call
  • mime_content_type 仅针对 css 和 js 文件返回 text/plain

    我遇到了 PHP 的 mime content type 这个奇怪的问题 它工作正常 除了 CSS 和 JavaScript 文件 它返回 text plain PHP 的默认 mime 设置为 text html 修改 mime type
  • 如果没有对象安全,Rust 会失去哪些安全保证?

    我试图理解对象安全的想法 我从文档中知道对象安全是以下内容 该特质并不要求这样Self Sized 它的所有方法都是对象安全的 如果对象安全所需的两个条件之一被放弃 哪些事情可能会导致安全 Rust 所提供的安全保证失败 From 自我满足
  • any() 函数检查两个 TRUE 而不是一个

    The any 来自基 R 的函数检查是否 给定一组逻辑向量 至少其中一个值是否为真 有没有办法使用any 函数 但让它检查是否至少有两个值是 true 而不是只有一个 如果没有 是否有另一个功能可以用来执行类似的操作 我们可以用 sum
  • 我可以告诉 javac 忽略缺少 `import foo.Bar` 吗?

    我正在使用反射来加载MyClass class 外部文件 在运行时 MyClass class使用图书馆Bar 这意味着我需要放置import foo Bar 在文件的顶部 但是 那Bar库已经在主类加载中加载MyClass 有没有办法让我
  • 未连接到调试器时,快速应用程序恢复在 WP8.1 上崩溃

    我正在使用 MVVM Light 开发 WP8 1 应用程序 默认情况下会激活快速应用程序恢复 这很棒 因为我想将其包含在应用程序中 当应用程序从 Visual Studio 启动时 它会按预期工作 然而 当应用程序直接在设备上启动时 就会
  • str 对象不可调用 python

    我尝试四处寻找答案 但是这里的问题要么似乎很高级 我是Python新手 要么是因为重新定义了我在脚本中无法理解的含义 这是代码 a float input Enter the length in inches b float input E
  • 是否可以让 css 选择器影响页面中的其他元素而不使用 javascript? [复制]

    这个问题在这里已经有答案了 例如 我想让两个文本框在其中一个获得焦点时具有相同的样式 div class divTxt div
  • Python 逆字母顺序

    我有这个输出 3 one 2 was 2 two 1 too 1 racehorse 1 a 我需要将具有相同编号的元组按相反的字母顺序放置在列表中 这是我的代码 def top5 words text split text text sp
  • html body ondblclick 获取被点击的元素

    所以在我的 html 中我有这部分 div dasd div div dasda div 在 javascript 中 该函数是 function myfunc do stuff here 我想知道在 myfunc 内部 html 主体的哪
  • 在 Get-ChildItem 中指定 *.xls 过滤器也会返回 *.xlsx 结果

    我有一个包含 xls xlsx 和 xlsm 文件的文件夹 并且想仅过滤 xls 文件 为什么以下行不能按我的预期工作 我看到 xls xlsx 和 xlsm 结果 Get ChildItem Get Location Filter xls
  • 验证错误消息有效时不会隐藏

    更新2 我发现输入的标题由于某种原因被显示为错误消息 我使用忽略标题 true以确保标题不会显示为错误消息 However 现在我的新问题是 一旦我输入有效的电子邮件地址 错误消息仍然不会消失 如何修复验证错误消息 使其在输入字段有效时隐藏
  • Ionic2 的字体很棒

    如何使用 Font Awesome 图标
  • 有没有办法判断传入的变量是引用类型还是值类型?

    在Swift中 有没有办法通过代码判断传入的变量是引用类型还是值类型 例如 元组是值类型还是引用类型 一切是一个值类型 除了 一个类的实例 一个功能 一个数组 其工作方式很奇怪 它通过引用传递 但如果它是可变的并且项目数量发生更改 则可以与
  • 如何找到加载缓慢的 SAPUI5 应用程序的加载瓶颈

    我正在构建一个自定义 SAPUI5 应用程序 其中包含七个图表 sap viz ui5 controls VizFrame 在页面的标题内容中 嵌套在sap suite ui commons ChartContainer 和网格表 sap