openui5这个组件库对于很多前端来说都是比较陌生的,在之前我甚至都没有听说过这个东西。现在公司项目以这组件库为主,那就必须要加以熟悉。但是在百度上搜到的资料比较少,所以把自己对于这个组件的了解和使用记录一下。
openui5官网:https://openui5.org/,目前文档没有中文版的,因此都是英语。
在官网中点击Documentation,在下面有个Demos,可以看到有个Demo Apps,这里面有一些官网提供的demo和组件的效果演示,大家可以自己下载然后看下具体的项目目录结构,从目录结构可以看到,demo很明显是mvc模式。现在我们来从零搭建一个openui5的项目。在官网上,点击Releasea,在最下面有个All Releases,这里面都是关于openui5组件的一些sdk,这里我下载的是runtime,并没有下载sdk,因为sdk里面不仅包含了openui5的所有组件,还有一些组件的文档说明,体积比较大。所以我选择了只有组件的runtime。下载解压后有个resources文件夹,这个文件夹下面就是oepnui5提供的所有组件了。
之前我们用的vue脚手架或者react脚手架,咱们启动项目时脚手架会自动起一个webServer本地服务。但是我们新建一个openui5的项目就没有自动给我们起这种服务,因此我们需要自己搭建这种环境,我自己是用的tomcat搭建的本地服务器来运行项目的,当然了,除此之外还有很多其他方式,比如建一个nodejs项目自己开启一个webServer,或者使用google浏览器的webServer插件等。因为我自己的环境已经搭好了,再加上这些东西百度上资料也比较多,所以这里就不多说了。当我们搭建好之后,建立一个项目,把从官网下载解压后的resources文件夹拷贝到项目下 ,建立一个index.html文件,然后我们引入openui5到项目中:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>openui5</title> 7 8 <script 9 id="sap-ui-bootstrap" 10 src="./resources/sap-ui-core.js" 11 data-sap-ui-theme="sap_belize" 12 data-sap-ui-resourceroots=\'{ 13 "test": "./" 14 }\' 15 data-sap-ui-oninit="module:sap/ui/core/ComponentSupport" 16 data-sap-ui-compatVersion="edge" 17 data-sap-ui-async="true" 18 data-sap-ui-frameOptions="trusted"> 19 </script> 20 <script> 21 sap.ui.getCore().attachInit(function () { 22 sap.ui.require([ 23 "sap/m/Page", 24 "sap/ui/core/ComponentContainer" 25 ], function (Page, ComponentContainer) { 26 new Page({ 27 showHeader: false, 28 content: new ComponentContainer({ 29 height: \'100%\', 30 name: \'test\', 31 settings: { 32 id: \'test\' 33 } 34 }) 35 }).placeAt(\'content\'); 36 }) 37 }); 38 </script> 39 40 </head> 41 42 <body> 43 <div id=\'content\'></div> 44 </body> 45 46 </html>
在这段代码中,除了引入opeui组件外,还对目录路径进行了重命名,也就是data-sap-ui-resourceroots,我指定了当前目录为根路径,方便以后引入组件使用。sap.ui.getCore().attachInit是在组件加载完成后会自动调用,并执行该函数下的回调函数。如果不在这个函数下面创建组件,而是直接使用组件,会报错说找不到组件,这时候加个定时器延时三秒执行就能找到了,这说明组件库是异步加载的,而attachInit是官网提供的方法,从官网demo中也可以找到。在这里我创建一个Page组件,然后在Page中直接创建了ComponentContainer组件,设置了id和高度,然后调用placeAt把组件添加进div中。其实这里的Page组件完全可以省略掉,就创建ComponentContainer也没问题。
到了这里,项目也一样跑不起来,这时候我们启动本地服务打开项目下的index.html会发现控制台有一大堆报错:
很明显,和官网demo比起来,我们项目显的有些简单了,只有一个资源文件夹和html文件,根据错误信息看出,我们还差几个文件,现在我们把提示不存在的那几个文件在项目中建起来,于是目录就变成了这样:
这是时候刷新页面,仍然报错:
刚才我们建立了一个Component的js文件,这个文件是每次启动项目肯定会执行的,这个文件是用于继承openui5的UIComponent组件的,然后在Component文件下,调用父组件的initialize方法去初始化路由。所以Component需要继承UIComponent,在Component中增加如下代码:
1 sap.ui.define([ 2 \'sap/ui/core/UIComponent\' // 引入openui5的UIComponent组件 3 ], 4 function (UIComponent) { 5 \'use strict\'; 6 // 继承组件 7 return UIComponent.extend(\'test.Component\', { 8 metadata: { 9 manifest: \'json\' 10 }, 11 // 该函数可以在组件初始化时自动调用 12 init: function () { 13 // 将父组件init函数指向子组件本身 14 UIComponent.prototype.init.apply(this, arguments); 15 // 初始化路由 16 this.getRouter().initialize(); 17 } 18 }); 19 });
加上之后,再次刷新页面,控制台继续报错:
提示缺少一个manifest.json文件,在上面有提到过路由,而路由的定义,就和这个缺少的文件有关,所以这文件极为重要,里面包含了很多配置信息,官网的demo中,manifest.json有些配置我们搭建简单项目根本用不上,所以我对它的文件进行了简化,现在在项目根目录下创建manifest.json文件:
1 { 2 "_version": "1.12.0", 3 4 "sap.ui5": { 5 "rootView": { 6 "viewName": "test.home.view.Home", 7 "type": "XML", 8 "async": true, 9 "id": "app" 10 }, 11 12 "routing": { 13 "config": { 14 "routerClass": "sap.m.routing.Router", 15 "viewType": "XML", 16 "viewPath": "test.home.view",
18 "controlAggregation":"pages", 17 "controlId": "app", 18 "async": true 19 }, 20 21 "routes": [ 22 { 23 "pattern": "", 24 "name": "home", 25 "target": "home" 26 } 27 ], 28 29 "targets": { 30 "home": { 31 "viewName": "Home", 32 "viewId": "homeId" 33 } 34 } 35 } 36 } 37 }
在这个配置文件中,我只保留了必须要的配置,
rootView:在该对象下指定项目的入口视图
config:指定使用组件路由,视图文件类型,是否异步加载,视图id。
routes:指定路由路径,这里设置为空,就相当于根目录。路由名字和路由对应的目标文件。
targets:这里面指定路由目标文件,我这里指定了name,是因为routes下面的那个target属性为name,这里需要对应,否则找不到。
在这里面还有个疑惑,在上面的rootView中,viewName属性我们指定为test.home.view.Home,这里可看成是test/home/view/Home,test就是在index.html文件中自己设置根目录路径。项目执行顺序会先到rootView里面找到这些配置,这里我们指定了这么一个路径,那我们就需要在项目中增加一个对应的文件,否则会出问题。建立一个home目录:
因为这个组件是以mvc模式为主,所以建立的文件也是根据mvc模式来的,但我这里只建了vc而没有m,因为目前只是简单搭建项目,暂时不需要m,所以我给省略了。在view和controller下分别有Home.view.xml文件和Home.controller.js文件,这两个文件都不能够为空,所以我们分别在两个文件中增加简单的代码让项目运行起来:
Home.controller.js
1 sap.ui.define([ 2 "sap/ui/core/mvc/Controller", //引入组件的controller控制器 3 ], function (Controller) { 4 "use strict"; 5 // 继承组件的Controller 6 return Controller.extend("test.home.controller.Home", { 7 // 初始化函数,自动调用 8 onInit : function () { 9 console.log(\'进入到了Home controller\'); 10 } 11 }); 12 13 });
Home.view.xml
1 <mvc:View 2 controllerName="test.home.controller.Home" 3 xmlns="sap.m" 4 xmlns:mvc="sap.ui.core.mvc"> 5 <App id=\'app\'> 6 <Text text=\'这里是Home页面的Text标签\'></Text> 7 </App> 8 </mvc:View>
controllerName:指定相关联的视图控制器。
App标签指定的id和manifest.json里面设置的controId需一致。
然后我们再次刷新页面运行:
可以看到这句话是我们在xml中Text标签的那句话。控制台也没有任何报错,到这里一个简单的openui5项目就算是搭建成功了。前面有提到openui5是以mvc模式为主,因此需要对mvc模式有一定的了解。
这个项目执行顺序,项目启动后进入到根目录的index.html文件,然后执行根目录下的Component.js文件,在这个文件中初始化路由,而路由的定义就是在manifest.json下的rootView中指定路径的,然后会在manifest.json中找到routing,初始化相关配置,在通过routes找到对应的路由页面进行渲染。执行过程大致如此。