[Next.js 14] mock 数据解决方案

837 阅读2分钟

本文主要介绍基于Next.js的工程如何集成Mockjs

项目地址:zhaoth/React-Next-Admin (github.com)

线上地址:react-next-admin.pages.dev

Mock.js

目前国内用的最多的 mock 数据生成方案,具体用法详见官方网站

mockjs会默认拦截ajax 请求,只要 mock 地址和请求地址一致即可

安装

npm install mockjs

目录结构

在 src目录下添加 mock 数据文件夹

image.png

文件夹中添加 基于mockjs 数据模拟文件 userInfo.ts

import Mock from 'mockjs';

const Random = Mock.Random;
const userInfo = Mock.mock('/user/login', 'post', () => {
  const ret = Mock.mock({ username: '@cname', age: Random.integer(60, 100), ID: Random.id() });
  return {
    status: 200,
    data: ret,
  };
});

export { userInfo };

同时添加 index.ts文件,该文件是为了对应多个 mock 数据模拟文件提供统一导出入口

export { userInfo } from './userInfo';

env 文件添加 mock 控制开关

NEXT_PUBLIC_MOCK=true

添加MockComponent.tsx组件

本项目由于运用 APP router 和 静态导出模式,无法使用middleware统一拦截 mockjs,所以需要添加 该组件,并添加到 Layout 布局中

'use client';
import { useEffect } from 'react';

export default function MockComponent() {
  useEffect(() => {
    if (typeof window !== 'undefined') {
      if (process.env.NEXT_PUBLIC_MOCK === 'true') {
        require('@/mock/index');
      }
    }
  }, []);

  return null;
};

layout 组件中添加

export default function EmptyLayout({ children, params: { locale } }: Props) {
  const messages = locale === 'en' ? en : zh;
  return (
    <NextIntlClientProvider locale={locale} messages={messages} timeZone={timeZone}>
      <AntdStyledComponentsRegistry>
        <MockComponent></MockComponent>
        {children}
      </AntdStyledComponentsRegistry>
    </NextIntlClientProvider>
  );
}

总结

这样一个完整的 nextjs14集成mockjs 方案已经完成,其实对于前端 mock 数据一直有争议,有的人认为必须有,有的人认为这个东西浪费时间还有代码侵入,其实我个人认为这个东西存在即合理,只要合理运用就好,个人经验是如果后端接口比较快和明确就没有必要用,但是如果前后端时间无法同步的话就需要使用,但是这个就必须和后端小伙伴约定好输入输出了,因为如果后端数据接口有修改的话,前端就会有一定额外的工作量的出现。