Vite开发服务器运行时Mock ES Modules与模块替换方案问询
解决方案
现有可直接使用的工具
vite-plugin-mock-imports:适配Vite原生ES模块运行时,支持测试粒度的动态导入替换,API设计对齐proxyquire使用习惯,不需要全局配置alias,也不需要生成额外HTML文件。你可以在测试用例内直接调用mockImport('./my-ugly-module', stubModule)注册打桩内容,测试执行完成后调用unmockImport('./my-ugly-module')恢复原模块,可直接在mocha-vite-puppeteer环境中使用,仅需在vite.config.js中注册插件即可。vite-plugin-dynamic-mocker:针对相对路径模块做了路径自动解析适配,支持作用域隔离,底层通过Vite的transform钩子注入重定向逻辑,无需修改测试运行器的核心流程。
自定义开发vite-proxyquire的核心思路
如果现有工具不能满足你的需求,可以基于Vite插件能力和import.meta特性实现自定义打桩工具,核心步骤如下:
- 代码转换预处理:在Vite插件的
transform钩子中对测试文件做预处理,把所有相对路径的静态导入、动态import()语句重定向到自定义的虚拟模块路由,比如将import mod from './my-ugly-module'转换为import mod from '/@vite-proxyquire?path=./my-ugly-module&scope=${import.meta.vitest.testId}',通过scope参数区分不同测试用例的作用域。 - 虚拟模块路由处理:在Vite开发服务器中新增中间件,处理
/@vite-proxyquire开头的请求,优先返回当前scope下用户注册的打桩模块,没有匹配到打桩内容时返回原模块内容。 - 暴露命令式API:注入全局API挂载到
import.meta或者window对象上,提供proxyquire(path, mockModule)、restore(path)等方法,用户在测试用例中调用时会将打桩内容存入全局的作用域映射表。 - 作用域隔离实现:对接mocha的
beforeEach/afterEach生命周期钩子,每次测试用例执行完成后自动清空当前作用域的打桩记录,避免不同测试用例之间的mock污染。
注意:需要给每个打桩返回的模块添加唯一查询参数,绕过浏览器和Vite的ES模块缓存,避免打桩内容不生效。
内容的提问来源于stack exchange,提问作者oligofren
相关产品推荐
相关产品推荐

