详细介绍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的IE和Firefox兼容性汇编(zz)
Feb 02 Javascript
jQuery学习基础知识小结
Nov 25 Javascript
JS链式调用的实现方法
Mar 07 Javascript
热点新闻滚动特效的js代码
Aug 17 Javascript
实例分析js和C#中使用正则表达式匹配a标签
Nov 26 Javascript
javascript实现checkbox全选的代码
Apr 30 Javascript
浅谈javascript中基本包装类型
Jun 03 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
Jul 01 Javascript
node使用UEditor富文本编辑器的方法实例
Jul 11 Javascript
vue中使用echarts制作圆环图的实例代码
Jul 27 Javascript
说说如何使用Vuex进行状态管理(小结)
Apr 14 Javascript
原生JavaScript实现幻灯片效果
Feb 19 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的session cookie错误
2009/08/09 PHP
用PHP实现Ftp用户的在线管理
2012/02/16 PHP
使用PHP会话(Session)实现用户登陆功能
2013/06/29 PHP
Smarty foreach控制循环次数的实现详解
2013/07/03 PHP
php读取图片内容并输出到浏览器的实现代码
2013/08/08 PHP
php目录遍历函数opendir用法实例
2014/11/20 PHP
php输出形式实例整理
2020/05/05 PHP
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
用nodejs的实现原理和搭建服务器(动态)
2016/08/10 NodeJs
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
python实现斐波那契递归函数的方法
2014/09/08 Python
Django 多语言教程的实现(i18n)
2018/07/07 Python
Python实现的批量修改文件后缀名操作示例
2018/12/07 Python
Python3安装pip工具的详细步骤
2019/10/14 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
Python如何定义接口和抽象类
2020/07/28 Python
Python pysnmp使用方法及代码实例
2020/08/24 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
W Concept美国:精选全球独立设计师
2017/02/22 全球购物
几道Web/Ajax的面试题
2016/11/05 面试题
企业三严三实学习心得体会
2014/10/13 职场文书
2015年工程部工作总结
2015/04/30 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
Java实现多线程聊天室
2021/06/26 Java/Android
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL