详细介绍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 相关文章推荐
使用Math.floor与Math.random取随机整数的方法详解
May 07 Javascript
解析javascript系统错误:-1072896658的解决办法
Jul 08 Javascript
jquery选择器、属性设置用法经验总结
Sep 08 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
Jan 10 Javascript
JQuery调用WebServices的方法和4个实例
May 06 Javascript
Javascript中的return作用及javascript return关键字用法详解
Nov 05 Javascript
JavaScript使用Range调色及透明度实例
Sep 25 Javascript
Vue.js组件tree实现无限级树形菜单
Dec 02 Javascript
JS实现DIV高度自适应窗口示例
Feb 16 Javascript
微信、QQ、微博、Safari中使用js唤起App
Jan 24 Javascript
使用Angular-CLI构建NPM包的方法
Sep 07 Javascript
javascript原型链学习记录之继承实现方式分析
May 01 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程序实现支持页面后退的两种方法
2008/06/30 PHP
php编程实现获取excel文档内容的代码实例
2011/06/28 PHP
php include和require的区别深入解析
2013/06/17 PHP
PhpDocumentor 2安装以及生成API文档的方法
2014/05/21 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
2020/04/20 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
DWR Ext 加载数据
2009/03/22 Javascript
javascript 日期常用的方法
2009/11/11 Javascript
Javascript浅谈之引用类型
2013/12/18 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
JsRender for index循环索引用法详解
2014/10/31 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
初学vue出现空格警告的原因及其解决方案
2019/10/31 Javascript
js实现网页版贪吃蛇游戏
2020/02/22 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
[01:00:53]OG vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
python opencv调用笔记本摄像头
2019/08/28 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
利用html5 canvas破解简单验证码及getImageData接口应用
2013/01/25 HTML / CSS
总经理助理的职责
2014/03/14 职场文书
校庆筹备方案
2014/03/30 职场文书
关爱老人标语
2014/06/21 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
大一新生检讨书
2014/10/29 职场文书
2014年家长学校工作总结
2014/11/20 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
2016中考冲刺决心书
2015/09/22 职场文书