1.为什么要静态化静态化是指页面的HTML直接从服务器上加载,前台进行界面初始化。而非静态化是指界面的HTML根据元数据从前台渲染出来。因此静态化最大的优点是大大减少了页面初始化的时间。2.静态化的实现方案前端:首先需要根据控件的特性与业务需求,对控件初始化的时机进行分类:共分为四类如下图所示:做法是在每个控件在注册时,加入一个属性initType,它的值有四种:lazyInit、immeInit、clickInit、asyncInit。其中lazyInit是指赖初始化,即在初始化页面用到的时候进行初始化;immeInit是指立刻初始化,意思是在页面初始化的时候,就初始化这些控件;clickInit是指点击时初始化,即页面渲染时不进行初始化,当用户第一次操作该控件时进行初始化,针对这种情况,控1/10件需要添加初始化方法,如menuitem控件添加初始化方法:clickInitMenuItem;asyncInit是指异步初始化,即在页面初始化完成之后,做一个定时器,定时器的时间为0,对这些控件逐一初始化。目前框架中控件的分类结果如下图所示:前台在初始化时,首先是初始化immeInit里的控件,其次是页面初始化,如果当中有用到控件而没有初始化的走lazyInit,最后在页面渲染完之后,启动一个定时器,对asyncInit里的控件进行初始化,定时器的时间为0,具体大致功能流程图如下:2/10后端:运行期判定是否走静态化的节点有四个地方:1、请求的url中renderModel的值是否为true;2、文件waf2.properties中的staticHtml是否为true;3、是否有静态化内容;4、当前请求的特征码与静态化缓存的特征码是否相同。具体功能图如下:3/104/103.静态化的相关配置项目开始静态化,需要开启两个地方:1、waf2.properties文件中的参数staticHtml设置为true;2、listenerconfig.data文件中的ServiceRegisterListener设为true,这个参数的作用是开启后台缓存。如果在运行期要走非静态化调试,只需要在url中加&renderModel=client即可。4.静态化在产品生命周期中的相关性考虑工具“保存”功能在工具配置页面,点击保存时,会删除数据库中的静态化内容,以及缓存中的静态化内容。其功能流程图大致如下:5/10二次开发场景二次开发场景包括标准产品和二次开发产品,产品在发布时都不带静态化文件,静态化文件统一在客户现场生成,因为客户现场的环境可能和标准产品的环境不一致。无论是产品的升级还是补丁的卸载,都会删除静态化文件。文件的删除是通过执行sql脚本执行的。所以在升级产品或补丁卸载时,需要确认是否执行SQL语句,如果不能执行,只能手动执行SQL语句。其逻辑功能图大致如下:6/10快捷键删除缓存中的元数据,重新创建静态化信息。按Ctrl+Shift+Alt+P组合键,会发一次异步请求,从缓存中删除元数据,但在成功的回调函数中,刷新了页面,又重新创建了静态化信息并做了缓存。如果存在个性化静态页面,走快捷键之后,存储的是通用的静态化页面。其功能流程图如下所示:7/105.静态化与个性化(表格配置举例)先介绍一下个性化信息的渲染过程:无论是静态化还是非静态化在前端渲染时,都涉及colModel的融合,其大致流程如下图:表格设置中的内容为个性化设置,如果走静态化页面,由于绑定的option与dom的结构不一致,可能导致页面渲染出错。处理的原则是在表格设置成功时,为当前用户创建或更新个性化静态页面,这时的静态化页面中的内容是空的,当下次在页面渲染时,优先加载个性化静态页面,因为内容为空,所以按页面元数据渲染页面,渲染成功之后发一次异步请求,创建个性化静态化页面并创建缓存。具体实现在静态化表中,将字段number作为个性化隔离的编码。具体功能流程图如下:8/109/106.featureCode算法在运行期就启动一个线程来监控通用组件所有JS的最后更新时间,大约100多个JS文件,服务器在启动的时候,这个线程就会启动,扫描之后会在内存中记录这些文件与最后更新时间的对应关系。当一个请求过来时,会找到对应的页面元数据,再获取到对应依赖的所有组件,获得这些组件的最后更新时间,再获取到元数据的最后更新时间,将这两个最后更新时间合并起来,取hashCode,作为特征码,当静态化保存的时候,会将这个特征码保存到静态化表中,下次请求来时,会进行动态判断,如果不相等,则重新静态化,即按页面元数据渲染页面。10/10