详细介绍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中的Location地址对象
Jan 16 Javascript
[Web]防止用户复制页面内容和另存页面的方法
Feb 06 Javascript
jquery 单击li防止重复加载的实现代码
Dec 24 Javascript
js实现在文本框光标处添加字符的方法介绍
Nov 24 Javascript
JS仿淘宝实现的简单滑动门效果代码
Oct 14 Javascript
谈谈对JavaScript原生拖放的深入理解
Sep 20 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
Feb 06 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
Dec 19 Javascript
详解VUE2.X过滤器的使用方法
Jan 11 Javascript
vue中v-for加载本地静态图片方法
Mar 03 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
May 10 Javascript
Vue前端判断数据对象是否为空的实例
Sep 02 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选项与信息函数的使用详解
2013/05/10 PHP
php的POSIX 函数以及进程测试的深入分析
2013/06/03 PHP
php实现的css文件背景图片下载器代码
2014/11/11 PHP
微信自定义分享php代码分析
2016/11/24 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
2015/09/19 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
2016/12/20 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
2017/07/19 jQuery
微信小程序 获取session_key和openid的实例
2017/08/17 Javascript
vue子路由跳转实现tab选项卡
2019/07/24 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
200 行python 代码实现 2048 游戏
2018/01/12 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
python 构造三维全零数组的方法
2018/11/12 Python
基于python使用tibco ems代码实例
2019/12/20 Python
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
主持人演讲稿
2014/05/13 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
中学生旷课检讨书2篇
2014/10/09 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
出纳2015年度工作总结范文
2015/10/14 职场文书
2019初中学生入团申请书
2019/06/27 职场文书
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python