手写VITE-MockJS插件

news2024/11/24 17:59:49

mockJS是什么

mockJS是模拟接口数据,拦截客户端的请求的一个工具。

vite插件编写流程

  1. pnpm init 初始化

  2. pnpm install vite -D 安装Vite

  3. 配置package.json文件中的脚本

    1. "scripts": {
          "dev": "vite",
          "build": "vite build",
          "preview": "vite preview"
      },
      
  4. 创建vite.cofig.js文件

    1. import { defineConfig } from 'vite'
      import mockJS from './src/mockJS/index'
      
      
      export default defineConfig(({mode,command,ssrBuild}) => {
          return {
              server: {
                  host:'127.0.0.88',//指定监听本地的端口号
                  https: false,//开启https服务    
                  port: 8888,//监听端口号
                  open:false,//在开发服务器启动时自动打开浏览器
              },
              plugins: [
                  mockJS()
                  /*可以传入一个对象
                  {url:'/api'前缀,插件会根据该url来筛选出你的请求路径,默认是'/api,mock会拦截url以'/api'开头的请求,并以此去查找root_url下该路径json文件
                  root_url:'./src/mock'根路径默认是文件路径,mock的数据会从src/mock文件内去查找}
                  */
              ]
          }
      })
      
  5. 导出一个函数在mockJS/index.js文件中

    1. import { findDir, readFileSync ,existFile} from '../utils'
      const path = require('path')
      
      /**
       * 是用于配置开发服务器的钩子。最常见的用例是在内部 connect 应用程序中添加自定义中间件:
       */
      export default (options = {}) => {
          const cwd = process.cwd()
          const defaultOptions = {
              url: '/api',
              root_url: './src/mock'
          }
          const option = Object.assign(defaultOptions, options)
          return {
              configureServer(server) {
                  server.middlewares.use((req, res, next) => {
                      // 自定义请求处理...
                      const url = req.url
                      if (url.startsWith(option.url)) {
                          res.setHeader('Content-Type', 'application/json')
                          //取出api开头的路径或者用户自定义的
                          const url_path = req.url.replace(option.url, '')
                          //根据路径去找src下的mock下的json文件
                          const mock_url = path.resolve(cwd, option.root_url + url_path)
                          if (!noSuchFile(mock_url, res)) {
                              return 
                          }
                          console.log(url_path,'url_path')
                          const dir_res = findDir(mock_url) || []
                          //找到json文件取出其数据
                          const file_path = dir_res[0] && path.resolve(cwd, mock_url + '/' + dir_res[0])
                          if (!noSuchFile(file_path, res)) {
                              return 
                          }
                          const file_res = readFileSync(file_path)
                          //发送给客户端
                          res.end(file_res)
                          return
                      }
                      //不是用户指定的url就放行
                      next()
                  })
              },
          }
      }
      const noSuchFile = (url, res) => {
          if (existFile(url)) {
              return true
          }
          res.end(JSON.stringify({
              code: 8,
              msg: 'faild->路径有误无法找到文件请查看REMIND文档查询mock规则',
          }))
          return false
      }
      
  6. 简单封装一下文件的工具函数

    1. const fs = require('fs')
      //查找文件夹下的内容返回值为一个数组
      export const findDir = (url = '') => fs.readdirSync(url)
      //判断是否是文件夹return Boolean
      export const isDir = (url) => {
          const stats = new fs.Stats()
          return stats.isDirectory(url)
      }
      //该文件是否存在return Boolean
      export const existFile = (path) => fs.existsSync(path)
      //返回文件内容utf-8格式
      export const readFileSync = (path) =>fs.readFileSync(path, 'utf-8')
      
      

结果展示

  1. mocj数据的文件路径

    1. 在这里插入图片描述
  2. mock数据展示

    1. 在这里插入图片描述
  3. 请求和结果展示

    1. 在这里插入图片描述

    2.在这里插入图片描述

    1. 在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8s集群离线安装-kubeadm-详细篇

1、部署k8s的两种方式:kubeadm 和二进制源码安装 #本次实验采用的部署Kubernetes方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。2、环境准备 #服务器要求: 建…

JavaSE学习day1_02, JDK安装

1.4 环境变量 1.4.1 为什么配置环境变量 在初次学习编程的时候,环境变量我们经常提到,但是环境变量到底是什么?是干嘛的?弄清楚这些问题很重要. 如果我们想要在CMD的任意路径下都可以打开任意的软件,那么就需要把软件的路径配置到环境变量当中。 为了便于大家…

Zotero | 快速入门

文章目录0. 前言1. Zotero快速入门1.1 下载Zotero和Connector2.2 联动sci-hub实现英文文献批量下载2.3 英文文献翻译2.4 中文文献元数据识别2.5 Zotero其他配置2.5.1 语言切换2.5.2 数据存储位置更改参考0. 前言 Zotero是一款自由及开放源代码的文献管理软件,管理书…

告别2022,喜迎2023

2022只剩下最后几天,新的一年即将拉开序幕。你的2022,是苦尽甘来、柳暗花明,还是安适如常、平安喜乐?你会用什么词来形容你的2022,你期待的2023又是什么样的呢? 时光荏苒,岁月悠悠,转眼间,202…

猿代码超算实习生计划之编程语言分析

编程语言特别多,很多同学都特别纠结以后到底选择哪一种编程语言,才好找高薪实习和工作。 其实编程语言没有好坏之分。很多同学选择未来就业和实习方向时很多也都是参考的薪资和岗位数量。就像前几年很多人选的前端、现在卷到不行的Java、还有今年连实习…

【Cortex-A7核PWM实验】

Cortex-A7核PWM实验 ---蜂鸣器、风扇、震动马达PWN概念PWM硬件电路图如何产生PWM方波捕获/比较寄存器工作原理代码实现PWN概念 PWM是指脉冲宽度调制(Pulse Width Modulation),是一种常用的模拟信号转换为数字信号的方法。 1.脉冲&#xff1a…

C#WinForm实现多语言切换

因项目需要,所以在网上找了一些方法实现了该功能,本文也是做一个总结和记录。使用resx文件实现Winform多语言切换,以实现简体中文、英文、泰语的切换为例。如果后续需要增加其它语言的切换,只需要按照步骤重复操作即可。 效果图如…

【Kotlin】函数 ⑨ ( Kotlin 语言中的闭包概念 | Java 语言中函数作为参数的替代方案 )

文章目录一、闭包概念二、Java 中函数作为参数的替代方案 ( 匿名内部类 )一、闭包概念 匿名函数 就是 Lambda 表达式 , 同时也是 闭包 , 三者的是相同的概念 ; 闭包意义 : 在 Java 中 , 通过 Package 包 , Class 类 , 将作用域区分开 , 将变量 定义在 不同的 包 或 类中 , 可…

阿里云创世纪之盘古传奇

文章目录飞天(Apsara)云计算平台简介面向私有云的Apsara Stack盘古横空出世盘古的架构盘古基本介绍盘古API基于C语言的SDK基于命令行的文件操作接口pu盘古中的目录和文件盘古目录盘古中的文件盘古中的文件类型盘古应用场景盘古的功能特性盘古主要性能盘古的数据安全盘古的边界盘…

Docker - Docker网络

一、Docker网络介绍 Docker是基于Linux Kernel(内核)的namespace,CGroups,UnionFileSystem等技术封装成的一种自定义容器格式,从而提供了—套虚拟运行环境。 1、namespace:用来做隔离的,比如pid[进程].、…

Java多线程案例之阻塞队列

文章目录一. 认识阻塞队列1. 什么是阻塞队列2. 生产者消费者模型3. 标准库中阻塞队列类二. 基于循环队列实现的简单阻塞队列1. 循环队列的简单实现2. 阻塞队列的简单实现一. 认识阻塞队列 1. 什么是阻塞队列 阻塞队列本质上还是一种队列, 和普通队列一样, 遵循先进先出, 后进…

291. 蒙德里安的梦想(状态压缩dp详解)

求把 NM 的棋盘分割成若干个 12 的长方形,有多少种方案。 例如当 N2,M4 时,共有 5 种方案。当 N2,M3 时,共有 3 种方案。 如下图所示: 输入格式 输入包含多组测试用例。 每组测试用例占一行&#xff0c…

龙芯机器JDK安装和配置

龙芯机器:[rootlocalhost j2sdk-image]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c4 Loongson-3A R4 (Loongson-3A4000) 1800MHz龙芯机器JDK安装和配置下载地址:http://www.loongnix.cn/zh/api/java/选择JDK8,选择MIPS64进行下…

2-3进程管理-进程同步

文章目录一.进程同步、互斥二.实现临界区互斥的基本方法(一)软件实现方法(二)硬件实现方法三.互斥锁四.信号量机制五.经典同步问题(一)生产者-消费者问题(二)读者-写者问题&#xff…

流逝的一年

昨天远方的大哥打来了电话,我们聊了下近况。当他问及去年是否有新的著作问世,我不禁有些赧然,解释说还在学习中… 放下电话后,我陷入了思索:又是一年划上了句号,这一年我做了什么?我又有什么收…

数据库的一些基本概念

一、服务器:(更正大家头脑中的一个错误认识) 1、服务器是一种软件,不是硬件,不是计算机。 2、不同服务器负责调用不同类型的文件。 二、表文件、数据库、数据库服务器以及SQL语句: 1、表文件: …

一条 select 语句的执行过程

MySQL 从大方向来说,可以分为 Server 层和存储引擎层。而 Server 层包括连接器、查询缓存、解析器、预处理器、优化器、执行器等,最后 Server 层再通过 API 接口形式调用对应的存储引擎层提供的接口来执行增删改查操作。 如下即为一个简略的 select 语句…

Android动态运行时权限

android 6.0(API 级别 23)开始,android引入了运行时权限,应用安装时不向其授予权限,应用运行时向其授予权限。如果在运行时该功能没有动态地申请相应的权限,就会抛出SecurityException异常。 android的运行时权限的申请过程主要有…

C语言画一个正方体

程序截图 操作方法 鼠标拖动。左键拖动及滚轮能看到不同角度下正方体的形状,右键拖动能将最近的正方体顶点挪到这个投影面的相应位置。 按键控制。wasd 控制投影面旋转,ws 关于 x 轴旋转,ad 关于 y 轴旋转。 个人思路 首先投影面的确立需…

【寒假第一天】LeetCode刷题

🌈一.选择题👿1.1.堆是一种有用的数据结构。下列那个关键码序列是一个堆( )。 A. 94,31,53,23,16,72 B. 94,53,31,72,16,23 C. 16,53,23,94,31,72 D. 16,31,23,94,53,72D堆排序有两种排序方法:大堆排序-----根结点要大…