详细介绍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 实用的文字链提示框效果
Jun 30 Javascript
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
Nov 30 Javascript
javascript 基础篇4 window对象,DOM
Mar 14 Javascript
使用jQuery判断IE浏览器版本的代码
Jun 14 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
Apr 16 Javascript
jQuery弹出层插件Lightbox_me使用指南
Apr 21 Javascript
js实现界面向原生界面发消息并跳转功能
Nov 22 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
Sep 12 Javascript
React Native中TabBarIOS的简单使用方法示例
Oct 13 Javascript
js中的 || 与 &amp;&amp; 运算符详解
May 24 Javascript
vue 子组件和父组件传值的示例
Sep 11 Javascript
JavaScript手写数组的常用函数总结
Nov 22 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下10件你也许并不了解的事情
2008/09/11 PHP
php表单转换textarea换行符的方法
2010/09/10 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
Laravel中使用自己编写类库的3种方法
2015/02/10 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
jquery插件hiAlert实现网页对话框美化
2015/05/03 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
详解Node 定时器
2018/02/26 Javascript
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
2018/10/26 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
js实现坦克移动小游戏
2019/10/28 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
深入理解python对json的操作总结
2017/01/05 Python
pycharm远程调试openstack代码
2017/11/21 Python
tensorflow实现KNN识别MNIST
2018/03/12 Python
浅谈python下tiff图像的读取和保存方法
2018/12/04 Python
解决Python3 抓取微信账单信息问题
2019/07/19 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
python文字转语音的实例代码分析
2019/11/12 Python
关于Python-faker的函数效果一览
2019/11/28 Python
基于python实现matlab filter函数过程详解
2020/06/08 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
利物浦足球俱乐部官方网上商店:Liverpool FC Official Store
2018/01/13 全球购物
什么是唯一索引
2015/07/05 面试题
DOM和JQuery对象有什么区别
2016/11/11 面试题
关于安全演讲稿
2014/05/09 职场文书
质量负责人任命书
2014/06/06 职场文书