首先要理解next.js或者nuxt.js使用场景下所谓的服务端渲染的含义以及想要解决的问题。
假设以下场景,题主自己写了一篇技术分享文章放在自己的服务器上。
在访问这个页面的时候,浏览器从服务器拿到的HTML是这样的:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>分享</title>
</head>
<body>
<div>
<div id="title"></div>
<div id="content"></div>
</div>
<script>
var titleEle = document.getElementById('title');
var contentEle = document.getElementById('content');
titleEle.innerText = '我是分享标题';
contentEle.innerHTML = [
'<p>',
'我是分享内容。',
'</p>',
].join('');
</script>
</body>
</html>
看似没什么问题吧,浏览器也能正常解析,内容也能正常显示。
但是爬虫(以下爬虫都指搜索引擎爬虫)碰到这个页面就不是这么友好了,在爬虫眼里可能就完全忽视了script标签里的内容。
也许爬虫很智能,会把简单脚本执行一遍后再看整个文档的内容再做分析,但如果文章内容是异步请求的,那没有特殊情况,爬虫是绝对不会等你请求完文章等一系列操作后再分析页面结构。
因为爬虫压根不知道
页面什么时候渲染好,即便是window.onload也只是说明资源都加载完毕了而已。
以上其实是一个简单的背景,现在的vue、react等前端框架也是因为上述与其他一些原因才需要SSR(服务端渲染)。
无论是使用带compiler的vue版本直接在浏览器里运行,还是利用vue-loader将模版全部编译成render函数,都存在这个问题。
题主可以用vue-cli建一个简单的项目,随便写几个组件展示在页面上,然后编译结果。
编译完可以观察结果的html文件,会发现这个html除了放vue根组件的挂载元素(通常是id为app的一个div),剩下的就是引入资源,当然如果你修改过模版html,那修改的内容也会带过来。
那样结果就很明显了,写的那几个组件,都是通过js渲染到页面上的。
假如说和上述情形一样,题主写的是一个技术分享文章,文章内容通过异步请求获取,那不通过其他手段,搜索引擎爬八十年可能都不会收录这篇文章,因为对爬虫而言,这个 html是空的,没有有用的信息。
背景基本理清楚了,回归题主的问题。
node.js不就是服务端渲染吗?
现在常说的服务端渲染,是由服务端提供首屏内容的html,这样对搜索引擎更友好,首屏渲染也更快。
因为浏览器拿到后可以直接解析首屏的html,而不用等js资源加载完后再做一系列的动作。
扯远了,猜测题主理解的服务端渲染应该是由服务端输出了html,那就是服务端渲染。
next.js和nuxt.js的运用是什么呢?
我觉得他们官方文档解释的可能比我说的会清楚一些。
Next.js: Next.js 是一个轻量级的 React 服务端渲染应用框架。
Nuxt.js: Nuxt.js 预设了利用 Vue.js 开发服务端渲染的应用所需要的各种配置。
他们都是一个框架,预先帮你做好了服务端渲染需要做的事情。
使用这两个框架开发后编译出的内容,通过node.js运行,访问的时候会将首屏的html内容在服务端生成后再返回。
它们的区别是什么?
区别已经很清楚了,一个是给React开发者用的,一个是给Vue开发者用的,或者说是针对各自框架产生的。
服务端每次是重新发送html页面去客户端吗?
这个可以脱离开框架来讲,通常不做ssr,大多数情况下这些前端资源都会作为静态资源存在,直接丢到cdn。
但是如果要做ssr,那每次访问都是由服务端来生成html了,所以没有缓存等辅助机制,那服务端每次都要重新生成html后发送给客户端。
html的数据会不会大量重复,不用服务端渲染,客户端来渲染一个或者其他组件的时间会快一些呢
这个得看具体场景了,通过上面这些问题,这个问题题主自己应该可以理解了,大部分情况下我们是不需要做服务端渲染的。部分场景还可以使用预渲染,这个题主可以去了解一下。
java开发实习工程师http://www.gtalent.cn/exam/interview/jdAgwJtErNal1znK |
JavaScript大厂算法题(快手/拼多多/喜马拉雅fm):http://www.gtalent.cn/exam/interview/PJ68xt5fleuNRC9a |
c++大厂算法题(字节跳动/网易/百度/快手):http://www.gtalent.cn/exam/interview/dlK2B8TxsYq6cEM9 |
web前端工程师(电商):http://www.gtalent.cn/exam/interview/1rWl4RimyZYpg6t9 |