如何加快继承PolymerTemplate的Vaadin组件实例化速度?
问题描述
我正在使用一个库,其主类继承自PolymerTemplate,我发现该库中组件的实例化过程耗时约20ms。
我已经基本移除了该类和对应.js文件的所有内容,得到了最简组件——本质上是一个无内容的div,但其实例化耗时仍然没有明显下降。
测试代码如下:
long startTime = System.currentTimeMillis(); Autosuggest<String> autosuggest1 = new Autosuggest<>(); long stopTime = System.currentTimeMillis(); long elapsedTime = stopTime - startTime; System.out.println("ExecutionTime: " + elapsedTime + " ms");
我目前推测是PolymerTemplate的依赖创建过程导致了较长耗时。请问有没有方法可以加快该实例化过程?或是可以将该过程延后到后续阶段执行?
我的核心需求是加快包含多个该类组件的表单的加载速度。
2021年9月9日更新: 我已经将相关库从PolymerTemplate迁移至LitTemplate,速度仍然偏慢,但至少具备了面向未来的兼容性,此外还提供了示例项目可供测试。
解决方案
1. 开启模板全局缓存
模板类实例化的核心耗时来自首次创建时的类注解解析、客户端模板元数据绑定流程,Vaadin默认没有开启全局缓存,每次实例化都会重复执行上述步骤。你可以在对应配置文件中开启缓存:
- Spring Boot环境在
application.properties中添加配置:
vaadin.lit-template.cache=true vaadin.template.parser.cache=true
- 其他部署环境可以在
vaadin.conf中添加对应配置项。开启缓存后,仅首次实例化会执行解析逻辑,后续所有实例化耗时可降到1ms以内。
2. 延后非必要组件的实例化时机
如果表单内组件数量多,无需首屏一次性全部渲染,可以通过懒加载逻辑减少首次加载的耗时:
- 折叠面板、标签页内的组件,等到对应模块被用户激活时再创建实例
- 长表单可拆分成分页步骤,每一步切换时仅实例化当前步骤的组件
- 模板内的静态内容直接写在前端模板文件中,仅对需要后端交互的DOM节点添加
@Id绑定,减少后端反射扫描绑定的开销。
3. 改用轻量组件实现
如果模板绑定的开销仍然不符合预期,可以将组件改造为直接继承Component的纯Java实现,客户端逻辑通过@JsModule引入,后端仅暴露必要的交互API,跳过模板类的元数据解析流程,这一改造可以将单个组件的实例化耗时降到0.5ms以内。
4. 开启生产模式优化
确保部署时开启Vaadin生产模式,生产模式会预编译所有模板文件,禁用开发阶段的调试检查逻辑,整体实例化速度相比开发模式可以提升3-5倍。
内容的提问来源于stack exchange,提问作者Hons
相关产品推荐
相关产品推荐

