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

post---{router.query.id}

}

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

Next stars: {stars}

}

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

Next stars: {this.props.stars}

}

}

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

title

)

}

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 (

将时间戳格式化
{time}

格式化

)

}

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: () =>

loading...

,

})

export default () => {

return (

dynamicComponent

console.log('click')}>按钮组件

)

}

8 head

设置head有利于实现更好的seo

给每个页面单独设置head

// Head组件的使用

import Head from 'next/head'

const Header = () => {

return (

<>

Head的使用

Header

>

)

}

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相关推荐

  1. ssr Android简书,Vue 服务端渲染(SSR)

    什么是服务端渲染,简单理解是将组件或页面通过服务器生成html字符串,再发送到浏览器,最后将静态标记"混合"为客户端上完全交互的应用程序.于传统的SPA(单页应用)相比,服务端渲染 ...

  2. ssr Android简书,react ssr 初体验

    用到的技术栈 react 16 + webpack3 + koa2 看看它是如何实现服务端渲染的,here we go! 为什么要用服务端渲染 优点 无非就是两点 SEO 友好 加快首屏渲染,减少白屏 ...

  3. 服务端渲染SSR与客户端渲染

    文章目录 一.服务端渲染和客户端渲染的区别 服务端渲染(SSR -- server side render) 客户端渲染 二.使用服务端渲染(SSR)的利弊 优势 局限 三.实际应用 应用原则 举例 ...

  4. ssr Android简书,渲染篇一:服务端渲染(SSR)

    导读 本文主要是从三个方面学习服务端渲染,内容整理自多个博客. 服务端渲染是什么?什么是服务端渲染?(服务端渲染的运行机制) 为什么使用服务端渲染?服务端渲染解决了什么问题? 什么情况下使用服务端渲染 ...

  5. React + Koa 实现服务端渲染(SSR)

    ⚛️React是目前前端社区最流行的UI库之一,它的基于组件化的开发方式极大地提升了前端开发体验,React通过拆分一个大的应用至一个个小的组件,来使得我们的代码更加的可被重用,以及获得更好的可维护性 ...

  6. React服务端渲染(SSR)入门及项目搭建

    代码已经关联到github: 链接地址 文章有更新也会优先在这,觉得不错可以顺手点个star,这里会持续分享自己的开发经验(: 前言 服务端渲染是什么?我们什么情况下需要使用它?想要了解这些,需要简单 ...

  7. 使用Vite 搭建高可用的服务端渲染SSR工程

    在非常早期的 Web 开发中,大家还在使用 JSP 这种古老的模板语法来编写前端的页面,然后直接将 JSP 文件放到服务端,在服务端填入数据并渲染出完整的页面内容,可以说那个时代的做法是天然的服务端渲 ...

  8. React服务端渲染实现(基于Dva)

    React服务端渲染实现 (基于Dva) 功能 基于 Dva 的 SSR 解决方案 (react-router-v4, redux, redux-saga) 支持 Dynamic Import (不再 ...

  9. 服务端渲染(SSR) 通用技术解决方案

    项目背景 服务端渲染(SSR) 通用技术解决方案的诞生来源于对 360搜索百科移动端项目的一次重构实践.而当时决定重构该项目的主要原因有以下几点: 1.  技术栈陈旧,熟悉.开发以及维护成本都较高 项 ...

最新文章

  1. android media player setlooping,Android Mediaplayer-一次播放铃声
  2. 用git发patch
  3. 《WinForm开发系列之控件篇》Item28 LinkView(暂无)
  4. OS / Linux / clone、fork、vfork 与 pthread_create 创建线程有何不同
  5. 算法,求1亿个数的中位数
  6. c标签foreach遍历list_遍历 Dictionary,你会几种方式?
  7. Computer Vision Review Incompletely
  8. ip登录打印机怎么打印_不要打印,登录。
  9. Vue 父子组件双向绑定传值
  10. ORACLE 查询所有表、外键、主键等信息
  11. python中的字体英文名_获取中文字体的英文名字
  12. sqlserver2000给账户授予所有的权限_内网渗透 | 域内权限解读
  13. SAP License:GB01中替代字段释放
  14. Database2Sharp重要更新之生成Winform框架界面代码
  15. wince 开发_正运动技术运动控制卡应用开发教程之Python
  16. ip地址范围汇总成ip网段
  17. 投资理财-赚取平均收益
  18. 多源异构网络安全关联分析
  19. 【Python网络编程】爬取百度贴吧、小说内容、豆瓣小说、Ajax爬微博、多线程爬淘宝
  20. 谁对云服务器安全负责:客户还是供应商 ?

热门文章

  1. 只有ajax会跨域吗_ajax解决跨域
  2. 信安教程第二版-第17章网络安全应急响应技术原理与应用
  3. 对一次通过CISSP考试的建议
  4. linux java 输出_Java远程连接linux的方法,执行命令并输出结果
  5. jQuery中each的用法之退出循环和结束本次循环
  6. 小汤学编程之JavaEE学习day07——版本控制工具:SVN、GIT
  7. python中range语法
  8. linux系统编程:read,write与lseek的综合应用
  9. linux的定cron计划任务命令
  10. 重操JS旧业第五弹:函数