从零开始搭建React+TypeScript+webpack开发环境-自定义配置化的模拟服务器

技术栈

我们将使用Node.js和Express.js作为我们的后端框架,以及Node.js的文件系统(fs)模块来操作文件和文件夹。此外,我们将使用Node.js的requiredelete require.cache来加载和更新模拟数据。

项目结构

首先,让我们定义一个简单的项目结构:

复制代码
- your-project/
  - mock/
    - api/
      - users.json
    - other/
      - products.json
  - server.js

mock文件夹中,我们可以为不同的API接口创建不同的子文件夹,并在每个子文件夹中放置相应的JSON文件,以模拟不同的数据。然后,我们将在server.js文件中创建我们的配置化的模拟服务器。

代码示例

javascript 复制代码
const path = require('path');
const fs = require('fs');
const express = require('express');

function watchMockFiles(mockDirectory, mockData) {
  function watchDirectory(directory) {
    fs.watch(directory, (eventType, filename) => {
      if (filename.endsWith('.json')) {
        const mockPath = path.join(directory, filename);
        const mockKey = path.relative(mockDirectory, mockPath)
          .replace('.json', '')
          .replace(/\\/g, '/');
        delete require.cache[require.resolve(mockPath)];
        const jsonData = require(mockPath);
        mockData[mockKey] = jsonData;
        console.log(`Updated mock data for ${mockKey}`);
      }
    });

    fs.readdirSync(directory).forEach((file) => {
      const fullPath = path.join(directory, file);
      const stats = fs.statSync(fullPath);

      if (stats.isDirectory()) {
        watchDirectory(fullPath);
      }
    });
  }

  watchDirectory(mockDirectory);
}

function readMockFiles(mockDirectory) {
  const mockData = {};

  function traverse(directory) {
    const files = fs.readdirSync(directory);

    files.forEach((file) => {
      const fullPath = path.join(directory, file);
      const stats = fs.statSync(fullPath);

      if (stats.isDirectory()) {
        traverse(fullPath);
      } else if (file.endsWith('.json')) {
        const mockKey = path
          .relative(mockDirectory, fullPath)
          .replace('.json', '')
          .replace(/\\/g, '/');
        const jsonData = require(fullPath);
        mockData[mockKey] = jsonData;
      }
    });
  }

  traverse(mockDirectory);

  return mockData;
}

function configureMockDevServer({
  mockDirectory = path.resolve(__dirname, 'mock'),
  defaultResponseTime = 2000,
}) {
  const mockData = readMockFiles(mockDirectory);
  watchMockFiles(mockDirectory, mockData);

  const app = express();
  app.use('/api', (req, res) => {
    const url = req.originalUrl;
    const mockKey = url.replace('/api/', '');

    if (mockData[mockKey]) {
      const { responseTime = defaultResponseTime, statusCode = 200 } = mockData[mockKey];

      setTimeout(() => {
        res.status(statusCode).json(mockData[mockKey].data);
      }, responseTime);
    } else {
      res.status(404).json({ error: 'Mock data not found' });
    }
  });

  const port = 3000;
  app.listen(port, () => {
    console.log(`Mock server is running on port ${port}`);
  });
}

configureMockDevServer();

在上面的示例中,我们创建了一个配置化的模拟服务器。它递归遍历mock文件夹和子文件夹,监视JSON文件的更改,支持不同的响应时间和HTTP响应码,并通过Express.js提供API接口。

使用示例

要使用这个配置化的模拟服务器,只需运行server.js文件。它将在端口3000上启动服务器,可以通过访问http://localhost:3000/api/{mockKey}来模拟API请求,其中{mockKey}是JSON文件的相对路径。

例如,要获取users.json文件的数据,可以访问http://localhost:3000/api/users。你还可以为每个API接口配置不同的响应时间和HTTP响应码,以满足你的需求。

结语

创建一个配置化的模拟服务器是一个有用的工具,可以帮助前

端开发人员模拟不同的API请求,并为每个接口配置不同的响应时间和HTTP响应码。这个方案可以提高开发和测试效率,同时提供更多的控制和灵活性。

相关推荐
濮水大叔2 小时前
Hooks 之后,为什么前端仍需要“包裹”能力?
vue.js·react.js·前端框架
小粉粉hhh2 小时前
React(三)——Redux
前端·javascript·react.js
YFF菲菲兔2 小时前
React 基础事件插件
react.js
qq_529599386 小时前
react js循环滚动
前端·javascript·react.js
濮水大叔6 小时前
在 DTO 中使用 Form Layout 配置复杂表单,支持 Tabs/Groups/Sections
vue.js·typescript·node.js
索西引擎6 小时前
【React】严格模式:开发阶段质量保障的静态分析机制
前端·react.js·前端框架
cxxcode7 小时前
JavaScript 模块化:从模块规范到打包原理
前端·webpack
zzx2006__8 小时前
Ajax➕node.js➕webpack
ajax·webpack·node.js
小程故事多_801 天前
拆解SOP+ReAct对话Agent,告别硬编码,解锁智能对话的柔性迭代能力
前端·人工智能·react.js·前端框架
皮卡穆1 天前
React 中使用 react-org-tree 实现组织结构树
前端·react.js·前端框架