TypeScript + Vue3 + mock使用过程中遇到的问题记录:mockjs发送带有参数的get的请求返回结果404,得不到响应结果

本文介绍了在TypeScript+Vue3项目中使用MockJS遇到的两个问题及其解决方案。问题一是引入mockjs时的类型声明错误,通过安装@types/mockjs解决;问题二是模拟带有参数的GET请求返回404,通过使用正则匹配修复。提供了完整的代码示例,并分享了代码仓库链接,帮助开发者更好地理解和应用MockJS。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

 问题①:TypeScript + Vue3 使用import Mock from 'mock'引入mockjs引入时报错,如下:

Cannot find module 'mockjs' or its corresponding type declarations.

 问题②:前端项目开发中利用mockJs作为假数据进行请求模拟的过程中,使用Mockjs模拟带有参数的get请求的时候,报错404无法返回正确的结果。

mock相关代码

在发送axios请求之后报错404,如下图:

在这里插入图片描述


原因分析:

问题一:

  进入到mockjs目录下的index.ts文件,我们可以看到mockjs的导出方式为:export = mockjs。这也正是导致ts报错的原因,因为导出的方式不是CommonJs或ESModule的形式,因此我们要做出相应的配置。

解决方法:

 安装@types/mockjs对mockJs进行声明,使用命令npm i @types/mockjs --save-dev 或是-S都可以,这里要注意,使用yarn add @types/mockjs -S并没有效果,不知是不是我工程的问题,大家可以试一下。

问题二:

  其实这个问题是因为我当时想的比较简单,以为mockjs可以自动获取到query参数,即请求路径?后面的参数,其实这是不行的,在mock中的路径如果为字符串,则需要完整匹配。

解决方法:

 解决方法其实也比较简单,只要我们将字符串匹配改为正则匹配即可,之后便可以匹配到这一次的mock请求了,同时我们可以得到mockjs传入的参数msg:

修改为正则

msg对象结构如下:

msg对象结构

这一块的完整代码如下:

mockjs返回完整代码

再一次尝试后,结果如下:

完善后结果

总结

 可以看到,在使用正则表达式之后问题就迎刃而解了。(因为今晚的游戏行为,导致现在完成文章到写总结的时候已经00:54:09了)。所以还有一些没有完善的地方,只能等下一次再写了。
 如果有想看完整代码的小伙伴,可以到我的gitee上查看,具体的链接如下:
https://gitee.com/Crivk/csdn-related-demo/tree/master/Vue/v3-ts-mockjs。那么这一次的文章就先到这里啦,最近还有一个BaiduMap城市组件使用的分享还在写,但是因为懒还没有怎么写,争取这个周末把它发出来!

补充

2022.9.2

 对参数解析这一块做了优化,使用另一个变量去接取参数。另外在解析字符串的时候也可以使用正则表达式的分组表达式去截取,不过我感觉这个正则的意义不大,直接使用字符串截取再进行转换更为实在。

在这里插入图片描述

<think>我们正在处理一个关于在Vite+TypeScript+Vue3项目中配置Mock数据的问题。根据用户提供的引用,我们可以总结出以下步骤:1.安装必要的依赖:mockjs和vite-plugin-mock。2.在vite.config.ts中配置vite-plugin-mock插件。3.创建mock数据文件(通常放在项目根目录的mock文件夹下)。4.在入口文件(如main.ts)中引入mock数据(可选,根据配置方式决定)。5.在组件中调用API接口进行测试。注意:引用中提到的一些细节,如vite-plugin-mock的版本(vite-plugin-mock@2.9.8)和配置项(supportTs,logger,mockPath等)需要根据实际情况调整。具体步骤:1.安装依赖(作为开发依赖):```bashnpminstallmockjsvite-plugin-mock-D```2.配置vite.config.ts:-引入viteMockServe插件。-在plugins数组中添加该插件,并根据需要配置参数(如是否支持TypeScript、日志、mock文件路径等)。3.创建mock文件:-在项目根目录下创建mock文件夹(或配置中指定的路径)。-在mock文件夹中创建js/ts文件,定义模拟接口。4.在入口文件中引入mock(可选):-引用[3]提到在main.js中引入&#39;./mock/index.js&#39;,但根据vite-plugin-mock的文档,通常不需要手动引入,插件会自动处理。不过,如果使用批量导入的方式,可能需要一个入口文件来集中导入所有mock模块。5.在组件中调用接口测试。下面我们将详细说明每一步。###详细配置教程####1.安装依赖```bashnpminstallmockjsvite-plugin-mock-D```####2.配置`vite.config.ts`在项目的vite.config.ts文件中配置插件。注意:如果使用TypeScript,确保配置正确。```typescriptimport{defineConfig}from&#39;vite&#39;importvuefrom&#39;@vitejs/plugin-vue&#39;import{viteMockServe}from&#39;vite-plugin-mock&#39;exportdefaultdefineConfig({plugins:[vue(),viteMockServe({//默认设置,开发环境启用mocklocalEnabled:process.env.NODE_ENV===&#39;development&#39;,//更多配置见文档,例如:supportTs:true,//是否读取ts文件模块(如果mock文件是ts,需要开启)logger:false,//是否在控制台显示请求日志mockPath:&#39;./mock&#39;,//设置mock文件存储目录})]})```注意:`localEnabled`也可以根据`command`(即命令行参数)来设置,如引用[4]所示:```typescriptexportdefaultdefineConfig(({command})=>({plugins:[vue(),viteMockServe({localEnabled:command===&#39;serve&#39;,//开发环境启用})]}))```####3.创建mock数据文件在项目根目录下创建`mock`文件夹,然后在其中创建js或ts文件(例如`user.ts`)。示例`mock/user.ts`:```typescriptimport{MockMethod}from&#39;vite-plugin-mock&#39;exportdefault[{url:&#39;/api/getUserInfo&#39;,method:&#39;get&#39;,response:()=>{return{code:0,message:&#39;success&#39;,data:{name:&#39;Tom&#39;,age:18}}}},{url:&#39;/api/login&#39;,method:&#39;post&#39;,timeout:500,//模拟延迟response:({body})=>{//从请求体中获取数据if(body.username===&#39;admin&#39;&&body.password===&#39;123456&#39;){return{code:0,message:&#39;登录成功&#39;,data:{token:&#39;abcdefg123456&#39;}}}else{return{code:401,message:&#39;用户名或密码错误&#39;}}}}]asMockMethod[]```####4.批量导入mock文件(可选)如果mock文件很多,可以创建一个入口文件(如`mock/index.ts`)来批量导入所有mock模块。在vite中可以使用`import.meta.globEager`(vite2)或`import.meta.glob`(vite3及以上)来导入。对于vite3及以上,由于`import.meta.globEager`已被废弃,可以使用`import.meta.glob`并设置`{eager:true}`。`mock/index.ts`:```typescript//批量导入当前目录下所有ts文件(不包括子目录)constmodules=import.meta.glob(&#39;./**/*.ts&#39;,{eager:true})//将每个模块的默认导出合并到一个数组中constmockModules:any[]=[]Object.keys(modules).forEach(key=>{if(key!==&#39;./index.ts&#39;){//避免导入自身constmod=modules[key]as{default:any[]}mockModules.push(...mod.default)}})exportdefaultmockModules```然后在`vite.config.ts`中配置mockPath指向这个目录即可,插件会自动读取。####5.在组件中测试在Vue组件中,我们可以使用axios或其他请求库来调用接口。例如,在App.vue中:```vue<scriptsetuplang="ts">importaxiosfrom&#39;axios&#39;constgetUserInfo=async()=>{try{constresponse=awaitaxios.get(&#39;/api/getUserInfo&#39;)console.log(response.data)}catch(error){console.error(error)}}constlogin=async()=>{try{constresponse=awaitaxios.post(&#39;/api/login&#39;,{username:&#39;admin&#39;,password:&#39;123456&#39;})console.log(response.data)}catch(error){console.error(error)}}</script><template><button@click="getUserInfo">获取用户信息</button><button@click="login">登录</button></template>```###注意事项1.确保在开发环境下启用mock(生产环境会自动禁用)。2.如果接口有跨域问题,可能需要配置代理(与mock无关,但实际开发中可能需要)。3.如果使用TypeScript,注意类型定义。vite-plugin-mock提供了`MockMethod`类型。###引用说明我们参考了用户提供的引用内容,其中引用[2]和[4]提供了vite-plugin-mock的配置方法,引用[3]提供了批量导入mock模块的方法。###相关问题1.如何为不同的接口设置不同的延迟时间?2.如何在mock中模拟错误响应(如500错误)?3.如何根据请求参数动态返回mock数据?4.在Vite+Vue3+TypeScript项目中,如何对axios进行封装并配合mock使用?</think>### Vite + TS + Vue3 项目 Mock 数据配置教程 #### **1. 安装必要依赖** ```bash npm install mockjs vite-plugin-mock -D ``` - `mockjs`:数据模拟库 - `vite-plugin-mock`:Vite 的 Mock 插件[^2][^4] --- #### **2. 配置 vite.config.ts** ```typescript import { defineConfig } from &#39;vite&#39; import vue from &#39;@vitejs/plugin-vue&#39; import { viteMockServe } from &#39;vite-plugin-mock&#39; export default defineConfig({ plugins: [ vue(), viteMockServe({ supportTs: true, // 支持 TypeScript logger: false, // 关闭控制台日志 mockPath: "./mock/", // Mock 文件存放目录 localEnabled: true // 开发环境启用 }) ] }) ``` **关键配置说明**: - `supportTs`: 启用 TS 模块支持[^2] - `mockPath`: Mock 文件存放路径(默认 `./mock`) - `localEnabled`: 开发环境自动启用[^4] --- #### **3. 创建 Mock 数据文件** 在项目根目录创建 `mock` 文件夹,并添加示例文件 `user.ts`: ```typescript // mock/user.ts import { MockMethod } from &#39;vite-plugin-mock&#39; export default [ // 用户登录接口 { url: &#39;/api/login&#39;, method: &#39;post&#39;, response: ({ body }) => { if (body?.username === &#39;admin&#39;) { return { code: 200, data: { token: &#39;AUTH_TOKEN_123&#39; } } } return { code: 401, message: &#39;用户名错误&#39; } } }, // 获取用户信息 { url: &#39;/api/userinfo&#39;, method: &#39;get&#39;, response: () => ({ code: 200, data: { name: &#39;Alice&#39;, roles: [&#39;admin&#39;] } }) } ] as MockMethod[] ``` --- #### **4. 批量导入 Mock 文件(可选)** 在 `mock/index.ts` 中实现自动模块加载: ```typescript // mock/index.ts const modules = import.meta.glob(&#39;./**/*.ts&#39;, { eager: true }) const mockModules: any[] = [] Object.keys(modules).forEach(key => { if (key !== &#39;./index.ts&#39;) { mockModules.push(...(modules[key] as any).default) } }) export default mockModules ``` > 此配置会自动加载 `mock` 目录下所有 TS 文件[^3] --- #### **5. 在组件中使用** ```vue <script setup lang="ts"> import axios from &#39;axios&#39; // 调用 Mock 接口 const login = async () => { const res = await axios.post(&#39;/api/login&#39;, { username: &#39;admin&#39; }) console.log(res.data) // { code:200, data:{ token:... } } } </script> ``` --- #### **6. 生产环境处理** ```typescript // vite.config.ts 动态配置 export default defineConfig(({ command }) => ({ plugins: [ viteMockServe({ localEnabled: command === &#39;serve&#39;, // 仅开发环境启用 prodEnabled: false // 生产环境禁用 }) ] })) ``` --- #### **常见问题解决** 1. **TS 类型报错**: 安装类型声明包: ```bash npm install @types/mockjs -D ``` 2. **接口 404 错误**: - 检查 `mockPath` 是否配置正确 - 确认文件名后缀为 `.ts` 而非 `.js`[^2] 3. **热更新失效**: 在 `viteMockServe` 配置中添加: ```typescript watchFiles: true // 监听文件变化 ``` > 完整示例可参考 [vite-plugin-mock 官方文档](https://github.com/vbenjs/vite-plugin-mock) --- ### 相关问题 1. 如何实现动态响应参数? > 例如根据请求参数返回不同数据 2. 如何在 Mock 中模拟网络延迟? > 使用 `setTimeout` 或插件内置延迟配置 3. 如何模拟 RESTful API 的分页数据? > 结合 Mock.js 的随机数据功能实现 4. 生产环境如何彻底移除 Mock 代码? > 通过 Tree Shaking 和条件编译实现 5. 如何复用 Mock 数据到单元测试? > 导出 Mock 模块供 Vitest 使用 [^1]: 安装 mockjs 和 vite-plugin-mock [^2]: vite.config.ts 配置示例 [^3]: 批量导入 Mock 模块 [^4]: 开发环境启用配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Donp1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值