没有合适的资源?快使用搜索试试~ 我知道了~
7210PixieDust:通过静态依赖跟踪进行声明性增量用户界面渲染0Nick tenVeen荷兰代尔夫特理工大学,代尔夫特,荷兰n.tenveen@student.tudelft.nl0Daco C.Harkes荷兰代尔夫特理工大学,代尔夫特,荷兰d.c.harkes@tudelft.nl0EelcoVisser荷兰代尔夫特理工大学,代尔夫特,荷兰e.visser@tudelft.nl0摘要0现代Web应用程序是交互式的。反应式编程语言和库是声明性指定这些交互式应用程序的最先进方法。然而,使用这些方法编写的程序由于效率原因包含容易出错的样板代码。在本文中,我们介绍了PixieDust,一种用于基于浏览器的应用程序的声明性用户界面语言。PixieDust使用静态依赖分析在运行时增量更新浏览器DOM,无需样板代码。我们证明PixieDust中的应用程序包含的样板代码比最先进的方法少,同时实现了相当的性能。0ACM参考格式:Nick ten Veen,Daco C. Harkes和EelcoVisser。2018。通过静态依赖跟踪实现声明性增量用户界面渲染的PixieDust。在WWW'18Companion:2018年Web会议伴侣,2018年4月23日至27日,法国里昂。ACM,纽约,纽约,美国,9页。https://doi.org/10. 1145/3184558.318597801 引言0现代Web应用程序是交互式的。数据编辑不会触发页面重新加载,而是进行原地DOM更新。这些DOM更新可以手动编写,但这是一项繁琐且容易出错的工作。一种声明性但天真的解决方案是在每次编辑时从声明性渲染函数中重新构建整个DOM。然而,DOM操作很慢,因此这种方法会导致大型应用程序的界面不响应。此外,DOM元素将失去其本地状态(如焦点和事件处理程序)。当前最先进的声明性解决方案维护一个虚拟DOM,并根据虚拟DOM渲染之前和之后的视图之间的差异应用DOM更新。当数据被编辑时,这些解决方案会比较视图的差异并应用DOM更新来修补差异。由于计算两个树之间的最小差异是O(n^3)[5],这些解决方案使用O(n)的非最小树差分算法。非最小树差分可能存在可扩展性问题,可以通过识别哪些子树在更改时需要更新来缓解。然而,程序员负责正确识别这些子树,这导致了样板代码。0本文根据知识共享署名4.0国际许可证发布。作者保留在其个人和公司网站上传播作品的权利,并附上适当的归属。WWW'18Companion,2018年4月23日至27日,法国里昂,©2018IW3C2(国际万维网会议委员会),根据知识共享CC BY 4.0许可证发布。ACM ISBN978-1-4503-5640-4/18/04。https://doi.org/10.1145/3184558.31859780在本文中,我们介绍了PixieDust,一种Web编程语言,通过编译时静态依赖分析自动推导出用于计算增量视图更新的代码,从而实现了用户界面的简洁声明性定义。本文的贡献如下:0•PixieDust语言的设计,支持对数据模型和视图进行简洁和声明性的定义。• 模型更新对视图的影响的静态依赖分析。•将PixieDust程序映射到JavaScript实现的增量视图更新,以React框架为基础。•评估结果表明,该方法的性能与最先进的方法相当,代码大小减少了2倍。0我们按照以下步骤进行。在下一节中,我们分析现有的解决方案,以查看引入了哪些容易出错的样板代码。在第3节中,我们提出了一种用于静态依赖跟踪的方法,以识别需要重新渲染的子树。在第4节中,我们介绍了PixieDust语言,用于指定数据模型和声明性视图,其中包含了这种静态依赖跟踪。在第5节中,我们正式定义了PixieDust的依赖分析。在第6节中,我们正式定义了PixieDust的操作语义,详细说明了它与浏览器的交互。在第7节中,我们评估了我们的语言设计,在第8节中,我们将PixieDust与相关工作进行了比较。02 现有方法0在本节中,我们分析了现代方法中用于高效更新DOM的技术,并确定了这些技术存在的问题。0状态1 状态20div0h1 p0div0h1 p div0图1:默认情况下,现有框架的差异算法按顺序比较子项。在前面添加一个子节点会导致所有子项完全重新渲染。可以通过手动为子项添加标识来解决此问题。0Track:Web编程WWW 2018,2018年4月23日至27日,法国里昂}type: TodoActionKeys.TOGGLE_TODO,todoId: todoId}? {finished: !todo.finished, ...}: todo);}}model}view}Track: Web Programming WWW 2018, April 23-27, 2018, Lyon, France7220
- 0{this.props.todos.map(todo =>0
- 0
0 0
下载后可阅读完整内容,剩余1页未读,立即下载










安全验证
文档复制为VIP权益,开通VIP直接复制
