详细介绍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显示随机图像或引用
Apr 21 Javascript
突发奇想的一个jquery插件
Nov 19 Javascript
jQuery替换字符串(实例代码)
Nov 13 Javascript
jQuery Validate验证框架经典大全
Sep 23 Javascript
详解用node-images 打造简易图片服务器
May 08 Javascript
JQuery实现定时刷新功能代码
May 09 jQuery
Vue手把手教你撸一个 beforeEnter 钩子函数
Apr 24 Javascript
vue树形结构获取键值的方法示例
Jun 21 Javascript
JavaScript实现创建自定义对象的常用方式总结
Jul 09 Javascript
JavaScript中arguments和this对象用法分析
Aug 08 Javascript
vue实现动态列表点击各行换色的方法
Sep 13 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
Sep 27 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无序树实现方法
2015/07/28 PHP
实现PHP框架系列文章(6)mysql数据库方法
2016/03/04 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
Jquery操作下拉框(DropDownList)实现取值赋值
2013/08/13 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
JavaScript onkeydown事件入门实例(键盘某个按键被按下)
2014/10/17 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
HTML页面,测试JS对C函数的调用简单实例
2016/08/09 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
Python 实现购物商城,含有用户入口和商家入口的示例
2017/09/15 Python
python中实现k-means聚类算法详解
2017/11/11 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
python Opencv计算图像相似度过程解析
2019/12/03 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
2020/03/09 Python
html5移动端自适应布局的实现
2020/04/15 HTML / CSS
幼师自荐信
2013/10/26 职场文书
法人授权委托书范本
2014/04/04 职场文书
学校食品安全实施方案
2014/06/14 职场文书
春节超市活动方案
2014/08/14 职场文书
学生打架检讨书
2014/10/20 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书