详细介绍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显示隐藏层比较不错的方法分析
Sep 30 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
May 23 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
Jan 26 Javascript
js css 实现遮罩层覆盖其他页面元素附图
Sep 22 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
Apr 06 Javascript
实现前后端数据交互方法汇总
Apr 07 Javascript
jQuery实现首页图片淡入淡出效果的方法
Jun 10 Javascript
JavaScript数据结构链表知识详解
Nov 21 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
Aug 14 Javascript
node版本管理工具n包使用教程详解
Nov 09 Javascript
浅谈Angular单元测试总结
Mar 22 Javascript
改变layer confirm弹窗按钮的颜色方法
Sep 12 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中stream(流)的用法
2014/03/25 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
2019/04/03 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
2012/03/14 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
jquery单行文字向上滚动效果的实现代码
2014/09/05 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
ionic组件ion-tabs选项卡切换效果实例
2016/08/27 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
vue 表单验证按钮事件交由父组件触发的方法
2018/12/17 Javascript
vue中的mvvm模式讲解
2019/01/31 Javascript
原生Vue 实现右键菜单组件功能
2019/12/16 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
JavaScript undefined及null区别实例解析
2020/07/21 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
解读Python编程中的命名空间与作用域
2015/10/16 Python
分享给Python新手们的几道简单练习题
2017/09/21 Python
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
Python绘制的二项分布概率图示例
2018/08/22 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
Python设计密码强度校验程序
2020/07/30 Python
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
美术专业学生个人自我评价
2013/09/19 职场文书
秋季运动会稿件
2014/01/30 职场文书
公司委托书范本
2014/04/04 职场文书
学生党员公开承诺书
2014/05/28 职场文书
教你怎么用Python实现多路径迷宫
2021/04/29 Python