详细介绍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 相关文章推荐
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
Mar 11 Javascript
jQuery获取剪贴板内容的方法
Jun 16 Javascript
JavaScript的==运算详解
Jul 20 Javascript
使用jquery给新生的th绑定hover事件的实例
Feb 10 Javascript
JavaScript Base64 作为文件上传的实例代码解析
Feb 14 Javascript
Vue.js实现模拟微信朋友圈开发demo
Apr 20 Javascript
Node学习记录之cluster模块
May 31 Javascript
jQuery中.attr()和.data()的区别分析
Sep 03 jQuery
详解webpack性能优化——DLL
Oct 20 Javascript
详解Axios统一错误处理与后置
Sep 26 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
Aug 23 Javascript
es6函数之rest参数用法实例分析
Apr 18 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
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
PHP Zip压缩 在线对文件进行压缩的函数
2010/05/26 PHP
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
JavaScript Split()方法
2015/12/18 Javascript
三种AngularJS中获取数据源的方式
2016/02/02 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
JavaScript 中 apply 、call 的详解
2017/03/21 Javascript
移动端使用localResizeIMG4压缩图片
2017/04/22 Javascript
详解webpack2+React 实例demo
2017/09/11 Javascript
Web技术实现移动监测的介绍
2017/09/18 Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
2019/04/09 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
js表达式与运算符简单操作示例
2020/02/15 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
Python的gevent框架的入门教程
2015/04/29 Python
wxPython之解决闪烁的问题
2018/01/15 Python
Django 根据数据模型models创建数据表的实例
2018/05/27 Python
python中sys.argv函数精简概括
2018/07/08 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
Pytorch之parameters的使用
2019/12/31 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
2020/03/02 Python
4S店售后客服自我评价
2014/04/09 职场文书
学校学雷锋活动总结
2014/06/26 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
行为习惯主题班会
2015/08/14 职场文书
新员工入职感言范文!
2019/07/04 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
Python实现信息轰炸工具(再也不怕说不过别人了)
2021/06/11 Python
Redis入门教程详解
2021/08/30 Redis
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis
Redis数据同步之redis shake的实现方法
2022/04/21 Redis