详细介绍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 Firefox与IE 替换节点的方法
Feb 24 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
Apr 07 Javascript
js实现的捐赠管理完整实例
Jan 20 Javascript
JavaScript字符串常用类使用方法汇总
Apr 14 Javascript
js实现全国省份城市级联下拉菜单效果代码
Sep 07 Javascript
Javascript验证方法大全
Sep 21 Javascript
跟我学习javascript的闭包
Nov 16 Javascript
js实现PC端根据IP定位当前城市地理位置
Feb 22 Javascript
结合Vue控制字符和字节的显示个数的示例
May 17 Javascript
详解创建自定义的Angular Schematics
Jun 06 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
Aug 14 jQuery
解决vue中监听input只能输入数字及英文或者其他情况的问题
Aug 30 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 include加载文件两种方式效率比较
2010/08/08 PHP
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
linux下实现定时执行php脚本
2015/02/13 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
2017/02/05 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
2019/06/19 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
点图片上一页下一页翻页效果
2008/07/09 Javascript
JavaScript 继承详解(三)
2009/07/13 Javascript
js调试系列 源码定位与调试[基础篇]
2014/06/18 Javascript
JavaScript简介
2015/02/15 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
jQuery中Datatables增加跳转到指定页功能
2017/02/08 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
2018/07/26 Javascript
值得收藏的八个常用的js正则表达式
2018/10/19 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
2018/10/19 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
python实现在pickling的时候压缩的方法
2014/09/25 Python
Python实现程序的单一实例用法分析
2015/06/03 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
综合实践活动方案
2014/02/14 职场文书
社区活动总结范文
2015/05/07 职场文书
DBCA命令行搭建Oracle ADG的流程
2021/06/11 Oracle