详细介绍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 相关文章推荐
javascript重复绑定事件造成的后果说明
Mar 02 Javascript
jquery实现html页面 div 假分页有原理有代码
Sep 06 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
Aug 06 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
Nov 30 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
Dec 13 Javascript
jQuery获取单击节点对象的方法
Jun 02 Javascript
Angular2 PrimeNG分页模块学习
Jan 14 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
Jan 23 Javascript
ES6 Promise对象概念与用法分析
Apr 01 Javascript
详解Angular4中路由Router类的跳转navigate
Jun 09 Javascript
javaScript实现滚动条事件详解
Mar 24 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
Nov 06 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中邮箱地址正则表达式实现与详解
2012/04/24 PHP
php遍历目录方法小结
2015/03/10 PHP
phpstudy的php版本自由修改的方法
2017/10/18 PHP
jQuery 使用手册(三)
2009/09/23 Javascript
20个非常棒的Jquery实用工具 国外文章
2010/01/01 Javascript
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
jQuery实现鼠标滑过遮罩并高亮显示效果
2013/07/16 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
jQuery焦点图轮播特效代码分享(3款)
2015/09/05 Javascript
jQuery实现标题有打字效果的焦点图代码
2015/11/16 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
Angular实现购物车计算示例代码
2017/02/21 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
Python中用max()方法求最大值的介绍
2015/05/15 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
Python反射的用法实例分析
2018/02/11 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
Python利用全连接神经网络求解MNIST问题详解
2020/01/14 Python
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
教育实习生的自我评价分享
2013/11/21 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
校园环保标语
2014/06/13 职场文书
交通事故协议书范本
2014/11/18 职场文书
招标保密承诺书
2015/01/20 职场文书
redis限流的实际应用
2021/04/24 Redis