介绍:随着前端技术栈和工具链的迭代成熟,前端工程化和模块化成为了当前主流的技术方案。在这波前端技术浪潮中,出现了诸如React、Vue、Angular等基于客户端渲染的前端框架。此类框架构建的单页应用(SPA)具有用户体验好、渲染性能好、可维护性高等优点。但也有一些较大的缺陷,主要与以下两点有关:首屏加载时间过长,传统的服务器端渲染直接获取服务器渲染的HTML。单页应用程序使用JavaScript在客户端生成HTML以供展示。对于内容,用户需要等待客户端JS解析执行完成后才能看到页面,导致首屏加载时间变长,影响用户体验。不利于SEO。搜索引擎在抓取网站HTML文件时,单页应用的HTML是没有内容的,因为需要通过客户端JavaScript解析执行生成网页内容,目前主流的搜索引擎抓取的都是这部分内容内容。不太好。为了解决这两个缺陷,业界借鉴了传统服务器端直出HTML的方案,提出在服务器端执行前端框架(React/Vue/Angular)代码生成网页内容,以及然后将渲染后的网页内容返回给客户端。客户端只需要负责展示;最初的spa应用是这样的,但是在这种模式下,有一些明显的缺点,其中最重要的是:首屏渲染慢:因为HTML中没有内容,必须等到JavaScript加载后并执行,即可渲染页面内容。SEO问题:同样是因为HTML中没有内容,对于现在的搜索引擎爬虫来说,页面中没有有用的信息,自然也就无法提取关键词进行索引。我们所说的同构渲染(现代服务端渲染)的意思是这样的:当然不仅如此,为了获得更好的用户体验,同时,来自服务端渲染的内容会被激活为一个SPA应用在客户端,也就是说后续的页面内容交互都是通过客户端渲染来处理的。简而言之,这种方法就是:通过首屏服务器端渲染,解决了首屏渲染慢,不利于SEO的问题。通过客户端渲染来接管页面内容交互以获得更好的用户体验,我们通常称这种方式现代服务端渲染也叫同构渲染。所谓同构,就是服务端构建渲染+客户端构建渲染。同样,以这种方式构建的应用程序称为服务端渲染应用程序或同构应用程序。主要流程是:客户端向服务端发起请求渲染首屏内容+生成客户端SPA相关资源并将服务端生成的首屏资源发送给客户端。客户端直接显示服务端渲染的首屏内容。第一屏SPA相关资源,执行后会激活客户端Vue。之后,客户端的所有交互都将由客户端SPA处理。优缺点:优点:首先画面渲染速度快,有利于SEO缺点:开发条件有限。只能在某些生命周期钩子函数(lifecyclehook)中使用的浏览器特定代码;某些外部扩展库(externallibrary)可能需要特殊处理才能在服务器呈现的应用程序中运行。涵盖构建设置和部署的更多要求。与可以部署在任何静态文件服务器上的完全静态单页应用程序(SPA)不同,服务器呈现的应用程序需要Node.js服务器运行时。更多的服务器端负载。在Node.js中渲染一个完整的应用程序显然会比只服务于静态文件的服务器占用大量的CPU资源(CPU-intensive-CPU-intensive),所以如果你期望在高流量环境(hightraffic),请相应地准备服务器负载,并明智地使用缓存策略。在为您的应用程序使用服务器端渲染(SSR)之前,您应该问的第一个问题是您是否真的需要它。这主要取决于内容生成时间对应用程序的重要性。例如,如果您正在构建一个内部仪表板,初始加载时额外的几百毫秒并不重要,那么使用服务器端渲染(SSR)将是一种矫枉过正。然而,内容生成时间要求是一个绝对关键的指标,在??这种情况下,服务器端渲染(SSR)可以帮助您实现最佳的初始加载性能。其实很多网站启用服务端渲染都是出于效率考虑,性能是其次的。假设在网站A的页面中有一个关键词叫做“前端性能优化”,这个关键词是在JS代码跑完之后添加到HTML页面中的。那么在客户端渲染模式下,如果我们在搜索引擎中搜索这个关键字,我们是找不到网站A的——搜索引擎只会找到现成的内容,不会给你运行JS代码。看到这种情况,A网站的经营者感到很吃力:如果搜索引擎找不到我们,用户也找不到我们,谁来用我的网站?为了向搜索引擎展示“现成的内容”,网站A不得不开启服务端渲染。但是性能是其次的,并不是说性能不重要。至于原客户端spa应用渲染与服务端渲染的对比,可以使用浏览器的弱网3G进行测试。所以我们可以把SEO需要做的部分和需要渲染的部分先做服务端渲染,然后不需要的部分马上渲染,放在客户端即可发出请求或延迟加载。下面我们来看一下Vue服务端渲染框架nuxt:uxt.js是一个基于Vue.js的服务端渲染应用框架,可以帮助我们轻松实现同构应用。通过客户端/服务器基础架构的抽象组织,Nuxt.js主要关注应用程序的UI渲染。我们的目标是创建一个灵活的应用程序框架,您可以在此基础上初始化新项目的基础设施代码,或者在现有的Node.js项目中使用Nuxt.js。Nuxt.js预设了使用Vue.js开发服务端渲染应用程序所需的各种配置。另外我们还提供了一个命令叫:nuxtgenerate,它提供了为基于Vue.js的应用程序生成对应的静态站点的功能。我们相信这个命令提供的功能是开发集成各种微服务(Microservices)的网络应用程序的新步骤。Nuxt.js作为一个框架,为客户端/服务器的典型应用架构模式提供了很多有用的特性,比如异步数据加载、中间件支持、布局支持等非常实用的功能。nuxt.js官网写的很好,很完整。您可以在使用前阅读官方网站。nuxt.js中文官网在这里贴出nuxt的FAQ生命周期对比如果你使用Koa/Express等Node.jsweb开发框架,使用Nuxt作为中间件,你可以自定义web服务器的启动入口:serverrelease下面是我用nuxt做的demohttps://github.com/544076724/...这是dev分支上的界面素材地址:https://github.com/gothinkste...在线示例:https://demo.realworld.io/#/接口文档:https://github.com/gothinkste...如果你想学点东西练练手,这个模板不错。这是我的http://106.75.104.214:3000/部署地址。下篇文章会讲到如何部署和做持续集成。
