意识SSR
1.为什么须要SSR呢?
单页面富利用的局限:
- 之前咱们开发的应用程序,如果右键间接查看源代码,能够看到下面简直没有什么内容
- 然而咱们为什么能够看到大量的内容呢?
- 因为当咱们申请下来动态资源之会执行
JS
,JS
会去申请数据,并且渲染咱们想看到的
然而这个过程存在两个问题:
- 问题一:首屏显示速度较慢
- 问题二:不利于
SEO
优化
如何解决这个问题呢?
- 应用服务端渲染
2.意识SSR
- SSR(Server Side Rendering,服务端渲染),指的是页面在服务器端曾经生成了实现的HTML页面构造,不须要浏览器解析
- 对应的是CSR(Client Side Rendering,客户端渲染),咱们开发SPA页面通常依赖的就是客户端渲染
- 晚期的服务端渲染包裹PHP、JSP、ASP等形式,然而在目前 "前后端拆散" 的开发模式下,前端开发人员不太可能再去学习PHP、 JSP等技术来开发网页
- 不过咱们能够借助于
Node
来帮忙咱们执行JavaScript
代码,提前完成页面的渲染
3.同构
- 什么是同构?
- 一套代码既能够在服务端又能够在客户端运行,这就是同构利用;
- 同构是一种SSR的状态,是现带SSR的一种表型模式;
- 当用户发出请求时,先在服务器通过SSR渲染出首页的内容;
- 然而对应的代码同样在能够在客户端执行;
- 执行的目标包含事件绑定等以及其它页面切换时也能够在客户端被渲染;
- 冀望在服务器上拿到
html
页面并发送申请,之后的的后果间接响应给客户端
之前是由浏览器执行的-》当初由node.js来实现 index.html 1.申请js文件 2.执行js文件 3.ajax 申请 4.继续执行js遍历数据,生成html构造
Next.js
1.应用React SSR
应用React SSR次要有两种形式:
- 形式一: 手动搭建一个
SSR
框架; - 形式二: 应用曾经成熟的
SSR
框架:Next.js
- 形式一: 手动搭建一个
装置
Next.js
框架的脚手架:npm install -g create-next-app
创立
Next.js
我的项目create-next-app next-demo
package.json
文件↓
2.首页的展现
Next.js
默认曾经给咱们配置好了路由映射关系:- 门路和组件的映射关系;
- 这个映射关系就是在
pages
中配置相干的组件都会主动生成对应的门路; - 默认
page/index.js
是页面的默认门路:
3.对于页面和页面跳转
- 定义About页面
- 从Home页面跳转到About页面
4.Layout组件
咱们发现home和about是两个互相独立的组件:
- 如果他们有一些公共的内容: 比方头部、尾部都是一样的,是否每个中央都须要写一遍呢?
有两种解决方案:
- 计划一: 自定义一个Layout的组件,将公共的内容放到Layout中;
- 计划二: 在 _app 中编写公共局部的内容;
5.Next.js反对各种款式
- 形式一: 全局款式引入
- 形式二:
module.css
- 形式三: 默认集成
styled-jsx
<style>{` p { color: #f879c6; }`}</style>
形式四: 其余
css in js
计划,比方styled-components
styled-components在Next服务器上渲染的的问题:
- 组件应用了
styled-components
显示是没有问题的,这是在客户端进行渲染的,然而只有咱们手动刷新,className
就不进行匹配,这是因为在服务端渲染和在客户端渲染的className
不匹配
- 组件应用了
- 如何解决:引入相干依赖,创立和编辑
.babelrc
文件 yarn add styled-components
yarn add -D babel-plugin-styled-components
- 编辑
.babelrc
文件
{ "presets": [ "next/babel" ], "plugins": [ ["styled-components"] ]}
6.路由的补充
路由的嵌套(子路由):
- 文件夹的嵌套,最初就能够造成子路由;
路由的传参:
- Next.js中无奈通过 /user/:id 形式传递参数;
- 只能通过 /user?id=123 的形式来传递参数
传递参数由两种办法:
- Link中的门路
- Router.push( pathname,query )
<Link href={`/recommend?id=${item}`} key={item}> <a>举荐数据{item}</a></Link>import Router from 'next/router'const itemClick = (item) => { Router.push({ pathname: 'recommend', query: { id: item } })}
7.数据申请
- getInitialProps
// 返回一个promise对象或者返回对象Home.getInitialProps = async (props) => { const res = await axios({ url: 'http://39.102.36.212:3000/banner' }) return { name: 'why', banners: res.data.banner, recommends: res.data.recommend.list, }}