ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Fiori Elements项目ui5.yaml完全解读:从模板字段到中间件配置实战

Fiori Elements项目ui5.yaml完全解读:从模板字段到中间件配置实战 干这行久了你会发现Fiori Elements 项目里被忽略最多的文件就是 ui5.yaml。创建项目时它自动生成平时不怎么碰可一旦构建失败、本地启动报错、后端连不上所有人又开始翻它。我见过不少同事在这上面浪费时间不是因为问题多难而是压根没搞懂这个文件里每一行到底在干什么。今天就把这份文件拆开逐行讲清楚尤其是 Fiori Elements 项目里那些由 SAP 模板自动生成、又藏着关键逻辑的配置段看完你也能自己改。1. ui5.yaml到底是谁在用先搞明白它的定位1.1 它不是 manifest.json也不是 package.json刚接触 SAPUI5 的人最容易把三个文件弄混manifest.json 是应用运行时的配置它决定应用在浏览器里加载哪些资源、启动哪个组件、使用什么数据源package.json 是 Node.js 项目的依赖清单管的是 npm 包而 ui5.yaml 是 UI5 工具链的配置管的是构建和本地开发服务器怎么跑。可以这么理解manifest.json 是应用跑起来之后用的身份证package.json 是开发环境的购物清单ui5.yaml 则是工具链的操作手册。你执行npm start或npm run build时UI5 CLI 会先读 ui5.yaml然后按照它的指示决定怎么起服务、怎么执行构建任务、构建产物放到哪里。很多人在命令行加参数比如ui5 serve --port 8080但参数只是一次性的覆盖真正的默认行为和项目级配置都写在这个 yaml 文件里。改端口、加代理、指定构建产物名称甚至决定构建时要不要执行某些自定义任务全部由它说了算。1.2 Fiori Elements 项目为什么对 ui5.yaml 的依赖格外重普通 SAPUI5 自由式应用对 ui5.yaml 的需求相对简单配置文件可能只有十几行。但 Fiori Elements 项目完全不同。Fiori Elements 是配置驱动框架应用本身通过 manifest.json 里的sap.ui5、sap.fe等节点声明页面结构。但本地开发时需要模拟 FLPFiori Launchpad环境、需要把前端的 OData 请求代理到真实后端、需要修改代码后页面自动刷新这些能力都不是 UI5 CLI 内置的而是 SAP 的模板工具在生成项目时通过 ui5.yaml 注入的自定义中间件。换句话说没有这些中间件配置Fiori Elements 项目虽然能起一个基础的 UI5 应用服务器但功能上会大打折扣没有代理前端的/sap/opu/odata请求打不出去没有实时重载每次改代码都得手动刷新没有预览中间件应用只能裸奔在一个没有 FLP 外壳的页面里。所以对 Fiori Elements 开发来说ui5.yaml 不是可有可无的装饰它是整个本地开发体验的地基。2. 头部字段逐行解析specVersion、type、metadata、framework2.1 specVersion工具链的契约版本specVersion: 3.2第一行就是版本声明。它规定了这份配置要按哪个版本的 UI5 工具链规范来解析不是随便写的数字。specVersion 和 Node 包版本是两个概念。ui5/cli的 npm 包版本可能已经到 4.x但 specVersion 反映的是配置文件格式的版本。老的0.1对应最初一批项目后来逐步演进出1.0、2.0、2.2、3.0到现在的3.2。不同版本支持的特性是递增的。比如3.0之后才支持在配置里声明framework段来锁定框架版本2.2之前则用ui5 serve时还需要额外配置框架依赖。项目模板生成什么版本一般不用动它。但如果你手动创建配置文件或者把老项目迁移到新工具链就得注意匹配关系。一个很常见的坑是拿新版本的 CLI 去读旧 specVersion或者反过来。报错信息往往是Unsupported specVersion或者specVersion ... is not supported by this UI5 CLI version。解决办法也不复杂要么升级 CLI要么把 specVersion 改成 CLI 支持的版本。我建议直接用npm view ui5/cli version看看当前安装的 CLI 版本再对照 UI5 官方文档里的兼容表来定 specVersion。2.2 type 与 metadata.name身份与形态type: application metadata: name: com.mycompany.orderstype定义这个项目是哪种构建单元。最常见的三种application表示这是一个可运行的应用library表示这是一个 UI5 库项目产物给其他应用引用module表示这是一个普通的 Node 模块项目构建时可能被其他项目作为资源引用。Fiori Elements 项目基本就是application不需要纠结。module和library多用于开发自定义控件库或者工具包日常做 Fiori 应用开发很少碰到。metadata.name是项目的唯一标识这个值值得认真对待。它通常采用反向域名风格比如com.mycompany.orders。这里com.mycompany是公司统一前缀orders是应用模块名。这个 name 会被用在一系列资源命名和路径拼接上比如构建产物里的资源根路径、测试环境中的应用 ID 前缀。如果项目是从模板生成的metadata.name 会和创建时输入的项目名称一致。自己手动改是可以的但要注意其他地方是否有引用。比如 manifest.json 里sap.app/id一般和它保持一致fiori-tools-preview中间件配置的component也依赖这个 ID。改的时候得全盘搜索别只改这一处。2.3 framework 段运行时框架与版本号约束framework: name: SAPUI5 version: 1.120.0 libraries: - name: sap.fe.templates - name: sap.ushell这一段不是所有 ui5.yaml 都有但 Fiori Elements 项目通常都会带。它的作用是声明应用构建和本地运行时依赖哪个 UI5 框架、哪个版本、需要哪些库。name只有两个可选值SAPUI5和OpenUI5。SAP 商业项目用SAPUI5开源项目用OpenUI5。这个不能选错选错了依赖库里很多东西根本拉不到。version是框架版本。这里不是说项目必须用这个版本运行而是构建时的依赖解析基准。比如本地想在 1.120.0 上跑但线上 FLP 用的是 1.108.0两者可能有细微兼容性差异。所以不是版本越高越好最好让这个版本和实际运行环境保持一致。SAP 发布新版本后一般会有兼容窗口期升级前先看看 SAP UI5 版本兼容性说明。libraries是项目直接依赖的框架库列表。对于 Fiori Elements 项目sap.fe.templates是必须的它是 Fiori Elements 模板的运行时库。sap.ushell则是 FLP 外壳本地预览模拟 FLP 时用得上。除了这些还可能看到sap.m、sap.ui.core等基础库。模板生成的列表一般够用如果你想加其他库比如sap.chart做图表在这里追加就行。有一点容易忽略framework段还会影响构建速度。如果只写了几个库构建器只处理这些库会快很多。但如果你用了某个库里的控件却忘了写入构建可能因为找不到资源而报错。所以加新依赖时这一步记得同步更新。3. resources、builder与server构建和本地运行的三个板块3.1 resources工程资源配置resources: configuration: propertiesFileSourceEncoding: UTF-8resources段在模板生成的文件里通常只有这么几行却是最容易出问题的地方之一。它管的是项目源文件在构建和运行阶段怎么被读取。propertiesFileSourceEncoding字面意思就是属性文件的源编码。i18n 语言文件大多是.properties格式如果你的翻译文件中包含中文、日文、韩文等非 ASCII 字符而文件本身保存为 UTF-8那就必须把这个值设为UTF-8。很多项目踩过的坑是中文字符串在页面上显示成乱码。排查半天最后发现是 properties 文件编码没对上。SAP 早期的工具链默认按 ISO-8859-1 处理 properties 文件如果文件里有中文且没指定这个配置乱码几乎是必然的。模板生成时通常会写好但如果你手动改过或者从老项目拷贝配置注意检查这行是否还在。resources段还可以配置更复杂的内容比如把某个外部目录作为额外资源加入构建使用path和/test/之类的映射。但 Fiori Elements 项目很少用到保持模板默认即可。3.2 builder构建阶段干什么活builder: customTasks: - name: ui5-task-zipper afterTask: generateCachebusterInfo configuration: archiveName: com.mycompany.orders additionalFiles: - xs-app.jsonbuilder段配置的是执行npm run build时除了默认构建流程之外还要做的自定义任务。默认构建流程包括资源复制、JS 压缩、缓存破坏信息生成等等。customTasks就是在这个流程上追加任务。ui5-task-zipper是一个常用任务它把构建产物打包成一个 zip 文件。这个 zip 可以直接部署到 ABAP 服务器或者 BTP 的 HTML5 应用仓库。archiveName是打包后的文件名通常和项目名一致。additionalFiles用来把不在 webapp 目录里的文件也塞进包里。xs-app.json是 BTP 上 Fiori 应用做 URL 路由映射用的文件很多项目需要把它打包进去。afterTask指定了这个任务在哪个内置任务之后执行。构建过程是有顺序的generateCachebusterInfo负责给资源文件名加版本号ui5-task-zipper放在它之后就能确保 zip 包里的文件已经带上了缓存破坏信息不会被浏览器缓存困住。如果你在 BTP 上做 HTML5 应用部署除了 zipper还可能会有ui5-task-flp-build。这个任务会根据 FLP 配置生成更符合 Launchpad 要求的资源结构。什么样的项目需要哪些任务模板生成时基本已经配好手动添加时先看看这个包的文档别乱加。3.3 server开发期怎么跑server段是整个 ui5.yaml 里最复杂也最关键的板块Fiori Elements 项目的本地开发体验基本由它决定。执行npm start时UI5 CLI 会启动一个本地 HTTP 服务器而server.customMiddleware让你可以在服务器处理请求的链条上插入自定义逻辑。我们平时说的 Fiori Elements 项目能连后端、能热刷新、能模拟 FLP 打开全部是通过customMiddleware里的一个个中间件实现的。SAP 的模板工具会往这里插入fiori-tools-proxy、fiori-tools-appreload、fiori-tools-preview三个中间件。这三个家伙是 Fiori Elements 本地开发的三驾马车下一节单独拆开讲。server段也能配置端口等基础参数比如server: port: 8080但模板一般不写端口默认端口是 8080如果被占用UI5 CLI 会自动往后找。想要固定端口可以在npm start时传--port也可以在 ui5.yaml 里写死。我倾向于在 yaml 里写固定值这样团队里的人启动时行为一致不会出现你连 8080、我连 8081 的混乱局面。4. Fiori Elements项目里fiori-tools三个中间件的逐字段接法4.1 fiori-tools-proxy把后端SAP系统代理到本地- name: fiori-tools-proxy afterMiddleware: compression configuration: ignoreCertError: false backend: - path: /sap url: http://sap.example.com:8000fiori-tools-proxy解决的是前后端分离开发的问题。你本地起的 UI5 服务器跑的是前端静态资源但应用中展示的数据来自远处的 SAP 后端。如果前端直接拿浏览器的网络请求打到后端会遇到跨域、登录认证、CSRF token 等一系列问题。它的做法很简单本地 HTTP 服务器把以某个路径开头的请求转发到指定后端。比如上面配置里前端发到/sap/opu/odata/...的请求会被代理到http://sap.example.com:8000。这样对浏览器来说所有请求都指向同一个源跨域问题自然不存在。逐字段来看name是中间件名称必须是fiori-tools-proxy因为这是 SAP 提供的 npm 包名afterMiddleware: compression表示这个代理中间件挂在内置的compression中间件之后compression负责压缩响应体放在前面能让压缩逻辑先处理资源型请求代理逻辑再处理 API 请求configuration是传递给这个中间件的参数。backend.path是匹配规则所有以这个路径开头的请求才会被代理。backend.url是后端目标地址。如果你的后端系统用的是 HTTPS 但证书是自签名的ignoreCertError要设为 true否则代理会报证书错误。实际项目中还可能看到多个backend条目比如同时连 S/4HANA 和 Gateway 两个系统用不同的路径区分。还有一种常见配置是加一个ui5段把resources路径代理到远程的 SAPUI5 资源服务器这样本地可以不依赖 npm 下载的框架库。但这种情况较少见日常开发保持默认即可。4.2 fiori-tools-appreload热重载- name: fiori-tools-appreload afterMiddleware: compression configuration: port: 35729 path: webapp很多人管它叫热更新但它和前端框架里那种 HMR热模块替换不太一样。它的原理是监听webapp目录下的文件变化发现变化后通知浏览器刷新整个页面。port是 WebSocket 通信端口。浏览器里会跑一个小脚本通过 WebSocket 和这个端口建立连接。后端文件一旦变动就通过这个通道发消息浏览器收到后触发页面刷新。35729 是默认端口如果和本机其他服务冲突可以改但注意改了之后模板生成的前端脚本也得跟着适配一般不建议动。path是监听的文件目录默认监听webapp也就是你的源码目录。如果你有额外的资源目录也要监听可以加多个 path 或用数组形式。有一个实际经验如果在 VSCode 里保存文件后页面没有自动刷新优先检查这个端口是不是被防火墙挡了或者是不是有代理端口占用。还有一个隐蔽坑webapp目录下如果存在大量文件监听耗时可能较长遇到极端情况可以把 path 精确到webapp/view、webapp/controller等子目录减少监听范围。4.3 fiori-tools-preview像在FLP里一样打开应用- name: fiori-tools-preview afterMiddleware: fiori-tools-appreload configuration: component: com.mycompany.orders ui5Theme: sap_horizonfiori-tools-preview给你的本地应用套了一层模拟的 FLP 外壳。Fiori Elements 应用在设计上依赖sap.ushell提供的许多服务比如导航、用户信息、Tile 跳转等。直接裸跑应用有些功能会因为没有 FLP 容器而行为异常。这个中间件就是来解决这个问题的。component指定了要预览的应用组件 ID。它必须和 manifest.json 里的sap.app/id一致否则应用起不来。这里容易犯的错误是手动改过 manifest.json 里的应用 ID但忘了同步改这里。ui5Theme指定预览时使用的主题。SAP 新旧主题的主要区别sap_fiori_3是经典 Fiori 3 主题sap_horizon是新一代 Horizon 主题。这个配置只影响本地预览不影响最终部署到 FLP 后的主题。如果你在本地永远看到的是 Fiori 3 风格但线上用到的是 Horizon不要慌检查这里就行。它还支持配置flp段用来指定 app 的 intentconfiguration: component: com.mycompany.orders ui5Theme: sap_horizon flp: intent: object: Orders action: display这个配置影响预览时导航按钮行为对日常开发影响不大但如果你想模拟从某张 tile 跳入应用的具体行为可以在这里调整object和action。5. 从模板到落地一份实际ui5.yaml的修改全过程5.1 模板默认生成的文件长什么样通过 SAP Business Application Studio 或 VSCode 里 Easy UI5 插件创建 Fiori Elements 项目生成的 ui5.yaml 大致是这个结构specVersion: 3.2 type: application metadata: name: com.mycompany.orders framework: name: SAPUI5 version: 1.120.0 libraries: - name: sap.fe.templates - name: sap.ushell - name: sap.m - name: sap.ui.core resources: configuration: propertiesFileSourceEncoding: UTF-8 builder: customTasks: - name: ui5-task-zipper afterTask: generateCachebusterInfo configuration: archiveName: com.mycompany.orders server: customMiddleware: - name: fiori-tools-proxy afterMiddleware: compression configuration: ignoreCertError: false backend: - path: /sap url: http://localhost:8000 - name: fiori-tools-appreload afterMiddleware: compression configuration: port: 35729 path: webapp - name: fiori-tools-preview afterMiddleware: fiori-tools-appreload configuration: component: com.mycompany.orders ui5Theme: sap_horizon这个文件拿过来直接npm install然后npm start理论上就能跑起来。但有两个地方几乎每次都要改一是后端地址url模板默认填本地或占位地址你要改成自己连的 SAP 系统二是component和metadata.name如果创建项目时名字不规范实际应用 ID 和这里对不上就得同步调整。5.2 换后端、换主题、接新中间件的改动记录场景一本地连接一个需要登录认证的 S/4HANA 后端而且后端用的是自签名证书。backend: - path: /sap url: https://s4h.example.cn:443 ignoreCertError: true这里把url换成了真实后端地址ignoreCertError置为 true解决 SSL 证书报错。连接后如果出现401 Unauthorized通常是 S/4HANA 的认证方式不是简单的 Basic 认证。这时可以考虑在fiori-tools-proxy配置里加认证信息configuration: authentication: method: basic user: myuser password: mypassword但我不推荐把密码直接写进 ui5.yaml尤其当文件会提交到 Git 仓库时。这是事故高发点。更安全的做法是让后端使用 SAML 或 OAuth或者用本地 mock 服务做日常开发真实联调时才连后端。场景二开发一个需要接入多个后端服务的应用比如订单数据一个系统、主数据一个系统。可以这样配backend: - path: /sap/opu/odata/orders url: http://10.1.1.1:8000 - path: /sap/opu/odata/material url: http://10.2.2.2:8000这样/sap/opu/odata/orders/...请求打到第一个系统/sap/opu/odata/material/...打到第二个。要注意 path 的匹配规则是前缀匹配所以更具体的路径要写在前面避免被短路径前缀吞掉。场景三项目迁移到 BTP 云环境需要新增一个自定义构建任务把 FLP 相关配置也打进包里。builder: customTasks: - name: ui5-task-zipper afterTask: generateCachebusterInfo configuration: archiveName: com.mycompany.orders additionalFiles: - xs-app.json - name: ui5-task-flp-build afterTask: ui5-task-zipper configuration: deployMode: cdn这里ui5-task-flp-build的deployMode: cdn会根据 FLP 的要求组织资源结构。任务顺序通过afterTask控制先是 zipper 打包再执行 FLP 构建。这块配置依赖实际 npm 包改动前先确认项目 package.json 里安装了对应依赖否则启动构建时直接报Task not found。6. Fiori Elements项目启动排查实录6.1 高频报错速查表下面这些报错是我在实际项目中遇到过的也是最容易让初学者卡壳的几类。报错现象常见原因排查思路specVersion ... not supported本地 CLI 版本和配置不匹配执行npm list ui5/cli确认版本必要时用npm i -D ui5/clilatest升级页面能开但 OData 请求 404fiori-tools-proxy的 path 或 url 配置错误检查后端地址能否用 Postman 直接连通再看path前缀和请求路径是否一致点击保存后页面不自动刷新fiori-tools-appreload端口冲突或监听范围不对确认 35729 端口没被占用检查 path 指向的目录是否正确构建时提示Task ui5-task-zipper not found自定义任务对应的 npm 包未安装在 package.json 中确认ui5-task-zipper是否在 devDependencies 里properties 文件中文乱码propertiesFileSourceEncoding缺失或值不对检查resources.configuration.propertiesFileSourceEncoding是否为 UTF-8预览页空白控制台报 component 加载失败fiori-tools-preview的 component 与 manifest 不一致对比configuration.component和sap.app/id是否一致6.2 几个容易踩的坑和我的处理习惯端口被占用是最常见的启动失败原因。UI5 CLI 在 8080 被占用时虽然会自动切换但提示信息不够显眼有时页面开在 8081 你还在反复刷 8080以为是应用启动不成功。我现在的做法是打开应用前先看一眼终端日志里实际监听的地址不要想当然。代理不生效还有一个隐蔽原因浏览器缓存。某些情况下前端页面和 OData 请求都走代理但浏览器把某个 GET 请求缓存了造成数据长期不更新。遇到这种情况可以先开一个无痕窗口验证或者在请求地址后加时间缀绕过缓存。如果确认是缓存问题可以在fiori-tools-proxy后端路径后加额外的响应头配置但大多数场景开无痕窗口就够用了。关于specVersion有一点容易被忽略模板生成项目的 specVersion 不一定是最新。在 BTP 上部署时云端的构建环境可能用的是特定版本的 UI5 CLI版本不匹配会在远程构建时报错。这种远程构建错误经常让人摸不着头脑因为它和本地环境无关。我的习惯是本地和远程尽量保持相同版本的 CLI升级时一起升避免出现本地没事、云端报错的诡异局面。还有一个和 Fiori Elements 特别相关的细节framework.libraries里的库列表如果少了sap.fe.templates本地启动后打开页面控制台会报Failed to load sap.fe.templates。模板生成时一般不会漏但要手动精简库列表时容易误删。记住一个原则Fiori Elements 相关库一个都不能删基础 UI 库如果没用到可以酌情去掉但加控件库时也别忘同步加上去否则构建时不会报错运行时控件渲染不出来才叫头疼。说到运行时控件渲染异常有一种情况会让你怀疑 ui5.yaml 写错了本地界面正常部署到 FLP 后某些按钮或区块不见了。这往往不是 ui5.yaml 的问题而是 FLP 环境里框架版本和应用打包时使用的版本不一致导致的。排查这类问题时先看看构建产物里的Component-preload.js内容再对 FLP 的 UI5 版本和framework.version做对照。如果版本跨度大优先把framework.version调到 FLP 同款版本重新构建验证。最后再分享一个实用小习惯。ui5.yaml 这种本质上是文本格式很容易在 Git 合并时产生冲突。冲突解决时留意别把别人的中间件配置覆盖掉。我给团队定的规矩是凡是涉及代理和后端地址的改动提交信息里必须带上改动说明免得后来的人看不懂为什么中间件顺序变过。毕竟这文件里每一行都有它的作用乱删乱改轻则本地跑不起来重则把生产环境的配置带偏到时候查问题的时间够你写几十行 yaml 了。
返回列表