当前位置: 首页 > news >正文

新的后端渲染:服务器驱动UI

通过API发送UI是一种彻底的新方法,将改变传统的UI开发。

一项正在改变我们对用户界面 (UI) 的看法的技术是通过 API 发送 UI,也称为服务器驱动UI。这种方法提供了新水平的活力和灵活性,正在改变 UI 开发的传统范例。

服务器驱动 UI 不仅仅是一个理论概念;它也是一个概念。它们正在由科技行业的一些知名人士实施。例如,Instagram、Lyft和Airbnb就参与了这一运动,利用服务器驱动的 UI 向全球数百万用户提供动态内容和更新。

但服务器驱动 UI 到底是什么?它们是如何工作的,为什么它们在现代 JavaScript 开发中变得如此重要?这篇博文旨在回答这些问题,并深入介绍服务器驱动的 UI、它们的优点以及如何在自己的项目中实现它们。

什么是服务器驱动UI(Server-driven UI)?
服务器驱动UI是用户界面开发的一种新方法。它们提供了一种动态、灵活的方式,可在服务器上生成用户界面,并通过API将其发送到客户端。这种方法可以提供更快的迭代速度和更个性化的用户体验。

虽然需要考虑应用程序商店指南和离线用户体验管理等挑战,但服务器驱动UI为未来的用户界面开发提供了一个令人兴奋的方向。

相比之下,服务器驱动UI是在服务器上动态生成的,并通过应用程序接口发送到客户端。服务器发送用户界面的 JSON 表示,然后客户端对其进行渲染。这意味着用户界面可以在服务器端更新,而无需对客户端进行任何更改。

用户界面变得动态而灵活,能够根据用户行为、A/B 测试结果或新功能推出等各种因素实时变化。

例如,Builder.io 在其框架 SDK 中使用了这种方法,提供了一个组件,该组件可以接受 JSON 作为输入,并以可视化方式呈现构建的设计:

import { BuilderComponent } from "@builder.io/react";

export default async function MyPage({ params }) {
const builderJSON = await builder // Get the page content JSON from Builder with the specified options .get("page", {
userAttributes: { // Use the page path specified in the URL to fetch the content urlPath: "/" + (params?.page?.join("/") || ""),
},
})
return (
<>



</>
);
}

与传统的用户界面开发相比,这种方法有几个优点。

  • 首先,它可以加快迭代速度,因为在服务器端做出的更改可以立即反映在客户端上。
  • 它还能让后端开发人员为前端开发做出贡献,因为他们可以在服务器上定义用户界面结构和行为。

然而,服务器驱动的用户界面并非没有挑战:
它们需要一种不同的用户界面开发思维方式,还需要考虑一些技术问题,如如何处理操作和保持流畅的用户体验。但是,只要认真规划和实施,这些挑战都是可以克服的。

服务器驱动UI在 Instagram 中的作用
Instagram 对服务器驱动用户界面的采用为这种创新方法的实际应用提供了一个引人注目的案例研究。这家社交媒体巨头开发了一种名为 "块block"的技术,利用服务器驱动用户界面的概念向用户提供动态内容和更新。

在 Instagram 的实现中,服务器会向客户端发送一个树状结构的"块block"。每个区块代表用户界面的一部分,并包含要呈现的组件和要传递给该组件的道具的信息。然后,客户端会遍历这个树状结构,按照"块"指定的方式呈现组件。

这种方法允许 Instagram 对用户界面进行即时更新,而无需推送新版本的应用程序。例如,如果发现某个用户界面组件存在错误,服务器只需停止发送渲染该组件的"块",就能立即有效地修复所有用户的错误。

此外,服务器驱动的用户界面使 Instagram 能够更快地迭代产品。产品团队无需等待新的应用程序版本发布,而是可以在服务器上对用户界面进行修改,并立即在应用程序中看到这些修改。这使得产品开发过程更加敏捷,响应速度更快。

服务器驱动用户界面UI的好处
采用服务器驱动的用户界面有很多好处,可以显著改善开发流程和终端用户体验。

  • 即时修复错误,加快迭代速度:正如 Instagram 的使用案例所示,最显著的优势之一就是能够立即修复错误并加快迭代速度。对用户界面的修改可以在服务器端进行,并立即反映到客户端,用户无需更新应用程序,开发人员也无需经过冗长的应用程序商店审核流程。
  • 后端开发人员为前端开发做出贡献:服务器驱动的用户界面也模糊了前端和后端开发之间的界限。后端开发人员可以在服务器上定义用户界面结构和行为,从而可以更直接地参与前端开发过程。这可以提高资源利用效率,增强开发团队的凝聚力。
  • 动态和个性化的用户体验:使用服务器驱动的用户界面,用户体验可以根据各种因素动态定制。例如,服务器可根据用户的行为、偏好甚至 A/B 测试结果发送不同的用户界面。这可以带来更个性化、更吸引人的用户体验。
  • 降低客户端复杂性:通过将大部分用户界面逻辑移至服务器,服务器驱动的用户界面还能降低客户端的复杂性。这可以使客户端更轻、更快,从而提高性能,带来更流畅的用户体验。

构建服务器驱动的用户界面:实用指南
一开始,构建服务器驱动的用户界面可能会让人望而生畏,但只要清楚地了解整个过程和一些实用的步骤,就能将其变为一项易于管理且回报丰厚的工作。以下是如何构建服务器驱动用户界面的分步指南:

  • 创建树形结构:创建服务器驱动用户界面的第一步是创建一个树状结构来表示用户界面。树状结构中的每个节点都对应一个用户界面组件,并包含有关要呈现的组件以及要传递给该组件的道具的信息。

  • 处理操作:在服务器驱动的用户界面中,需要处理用户交互等操作。这可以通过在向服务器发送请求的组件中加入动作处理程序来实现。然后,服务器可根据动作响应新的用户界面树。

  • 使用 JSON 格式:用户界面树通常以 JSON 格式表示,可以通过 API 轻松发送并由客户端解析。

  • 实现呈现引擎:在客户端,你需要一个呈现引擎,它可以遍历用户界面树并呈现树中指定的组件。

  • 测试和迭代:与任何开发过程一样,测试和迭代是关键。一定要彻底测试服务器驱动的用户界面,并根据测试结果进行改进。

请记住,构建服务器驱动的用户界面需要改变传统的用户界面开发思维。这不仅关系到编码,还关系到以一种可以从服务器动态生成和更新的方式构建用户界面。

应对服务器驱动用户界面的挑战
服务器驱动的用户界面为用户界面开发提供了新的可能性,但同时也带来了开发人员需要注意的新问题:

  • App商店指南:应用程序商店有需要遵守的指导原则。确保服务器驱动用户界面的使用符合这些指导原则非常重要。在提交应用程序进行审核时,如果能将用户界面方法透明化,将有助于避免任何潜在问题。

  • 离线用户体验:由于服务器驱动的用户界面依赖于服务器通信,因此离线时的用户体验管理可能是一个挑战。实施缓存等策略有助于在没有网络连接的情况下保持一致的用户体验。

  • 性能考虑因素:虽然服务器驱动的用户界面具有动态功能,但也有一些性能方面的考虑因素需要注意。高效的网络请求和优化的渲染技术有助于保持流畅的用户体验。

  • 复杂性增加:实施服务器驱动的用户界面会给开发过程增加一层复杂性,因为用户界面管理同时发生在服务器和客户端。不过,通过结构合理的方法和明确的职责分工,可以有效地管理这种复杂性。

这些考虑因素在带来挑战的同时,也为解决问题和创新提供了机会。通过深思熟虑的规划和执行,服务器驱动的用户界面可以成为开发工具包中的宝贵补充。

结论
通过应用程序接口发送用户界面或服务器驱动的用户界面代表了用户界面开发领域的重大转变。通过将大部分用户界面逻辑移至服务器,这种方法提供了重塑行业的动态性和灵活性。

从即时修复错误和加快迭代速度,到让后端开发人员为前端开发做出贡献,服务器驱动的用户界面带来了一系列好处。它们还能带来更个性化、更吸引人的用户体验,并能降低客户端的复杂性,从而提高性能。

虽然在应用商店指南和离线体验管理等方面会遇到一些挑战,但通过精心规划和战略方法,这些问题都可以得到有效解决。

在高级 JavaScript 开发领域,服务器驱动用户界面已不仅仅是一个理论概念,而是一种实用方法,Instagram 等大型平台都采用了这种方法。随着我们不断突破用户界面开发的极限,服务器驱动的用户界面为未来提供了一个令人兴奋的方向。

更多前端架构趋势:https://www.jdon.com/67969.html

相关文章:

新的后端渲染:服务器驱动UI

通过API发送UI是一种彻底的新方法&#xff0c;将改变传统的UI开发。 一项正在改变我们对用户界面 (UI) 的看法的技术是通过 API 发送 UI&#xff0c;也称为服务器驱动UI。这种方法提供了新水平的活力和灵活性&#xff0c;正在改变 UI 开发的传统范例。 服务器驱动 UI 不仅仅是…...

Postman如何做接口自动化测试?

前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完…...

excel文本函数篇2

本期主要介绍LEN、FIND、SEARCH以及后面加B的情况&#xff1a; &#xff08;1&#xff09;后缀没有B&#xff1a;一个字节代表一个中文字符 &#xff08;2&#xff09;后缀有B&#xff1a;两个字节代表一个中文字符 1、LEN(text)&#xff1a;返回文本字符串中的字符个数 2、…...

【MyBatis】动态SQL > 重点:${...}和#{...}与resultMap和resultType的区别

目录 一、MyBatis动态sql 1.1 动态sql的作用 1.2 动态sql作用论证 1.2.1 条件判断&#xff1a;<if> 1.2.2 循环迭代&#xff1a;<foreach> 1.2.3 SQL片段重用 1.2.4 动态条件组合&#xff1a;<choose><when><otherwise> 1.2.5 <where…...

什么是BEM命名规范?为什么要使用BEM命名规范?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ BEM命名规范⭐ 为什么使用BEM命名规范&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为…...

JavaScript:交集和差集的应用场景

在集合A和集合B中&#xff0c;属于集合A&#xff0c;同时也属于集合B的元素组成的集合&#xff0c;就是交集。 在A中所有不属于集合B元素&#xff0c;组合成集合&#xff0c;就是差集。 那么在平时的开发中&#xff0c;如何使用差集和交集来解决问题呢&#xff1f; 现在有这…...

达梦数据库表空间创建和管理

概述 本文将介绍在达梦数据库如何创建和管理表空间。 1.创建表空间 1.1表空间个数限制 理论上最多允许有65535个表空间&#xff0c;但用户允许创建的表空间 ID 取值范围为0~32767&#xff0c; 超过 32767 的只允许系统使用&#xff0c;ID 由系统自动分配&#xff0c;ID不能…...

三、MySQL 数据库安装集

一、CentOS—YUM 1. MySQL—卸载 # 1、查看存在的MySQL。 rpm -qa | grep -i mysql rpm -qa | grep mysql# 2、删除存在的MySQL。 rpm -e –-nodeps 包名# 3、查找存在的MySQL目录。 find / -name mysql# 4、删除存在的MySQL目录。 rm -rf 目录# 5、删除存在的MySQL配置文件。…...

【BASH】回顾与知识点梳理(三十九)

【BASH】回顾与知识点梳理 三十九 三十九. make、tarball、函数库及软件校验39.1 用 make 进行宏编译为什么要用 makemakefile 的基本语法与变量 39.2 Tarball 的管理与建议使用原始码管理软件所需要的基础软件Tarball 安装的基本步骤一般 Tarball 软件安装的建议事项 (如何移除…...

蓝蓝设计-UI设计公司案例-HMI列车监控系统界面设计解决方案

2013年&#xff0c;为加拿大庞巴迪(Bombardier)设计列车监控系统界面设计。 2015-至今&#xff0c;为中车集团旗下若干公司提供HMI列车监控系统界面设计,综合考虑中车特点、城轨车、动车组的不同需求以及HMI硬键屏和触摸 屏的不同操作方式&#xff0c;重构框架设计、交互设计、…...

Blazor前后端框架Known-V1.2.13

V1.2.13 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazo…...

vue 复制文本

一个常用的库就是 clipboard.js&#xff0c;它可以帮助您实现跨浏览器的复制到剪贴板功能 首先&#xff0c;安装 clipboard.js&#xff1a; cnpm install clipboard 创建一个 Vue 组件并使用 clipboard.js&#xff1a; <template><div><input v-model"…...

西瓜书第三章

广义线性模型 考虑单点可微函数 g ( ⋅ ) g(\cdot) g(⋅)&#xff0c;令 y g − 1 ( ω T x b ) yg^{-1}(\omega^{T}xb) yg−1(ωTxb)&#xff0c;这样得到的模型称为“广义线性模型”&#xff0c;其中函数 g ( ⋅ ) g(\cdot) g(⋅)称为“联系函数”。显然&#xff0c;对数线…...

关于python如何使用sqlalchemy连接sap_hana数据库

1.先安装sqlalchemy pip install sqlalchemy 2.from sqlalchemy import create_engine 3.创建数据库连接方式&#xff1a; 假设数据连接方式如下&#xff1a; usernameH_TEOPT passwordww122222 jdbcUrljdbc:sap://192.163.1.161:21681/?currentschema 那么使用sqlalchemy 的…...

微信小程序教学系列(5)

微信小程序教学系列 第五章&#xff1a;小程序发布与推广 第一节&#xff1a;小程序发布流程介绍 小伙伴们&#xff0c;欢迎来到第五章的教学啦&#xff01;在这一章中&#xff0c;我们将一起来探索小程序的发布与推广流程。你准备好了吗&#xff1f;让我们开始吧&#xff0…...

【计算机网络篇】TCP协议

✅作者简介&#xff1a;大家好&#xff0c;我是小杨 &#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; TCP协议 1&#xff0c;TCP 简介 TCP&#xff08;Transmission Control Protocol&#xff09;是…...

Disruptor并发编程框架

Disruptor是一款高性能的并发编程框架,主要具有以下特点和功能: 1. RingBuffer环形数据结构 Disruptor的核心数据结构是RingBuffer环形队列,用于存储客户端的并发数据并在生产者和消费者之间传递。队列以批量方式的顺序存储,可以高效地进行并发读写操作。 2. 无锁设计 Disrup…...

matlab 点云精配准(1)——point to point ICP(点到点的ICP)

目录 一、算法原理参考文献二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 参考文献 [1] BESL P J,MCKAY N D.A method for registration of 3-Dshapes[J].IEEE Tran…...

【JVM】运行时数据区域

文章目录 说明程序计数器虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存 说明 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启动而一直…...

uniapp踩坑合集

1、onPullDownRefresh下拉刷新不生效 pages.json对应的style中enablePullDownRefresh设置为true&#xff0c;开启下拉刷新 {"path" : "pages/list/list","style" :{"navigationBarTitleText": "页面标题名称","enable…...

再JAVA中如何使用qsort对类进行排序?

目录 结论&#xff1a; 解析&#xff1a; 结论&#xff1a; import java.util.Arrays;class Person implements Comparable<Person>{public String name;public int age;public Person(String name, int age) {this.name name;this.age age;}Overridepublic Stri…...

docker安装clickhouse

安装 docker安装 创建clickhouse目录 mkdir -P /data/clickhouse/datamkdir -P /data/clickhouse/confmkdir -P /data/clickhouse/log 拉取镜像 这里直接拉取最新镜像, 如果需要某个特定版本, 则再拉取的时候指定版本号即可. docker pull clickhouse/clickhouse-server 启动临…...

解决`idea`中`database`工具查询起别名乱码问题

文章目录 解决idea中database工具查询起别名乱码问题场景复现如何解决方式一 设置编码方式二&#xff1a;修改字体 原因说明 解决idea中database工具查询起别名乱码问题 场景复现 使用Idea做查询的并且起别名出现了中文乱码 如何解决 方式一 设置编码 settings->输入框输…...

UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.5->2.3

目录 之前的文章&#xff1a; 1.5 Blend Attributes by Value 发射器更新 粒子生成 粒子更新 2.1 Static Beams ​编辑 发射器更新&#xff1a; 粒子生成 粒子更新 2.2 Dynamic Beams 没有开始模拟前的效果是&#xff1a; 开始模拟后的效果是&#xff1a; 发射器更新 …...

Docker 容器数据卷

Docker挂载主机目录访问如果出现cannot open directory .: Permission denied 解决办法&#xff1a;在挂载目录后多加一个--privilegedtrue参数即可 如果是CentOS7安全模块会比之前系统版本加强&#xff0c;不安全的会先禁止&#xff0c;所以目录挂载的情况被默认为不安全的行…...

STM32--MPU6050与I2C外设

文章目录 前言MPU6050参数电路MPU6050框图 IIC外设框图 IIC的基本结构软件IIC实现MPU6050硬件IIC实现MPU6050 前言 在51单片机专栏中&#xff0c;用过I2C通信来进行实现AT24C02的数据存储&#xff1b; 里面介绍的是利用程序的编程来实现I2C的时序&#xff0c;进而实现AT24C02与…...

项目管理实战笔记1:项目管理常识

序 看了下极客时间的《项目管理实战》&#xff0c;觉得跟之前学习PMP的标准资料还是有所侧重。重新整理下&#xff0c;相比书上繁杂的知识&#xff0c;这个更通俗易懂。 1 角色转换&#xff1a;三大误区 误区1&#xff1a;事必躬亲 自己做事情是可控的&#xff0c;做项目依赖…...

时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化

时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SVMD分解算法&#xff0c;分解结果可视化&#xff0c;MATLAB程序&#xff…...

阿里云访问端口被限制解决方法记录

阿里云服务器&#xff0c;80端口可以访问&#xff0c;但是加入了安全组端口8080 通过公网访问改端口策略&#xff0c;发现不能被访问 问题出在防火墙&#xff0c;需要重置一下 解决方法&#xff1a; 在运行的服务器上执行如下命令&#xff1a; # iptables -A INPUT -j ACCEP…...

antd5源码调试环境启动(MacOS)

将源码下载至本地 这里antd5 版本是5.8.3 $ git clone gitgithub.com:ant-design/ant-design.git $ cd ant-design $ npm install $ npm start前提&#xff1a;安装python3、node版本18.14.0(这是本人当前下载的版本&#xff09; python3安装教程可参考&#xff1a;https://…...

网站开发管理系统有哪些/东莞seo外包

2017年9月13日 17:12:20 星期三 gitbook 可以将markdown格式的文件编译成html格式 放在当前目录里的_book目录里(需要手动创建, 也可以指定编译后的html文件放到哪里) 它有几个文件需要注意: SUMMARY.md: 用markdown格式书写的目录 (常用 *, , - 开头表示无序列表) book.json: …...

高端做网站/上海优化公司有哪些

以前一直以为IIS应用程序的默认文档只能设置根目录下的文件&#xff0c;像index.html&#xff0c;default.aspx等&#xff0c;后来经同事指点&#xff0c;原来子目录或者子应用程序下的文件也可以添加到根应用程序的默认文档列表中。之 前为了实现这样的需求&#xff0c;当用户…...

辽宁网站建设墨子/焦作网络推广哪家好

英文名&#xff1a;DotNetTextBox V3.0 WYSWYG Web Control For Asp.Net2.0 中文名&#xff1a;DotNetTextBox V3.0 所见即所得编辑器控件 For Asp.Net2.0 类型: 个人及非盈利性网站免费使用 作者: 小宝.NET 2.0(Terry Deng) 主页&#xff1a;http://www.aspxcn.com.cn 控件演示…...

南宁高端网站建设公司/东莞寮步最新通知

?点 Stephen 关 注 我 这是 Stephen 的第 76 篇原创文章哈喽&#xff0c;大家好&#xff0c;我是 Stephen&#xff0c;一个毕业三年后自学 Java 编程入行的程序员。我们知道松哥的 “微人事” 开源项目后面引入了 RabbitMQ 消息中间件。今天我们来一起学习 Windows 环境下 Ra…...

网页设计公司兴田德润在哪里/seo网站优化培训公司

插入 insert into 表名 (列名...) values(值...); 1. 给表中的所有字段添加数据&#xff0c;可以不写前面的字段名称。 2. 只给表的某几个字段赋值&#xff0c;则需要制定字段名。 3. 在 values 中列出的数据位置必须与被加入的列位置相对应。 4. 数据类型&#xff0c;大小等…...

广州做网站seo/武汉seo排名优化公司

首先正常的class书写规范是如下的&#xff1a; <view classc_1>我是静态class</view>微信开发小程序的时候&#xff0c;如何动态控制class呢&#xff1f; <view classc_2 {{bool ? "c_3": "c_4"}}>我是动态class</view>通过{{}}…...