ssr Android简书,react服务端渲染ssr
Next.js
一个轻量级的 React 服务端渲染框架
1 概念
SPA
single page application : 单页面应用程序
缺点:首屏加载慢,不利于SEO
SSR
Server-side rendering : 服务端渲染
SEO
Search Engine Optimization : 搜索引擎优化
Next.js优点
1 搭建轻松
2 自带数据同步 SSR 服务端-->客户端
3 丰富的生态, 插件
4 灵活的配置
2 搭建项目
2.1 手动搭建
# scripts
dev - Runs next dev which starts Next.js in development mode
build - Runs next build which builds the application for production usage
start - Runs next start which starts a Next.js production server
2.2 create-next-app脚手架搭建
安装
npx create-next-app
// 启动
yarn dev
3 页面和组件
页面
# 不需要引入react依赖
# 页面写在pages文件夹内
# 自动根据其文件名与路由关联,不需要配置路由
pages/index.js --> /
pages/about.js --> /about
# 嵌套路径使用文件夹
pages/blog/nextBlog.js --> /blog/nextBlog.js
组件
# 组件写在components文件夹内
// compones/button.js
export default ({ children }) => {
return {children}
}
// 使用
import Button from '../components/button'
按钮组件
4 路由
4.1 声明式导航和编程式导航
声明式导航
import Link from '/next/link'
去页面b
编程式导航
import Router from 'next/router'
// 传递string
Router.push('/router-b?id=123')
// 传递对象
Router.push({
pathname:'/router-b',
query:{id:123}
})
获取路由相关参数
// hook的方式
import { useRouter } from 'next/router'
const router = useRouter()
const { id } = router.query
// 高阶组件的方式
import { withRouter } from 'next/router'
withRouter(组件)
this.props.router.query
4.2 动态路由
// pages/post/[id].js -- 通过文件名的方式实现动态路由
import { useRouter } from 'next/router'
const Post = () => {
const router = useRouter()
console.log('router: ', router)
return
}
export default Post
// 访问页面
http://localhost:3000/post/123
4.3 路由守卫
4.4 路由事件 (router.events)
routeChangeStart(url) -- 路由将要改变时触发
routeChangeComplete(url) -- 路由改变完成时触发
beforeHistoryChange(url) -- 浏览器history改变之前触发
hashChangeStart(url) -- hash将要改变时触发
// pages/_app.js
import '../styles/globals.css'
import { useRouter } from 'next/router'
import { useEffect } from 'react'
function MyApp({ Component, pageProps }) {
const router = useRouter()
const handleRouteChangeStart = url => console.log('routeChangeStart---', url)
const handleRouteChangeComplete = url => console.log('routeChangeComplete---', url)
const handleBeforeHistoryChange = url => console.log('beforeHistoryChange---', url)
useEffect(() => {
// 注册事件
router.events.on('routeChangeStart', handleRouteChangeStart)
router.events.on('routeChangeComplete', handleRouteChangeComplete)
router.events.on('beforeHistoryChange', handleBeforeHistoryChange)
return () => {
// 注销事件
router.events.off('routeChangeStart', handleRouteChangeStart)
router.events.off('routeChangeComplete', handleRouteChangeComplete)
router.events.off('beforeHistoryChange', handleBeforeHistoryChange)
}
}, [])
return
}
export default MyApp
5 获取远程数据 getInitialProps
函数组件
function Page({ stars }) {
return
}
Page.getInitialProps = async (ctx) => {
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const json = await res.json()
return { stars: json.stargazers_count }
}
export default Page
类组件
import React from 'react'
class Page extends React.Component {
static async getInitialProps(ctx) {
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const json = await res.json()
return { stars: json.stargazers_count }
}
render() {
return
}
}
export default Page
这种方法获取数据是在服务端完成,通过打开network查看元素发现,整个页面时包括数据生成的页面结构都是一次性返回的。这样的好处是有利于seo优化,百度爬虫能抓取到页面的内容
6 css的使用
6.1 添加全局样式
要将样式表添加到您的应用程序中,请在 pages/_app.js 文件中导入(import)CSS 文件
// pages/_app.js
import '../styles/globals.css'
6.2 css模块化和使用sass
// yarn add sass
// 使用方式和cra项目一致
import styles from './index.module.scss'
const Style = () => {
return (
123
)
}
export default Style
.Style {
color: red;
.title{
font-weight: 700;
font-size: 40px;
}
}
7 懒加载
7.1 第三方库懒加载
import { useState } from 'react'
export default () => {
const timeStamp = +new Date()
const [time, setTime] = useState(timeStamp)
const handleClick = async () => {
// 当点击按钮的时候才会去加载moment
const moment = await import('moment')
console.log(setTime(moment.default(timeStamp).format('YYYY-MM-DD HH:mm:ss')))
}
return (
格式化
)
}
7.2 组件懒加载
// components/button.js
export default ({ children, ...restProps }) => {
return {children}
}
import dynamic from 'next/dynamic'
// 基础用法
// const Button = dynamic(import('../components/button'))
// 高级用法
const Button = dynamic(() => import('../components/button'), {
// 添加加载中状态
loading: () =>
,
})
export default () => {
return (
dynamicComponent
console.log('click')}>按钮组件
)
}
8 head
设置head有利于实现更好的seo
给每个页面单独设置head
// Head组件的使用
import Head from 'next/head'
const Header = () => {
return (
<>
Head的使用
>
)
}
export default Header
9 使next支持引入使用css
全局的css只能在pages/_app.js 内引入, 或者使用css module 进行引入使用css
安装
yarn add @zeit/next-css
const withCss = require('@zeit/next-css')
if(typeof require !== 'undefined'){
require.extensions['.css']=file=>{}
}
module.exports = withCss({})
要实现 antd 按需加载需要配置这个
10 antd按需加载
安装
yarn add babel-plugin-import
配置文件 .babelrc
{
"presets":["next/babel"], //Next.js的总配置文件,相当于继承了它本身的所有配置
"plugins":[ //增加新的插件,这个插件就是让antd可以按需引入,包括CSS
[
"import",
{
"libraryName":"antd",
"style":"css"
}
]
]
}
参考资料
ssr Android简书,react服务端渲染ssr相关推荐
- ssr Android简书,Vue 服务端渲染(SSR)
什么是服务端渲染,简单理解是将组件或页面通过服务器生成html字符串,再发送到浏览器,最后将静态标记"混合"为客户端上完全交互的应用程序.于传统的SPA(单页应用)相比,服务端渲染 ...
- ssr Android简书,react ssr 初体验
用到的技术栈 react 16 + webpack3 + koa2 看看它是如何实现服务端渲染的,here we go! 为什么要用服务端渲染 优点 无非就是两点 SEO 友好 加快首屏渲染,减少白屏 ...
- 服务端渲染SSR与客户端渲染
文章目录 一.服务端渲染和客户端渲染的区别 服务端渲染(SSR -- server side render) 客户端渲染 二.使用服务端渲染(SSR)的利弊 优势 局限 三.实际应用 应用原则 举例 ...
- ssr Android简书,渲染篇一:服务端渲染(SSR)
导读 本文主要是从三个方面学习服务端渲染,内容整理自多个博客. 服务端渲染是什么?什么是服务端渲染?(服务端渲染的运行机制) 为什么使用服务端渲染?服务端渲染解决了什么问题? 什么情况下使用服务端渲染 ...
- React + Koa 实现服务端渲染(SSR)
⚛️React是目前前端社区最流行的UI库之一,它的基于组件化的开发方式极大地提升了前端开发体验,React通过拆分一个大的应用至一个个小的组件,来使得我们的代码更加的可被重用,以及获得更好的可维护性 ...
- React服务端渲染(SSR)入门及项目搭建
代码已经关联到github: 链接地址 文章有更新也会优先在这,觉得不错可以顺手点个star,这里会持续分享自己的开发经验(: 前言 服务端渲染是什么?我们什么情况下需要使用它?想要了解这些,需要简单 ...
- 使用Vite 搭建高可用的服务端渲染SSR工程
在非常早期的 Web 开发中,大家还在使用 JSP 这种古老的模板语法来编写前端的页面,然后直接将 JSP 文件放到服务端,在服务端填入数据并渲染出完整的页面内容,可以说那个时代的做法是天然的服务端渲 ...
- React服务端渲染实现(基于Dva)
React服务端渲染实现 (基于Dva) 功能 基于 Dva 的 SSR 解决方案 (react-router-v4, redux, redux-saga) 支持 Dynamic Import (不再 ...
- 服务端渲染(SSR) 通用技术解决方案
项目背景 服务端渲染(SSR) 通用技术解决方案的诞生来源于对 360搜索百科移动端项目的一次重构实践.而当时决定重构该项目的主要原因有以下几点: 1. 技术栈陈旧,熟悉.开发以及维护成本都较高 项 ...
最新文章
- android media player setlooping,Android Mediaplayer-一次播放铃声
- 用git发patch
- 《WinForm开发系列之控件篇》Item28 LinkView(暂无)
- OS / Linux / clone、fork、vfork 与 pthread_create 创建线程有何不同
- 算法,求1亿个数的中位数
- c标签foreach遍历list_遍历 Dictionary,你会几种方式?
- Computer Vision Review Incompletely
- ip登录打印机怎么打印_不要打印,登录。
- Vue 父子组件双向绑定传值
- ORACLE 查询所有表、外键、主键等信息
- python中的字体英文名_获取中文字体的英文名字
- sqlserver2000给账户授予所有的权限_内网渗透 | 域内权限解读
- SAP License:GB01中替代字段释放
- Database2Sharp重要更新之生成Winform框架界面代码
- wince 开发_正运动技术运动控制卡应用开发教程之Python
- ip地址范围汇总成ip网段
- 投资理财-赚取平均收益
- 多源异构网络安全关联分析
- 【Python网络编程】爬取百度贴吧、小说内容、豆瓣小说、Ajax爬微博、多线程爬淘宝
- 谁对云服务器安全负责:客户还是供应商 ?