详细介绍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 相关文章推荐
jQuery实现分隔条左右拖动功能
Nov 21 Javascript
JavaScript的Number对象的toString()方法
Dec 18 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
Jul 07 Javascript
jquery插件uploadify多图上传功能实现代码
Aug 12 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
Sep 28 Javascript
bootstrap实现图片自动轮播
Dec 21 Javascript
BootstrapTable refresh 方法使用实例简单介绍
Feb 20 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
Jun 26 Javascript
vue-cli项目修改文件热重载失效的解决方法
Sep 19 Javascript
vue与iframe之间的信息交互的实现
Apr 08 Javascript
jQuery 实现扁平式小清新导航
Jul 07 jQuery
Vue实现背景更换颜色操作
Jul 17 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
人大复印资料处理程序_补充篇
2006/10/09 PHP
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/21 PHP
mysql总结之explain
2012/02/27 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
让CodeIgniter的ellipsize()支持中文截断的方法
2014/06/12 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
php实现微信支付之现金红包
2018/05/30 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
layui 中select下拉change事件失效的解决方法
2019/09/20 Javascript
webpack HappyPack实战详解
2019/10/08 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
python实现udp数据报传输的方法
2014/09/26 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
python如何从文件读取数据及解析
2019/09/19 Python
Python计算IV值的示例讲解
2020/02/28 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
美国领先的低折扣旅行网站:Hotwire
2019/01/19 全球购物
普天C++笔试题
2016/03/20 面试题
2014感恩节演讲稿大全
2014/10/11 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
2016暑期社会实践新闻稿
2015/11/25 职场文书
python 破解加密zip文件的密码
2021/04/22 Python
原生JS中应该禁止出现的写法
2021/05/05 Javascript
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python