前后端分离示例代码推荐

2020-07-24 11:47:01 +08:00
 KunMinX

在了解 Web 开发,其中谈到了一个 “前后端分离” 的设计,

网上的文章大致都表示,分离前,都是后端 “渲染” 好页面,再返回给前端,那么它这里所说的 “渲染”,究竟是指什么呢?

这种含糊其辞、脱离特定背景的表述,实在无法理解,想听听 “说人话” 对此是怎么表述的,或者如果有分离前和分离后两种架构的最小精简代码示例就更好了。

(我暂且猜测,分离前是 html 代码由后端根据业务逻辑拼接,然后把拼接好的 html 返回给浏览器,让浏览器 “渲染”,可见我说的渲染和大部分文章说的渲染可能根本不是一个东西 … 就想听听是不是真的有所谓的 “渲染” 发生在后端,然后丢一个所谓的渲染完的结果给浏览器,浏览器什么也不用做直接展示?)

这里给个说是在后端 “渲染” 的网文:

https://www.infoq.cn/article/mNfTT4UBk5PQl3JpNt6M

3756 次点击
所在节点    程序员
24 条回复
Orenoid
2020-07-24 12:02:01 +08:00
没详细了解过这个概念的严格定义,按我的理解就是:
分离前,后端渲染是指将动态数据整合到静态 HTML 文件里,也就是你说的拼接,然后把拼接后的 HTML 文件返回给前端,前端直接负责展示。
分离后,前端先直接从服务器拿到静态 HTML 文件,并进行加载,随后再通过 ajax 异步向后端接口请求业务数据,然后再通过 JavaScript 将数据加载到网页上,实质上就是修改和操作 DOM,这种情况下就是前端负责渲染。
按我的理解,通常讨论的“渲染”(尤其是在讨论前后端分离这个语境下)是指数据和 HTML 的整合,而不是浏览器将文档转为 DOM 树再转化为像素点这一操作。
tomczhen
2020-07-24 12:12:07 +08:00
浏览器页面显示效果是通过 HTML,CSS 来控制的,那么控制网页的显示效果就有两种手段。

1. 获取时决定,就是后端根据需求生成 HTML 和 CSS,这时影响页面的 HTML,CSS 完全由后端代码生成。

2. 获取后决定,即浏览器读取到 HTML CSS 之后通过在浏览器运行环境的语言,调用浏览器提供的 API 操作已经加载的 HTML,CSS,然后浏览器再绘制。

现实场景是,即便所谓的后端渲染页面,也会用到 JavaScript 去修改已经渲染好的页面,比如最常见的通过 jQuery 操作。而前端渲染也需要一个入口 HTML,可以是一个纯静态文件,也可以由后端输出。
KunMinX
2020-07-24 12:12:12 +08:00
@Orenoid

感谢分享,清晰了,我明白了。
ChanKc
2020-07-24 12:17:16 +08:00
服务端渲染的渲染确实是“生成 html”而不是“把图画出来”的意思。
我一开始也懵,希望能有人发明出更好的词
ChanKc
2020-07-24 12:29:51 +08:00
netnr
2020-07-24 12:35:54 +08:00
服务端渲染有利于 SEO
KunMinX
2020-07-24 13:44:06 +08:00
@ChanKc

谢谢分享,我想明白了,这里的渲染其实是一个动词,表达为 “去渲染” 更合适一些(比如 for-Rendening ),

我是结合 react 等函数式编程框架理解到这一点的,

因为这些框架都有 render 函数,当 setState 的时候,重新触发这个函数,来动态构造布局树。

由于它本质上是函数式编程,view 的实例是内部生成的,因而取名 render 方法,假装跳过中间环节,直奔最终的 render 操作。

然而毕竟 render 就是 render,广泛意义上就是指从代码到像素点的转换,因而对 “渲染” 这个概念的滥用,让交流变得非常不舒服。

我情愿用 “布局拼装” 来人如其名地概括这个现象。分离前,后端静态布局拼装,分离后,前端动态布局拼装。
ChanKc
2020-07-24 13:46:06 +08:00
@KunMinX 所以在 Web 中,代码到像素点的转换用了另一个词:Paint,中文应该是绘制吧
KunMinX
2020-07-24 13:47:08 +08:00
@KunMinX

或者说数据绑定、页面生成也行,后端数据静态绑定,和前端数据动态绑定。后端页面静态生成,前端页面动态生成。
skrjscom
2020-07-24 14:42:21 +08:00
ASP PHP 时代经历过没??? web 设计师设计好 HTML 页面,ASP PHP 拿过去拆散 把代码塞进去。
gantleman
2020-07-24 15:26:47 +08:00
最初 html 时代是没有前端程序猿的。后端动态调整样式使用服务器过滤的方式。随着 JS,CSS 的流行,后端不再负责前端样式。
KunMinX
2020-07-24 15:30:00 +08:00
@ChanKc

哈哈,那可能刚好和 android 以及计算机科学中对 render 和 paint 的定义反过来了。

android 中 draw 表示的是绘制、排版的意思,也即构建视图模型,然后把这个模型结果统一交给 render 机制去渲染到屏幕。

https://zh.wikipedia.org/wiki/%E6%B8%B2%E6%9F%93

百科中对渲染的解释也是如此,指通过模型来生成图像的过程。

或许 web 开发中关于 “渲染” 和 “绘制” 的定义,是被早期的某个大佬给带歪的 …(除非我们有一天找到了这么称呼的缘由)
ChanKc
2020-07-24 15:46:09 +08:00
yhxx
2020-07-24 16:14:04 +08:00
后端渲染,浏览器拿到的是<div class="price">128 元</div>

前端渲染,浏览器拿到的是<div id="container"></div>和<script>insert(`<div class="price">128 元</div>`)</script>
lower
2020-07-24 16:15:17 +08:00
名词准不准确我觉得重要性其次
可能 http 协议 /浏览器请求、响应、展示网页 这些知识点原理什么的,还需要补充了解,不然光看名词很难理解
sugars
2020-07-24 16:30:56 +08:00
我理解的是,不管分离与不分离,两者同样都是渲染 html,但区别就是渲染的时候完整与不完整了
RedRoute
2020-07-24 16:35:09 +08:00
我对与后台 ‘渲染’ 的理解是:后端(服务器端)对页面上的数据进行填充,请求服务器时,是一个数据处理完毕的 html,此时浏览器进行显示。
1.前后端不分离:这种做法往往是前端人员编写好静态页面,后端人员通过修改 html 文件,动态的在 html 进行一些数据的处理。当请求过来是,此时通过浏览器访问先请求到服务器,后端先进行处理,返回处理完毕的 html 。
2.前后端分离:此时前端人员完成页面,并通过请求后端提供的接口获取数据,同时完成数据的展示。后端不需要去对页面提供任何操作。此时通过浏览器访问先请求到服务器,直接返回 html 页面,页面中的 js 再去获取数据并显示。
KunMinX
2020-07-24 16:42:53 +08:00
@ChanKc

谢谢分享,文档中强行将 “渲染” 描述为 “绘制”,让人觉得不适:

The last step is paint, which takes in the final render tree and renders the pixels to the screen.

—— 最后一步是 “绘制”,基于最终渲染树 去把像素点 “渲染” 到屏幕 …

@lower

这不是精不精确的问题,而是与普适的约定存在冲突,人为造成了代沟,没法交流。

就好比,一个人强行把 “红色” 说成 “蓝色”,把 “爸爸” 说成 “妈妈”,然后完全意识不到与公约存在的冲突,而不停地拿这些概念自嗨,这样的沟通绝不会让人愉快。
a132811
2020-07-24 17:14:05 +08:00
@netnr 其实,结合 pushState, 搜索引擎 已经可以很好的 SEO ajax 页面。
emeab
2020-07-24 17:26:02 +08:00
一个再请求结束的时候就渲染完了 一个在请求结束才开始渲染 大概意思

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/692754

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX