详细介绍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 相关文章推荐
一些技巧性实用js代码小结
Oct 14 Javascript
js的隐含参数(arguments,callee,caller)使用方法
Jan 28 Javascript
jquery 选取方法都有哪些
May 18 Javascript
javascript限制用户只能输汉字中文的方法
Nov 20 Javascript
JS数组(Array)处理函数整理
Dec 07 Javascript
jQuery表单域选择器用法分析
Feb 10 Javascript
浅析Javascript ES6中的原生Promise
Aug 25 Javascript
原生js实现无缝轮播图效果
Jan 11 Javascript
浅谈node.js 命令行工具(cli)
May 10 Javascript
详解vue2.0监听属性的使用心得及搭配计算属性的使用
Jul 18 Javascript
electron中使用bootstrap的示例代码
Nov 06 Javascript
微信小程序select下拉框实现效果
May 15 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
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
php中执行系统命令的方法
2015/03/21 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
PHP实现动态创建XML文档的方法
2018/03/30 PHP
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
Ionic2调用本地SQlite实例
2017/04/22 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
vue实现轮播图帧率播放
2021/01/26 Vue.js
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
Python验证企业工商注册码
2015/10/25 Python
机器学习10大经典算法详解
2017/12/07 Python
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
Python 文本文件内容批量抽取实例
2018/12/10 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
2020/05/08 Python
Python新手学习装饰器
2020/06/04 Python
python中return不返回值的问题解析
2020/07/22 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
2014年党员公开承诺践诺书
2014/03/25 职场文书
股指期货心得体会
2014/09/13 职场文书
群众路线教育实践活动调研报告
2014/11/03 职场文书
公司员工辞职信范文
2015/05/12 职场文书
房产遗嘱范本
2015/08/06 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript
零基础学java之循环语句的使用
2022/04/10 Java/Android