关于前后端渲染与同构
1. 渲染方式的选择依据
1.1 前端渲染的优势
- 局部刷新:用户在浏览网页时,不需要每次都加载完整页面,这样可以提高体验。
- 懒加载:初始加载时只获取可见区域的数据,用户滚动后再加载其他内容,可以通过
react-lazyload
实现。 - 丰富的交互:使用 JavaScript 实现各种酷炫效果,使用户体验更好。
- 节约服务器成本:JavaScript 支持 CDN 部署,部署简单,只需服务器支持静态文件。
- 关注分离设计:服务器负责访问数据库并提供数据接口,JavaScript 只关注如何获取和展示数据。
- 跨平台使用:学习 JavaScript 一次,可以用来开发 Web、Server、Mobile 和 Desktop 应用。
1.2 后端渲染的优势
- 首屏性能:用户无需下载大量 JavaScript 和 CSS 就能看到页面。
- SEO:后端渲染生成的 HTML 可直接被搜索引擎抓取。
- 兼容性:不必担心浏览器的兼容性问题(随着浏览器的发展,这个优势逐渐减弱)。
- 节能:减少客户端设备的电量消耗,尤其在移动设备上。
虽然后端渲染的优势主要集中在首屏性能和 SEO,但这些问题正逐渐被同构框架(如 React 和 Next.js)所解决。静态站点渲染也逐渐成为一种选择,但对于复杂应用而言,前端框架已能完全满足需求。
2. 同构渲染的现状与争议
关于前端和后端渲染的现状,大家基本达成共识:前端渲染是未来的趋势,但也面临着首屏性能和 SEO 的挑战。同构渲染的争议主要集中在以下几点:
2.1 前端渲染的问题
前端渲染面临的主要问题是 SEO 和 首屏性能。SEO 的问题在于传统搜索引擎只能抓取 HTML 中的数据,导致 SPA 页面无法被抓取。此外,SPA 通常会将所有 JavaScript 打包,文件体积庞大,尤其在网络环境差时,用户会面临长时间的白屏等待。
2.2 同构的优点
同构渲染的出现正是为了应对前端渲染的问题。自2014年底 React 崛起以来,同构被视为前端框架的一个重要特性。然而,三年过去,许多产品逐渐从全栈同构转向首屏或部分同构。这让我们重新审视同构的优点是否真的存在。
有助于 SEO:如果应用需要 SEO,则同构是一个不错的选择。但对于后台应用,首页只需做一些静态内容即可。如今,谷歌的爬虫已能执行 JavaScript,理解网页内容。因此,尽量使用新的规范,如
pushstate
替代hashstate
,并定期更新网站地图。节省开发时间:同构并未显著减少前端开发量,只是将部分代码移至服务端执行。为了实现同构,开发者需兼容 Node.js 环境,存在额外的成本。
提高首屏性能:虽然同构能改善首屏性能,但在某些情况下,过多的接口请求可能导致性能下降。
2.3 同构的局限
性能问题:将原本在浏览器端处理的任务转移到服务器,可能导致服务器计算负担加重,尤其在需要大量计算的场景(如图表处理)中,性能瓶颈显著。
环境差异:前端代码常未考虑后端渲染的情境,使用浏览器对象和 DOM API 可能导致错误。常见的问题包括
document
对象不存在、DOM 计算错误等。需要实现合适的更新机制,以处理不同用户的window
对象。内存溢出:前端代码在浏览器中有内存重置的优势,但服务器端没有。例如,在 React 的
componentWillMount
中绑定事件可能导致内存溢出。异步操作复杂:同构渲染要求所有请求在渲染前完成,导致流程复杂。尽管 Next.js 解决了一些问题,但仍需谨慎处理。
存储限制:复杂的数据类型无法转化为字符串,导致在同构中处理困难。
综上所述,同构渲染的实施难度大,且无论在前端还是服务端,都需要额外改造。
2.4 首屏优化
除了同构,还有其他方法可以改善首屏渲染问题:
分拆打包:使用如
react-router
等路由库支持的分拆打包,按页面进行分拆,并在切换时加入加载和过渡效果。交互优化:通过更好的用户交互体验解决首屏问题,如使用Skeleton Screen效果,改善白屏等待。
部分同构:通过优先渲染核心部分(如菜单),减少用户的等待时间。
通过以上措施,首屏问题将得到显著改善,且对现有架构的影响较小。
3. 总结
共识:前端渲染是未来趋势,但面临 SEO 和首屏性能问题。
同构争议:同构旨在解决前端渲染问题,但并非所有应用都需 SEO,且搜索引擎爬虫能力逐渐增强。同构并未真正节省前端开发量,且需额外兼容 Node.js 环境。
Next.js
Next.js 是基于 React 的流行同构开发框架,其亮点包括:
请求处理的标准化:Next.js 为组件新增了
getInitialProps
方法,简化初始化请求处理。CSS-in-JS 解决方案:使用 styled-jsx 解决了样式问题,简单易用。
默认快速:页面拆分打包,支持页面预加载。
Next.js 提供了一套简洁明了的解决方案,非常适合新项目使用,但在旧项目中需要评估成本。