详细介绍Next.js脚手架完整搭建封装


Posted in Javascript onApril 26, 2022

针对实际的开发场景(SEO优化需求),我们直接使用next.js脚手架创建的项目还无法直接进行开发,需要再次进行配置封装搭建,这里分享一套自己的完整封装搭建给有需要的小伙伴使用;

内容包括:
(1)sass样式配置;
(2)axios拦截封装;
(3)action模块化;
(4)reducer模块化;
(5)redux搭建;
(6)dispatch示范;
(7)saga中间件配置;
(8)saga拦截示范;
(9)useEffect异步请求示范;
(10)getServerSideProps/getStaticProps示范;
(11)ssr与csr效果对比;
基本可以做到直接使用,如有特殊的配置需要,大家也可以自行添加即可;
(1)npm install
(2)npm run dev

仓库地址

仓库代码(github)

运行效果

详细介绍Next.js脚手架完整搭建封装

代码实现

import type { NextPage } from 'next'
import Head from 'next/head'
import Image from 'next/image'
import React, {useEffect, useState } from 'react';
import {useDispatch,useSelector} from 'react-redux'
import fetch from 'node-fetch';
import api from '../http/api';
import {changeUserAC} from "../redux/actions/index"
import axios from 'axios';
import Publish from '../components/common/Publish/Publish';
import { compileString } from 'sass';

const Home: NextPage = (props:any) => {
//异步请求的数据(客户端渲染);
  const [name,setName]=useState<any>("")
  useEffect(()=>{
    (async()=>{
      const res:any =await axios({
        url:"https://api.apiopen.top/getSingleJoke?sid=28654780"
      })
      setName(res.result.name)
      console.log("客户端获取的数据",res);
      console.log("服务端注入的数据",props);
    })();
  },[])
//异步请求的数据(客户端渲染);

  //状态机内部的数据;
  const stateData:any = useSelector<any>(state=>{
    console.log("状态机数据",state);
    return state
  })
  //状态机内部的数据;

  //派发action修改状态机内部的数据;
  const dispatch = useDispatch();
  const changeRedux=()=>{
    dispatch(changeUserAC("李海"))
  } 
  //派发action修改状态机内部的数据;

  //调用封装的axios获取后台数据
  const getData = async () => {
    const res:any = await api.dataManage.GetCollectionData();
    console.log('请求结果',res);
    alert(`请求结果${res.result.name}`)
  };
  //调用封装的axios获取后台数据

  const compareEffect=async()=>{
    window.location.reload()
  }

  //saga拦截
  const goToSaga=()=>{
    dispatch(
      {
        type:'changeUserData',
        payload:'刘利'
      }
    )
  } 
  //saga拦截

  return (
    <>
          <div>
            <p>来自服务端注入预渲染的:{props.data.result.name}</p>
            <p>来自异步请求返回的:{name}</p>
            <p><button onClick={()=>compareEffect()}>对比服务端渲染和客户端渲染效果</button></p>
            <p>来自Redux的数据:{stateData.user.users}</p>
            <p><button onClick={()=>changeRedux()}>派发事件修改redux数据</button></p>
            <p><button onClick={()=>getData()}>调用封装的axios获取后台数据</button></p>
            <p><button onClick={()=>goToSaga()}>通过saga中间件拦截后修改redux数据</button></p>
            <div style={{marginLeft:30,marginTop:30}}><Publish/></div>
          </div>
    </>
  );
}

export async function getServerSideProps() {
  const res = await fetch(`https://api.apiopen.top/getSingleJoke?sid=28654780`)
  const data = await res.json()
  return { props: { data } }
}
// export async function getStaticProps() {
//   const res = await fetch('...')
//   const posts = await res.json()
//   return {
//     props: {
//       return { props: { data } }
//     },
//   }
// }
export default Home

到此这篇关于Next.js脚手架完整搭建封装的方法步骤的文章就介绍到这了!


Tags in this post...

Javascript 相关文章推荐
解决Jquery load()加载GB2312页面时出现乱码的两种方案
Sep 10 Javascript
快速学习JavaScript的6个思维技巧
Oct 13 Javascript
移动端横屏的JS代码(beta)
May 16 Javascript
JavaScript中最常见的三个面试题解析
Mar 04 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
Mar 15 Javascript
jQuery 实现双击编辑表格功能
Jun 19 jQuery
原生js实现简单的链式操作
Jul 04 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
Jul 20 Javascript
javascript兼容性(实例讲解)
Aug 15 Javascript
详解ES6中的代理模式——Proxy
Jan 08 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
Aug 08 Javascript
Electron中实现大文件上传和断点续传功能
Oct 28 Javascript
vue 把二维或多维数组转一维数组
Apr 24 #Vue.js
Vue OpenLayer 为地图绘制风场效果
Apr 24 #Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
vue @click.native 绑定原生点击事件
Apr 22 #Vue.js
vue实现省市区联动 element-china-area-data插件
uniapp 微信小程序 自定义tabBar 导航
Apr 22 #Javascript
vue修饰符.capture和.self的区别
Apr 22 #Vue.js
You might like
php中iconv函数使用方法
2008/05/24 PHP
php全角字符转换为半角函数
2014/02/07 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
PHP+ajax实现二级联动菜单功能示例
2018/08/10 PHP
Document 对象的常用方法
2009/07/31 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
BootStrap中Tab页签切换实例代码
2016/05/30 Javascript
JavaScript与java语言有什么不同
2016/09/22 Javascript
js 动态生成json对象、时时更新json对象的方法
2016/12/02 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
详解vue组件之间的通信
2020/08/30 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
[02:27]刀塔重生降临
2015/10/14 DOTA
[04:54]DOTA2 2017国际邀请赛:上届冠军WINGS采访短片
2017/08/09 DOTA
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
Python与Redis的连接教程
2015/04/22 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
2018/03/14 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
Tensorflow分类器项目自定义数据读入的实现
2019/02/05 Python
pycharm 安装JPype的教程
2019/08/08 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
Python如何操作docker redis过程解析
2020/08/10 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
物业管理求职自荐信
2013/09/25 职场文书
厨房工作人员岗位职责
2013/11/15 职场文书
分厂厂长岗位职责
2013/12/29 职场文书
幼儿园毕业园长感言
2014/02/24 职场文书
2014年教师党员自我评议
2014/09/19 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书