vite-plugin-mock icon indicating copy to clipboard operation
vite-plugin-mock copied to clipboard

生产环境mock服务404

Open fontcoderrrrrrr opened this issue 2 years ago • 4 comments

感谢您的帮助! vite.config.js配置如下

import vue from "@vitejs/plugin-vue";
import { viteMockServe } from "vite-plugin-mock";
import { defineConfig } from "vite";


const localEnabled = process.env.USE_MOCK || false;
const prodEnabled = process.env.USE_CHUNK_MOCK || false;

export default defineConfig({
    plugins: [
        vue(),
        viteMockServe({
            mockPath: "./src/server/mock",
            localEnabled: localEnabled as boolean, // 开发打包开关
            prodEnabled: prodEnabled as boolean, // 生产打包开关
            // 这样可以控制关闭mock的时候不让mock打包到最终代码内
            injectCode: `
              import { setupProdMockServer } from './mockProdServer';
              setupProdMockServer();
            `,
            logger: false, //是否在控制台显示请求日志
            supportTs: false
        })
    ],
});

mock服务配置如下:

import { createProdMockServer } from "vite-plugin-mock/es/createProdMockServer";
import testMock from "./server/mock/test";

export const mockModules = [...testMock];

export function setupProdMockServer() {
  createProdMockServer(mockModules);
}

在开发环境中是正常的,但在开发环境中404 并且我注意到在编译后的js文件中,setupProdMockServer()函数放在mount('#app')之后生产环境失败; clone:()=>l,text(){return Promise.resolve(o)},json(){return Promise.resolve(o)}};return l}const mockModules=[...testMock];function setupProdMockServer(){createProdMockServer(mockModules),createFetchSever(mockModules)}createApp(App).mount("#app",!0);**setupProdMockServer()**;

而当在main.ts文件中加入

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
// 加入这行代码,生产环境可以成功
import {setupProdMockServer} from './mockProdServer';
    setupProdMockServer();
// 
createApp(App).mount('#app',true)

此时编译后的js文件变为了 return Mock.mock(r)}}function __setupMock__(e=0){e&&Mock.setup({timeout:e})}const testMock=[{url:"/api/getUser",method:"get",response:()=>({code:200,message:"ok",data:["tom","jerry"]})}],mockModules=[...testMock];function setupProdMockServer(){createProdMockServer(mockModules)}**setupProdMockServer()**;createApp(App).mount("#app",!0);**setupProdMockServer();**

通过此种现象表明setupProdMockServer()函数在mount之前执行,生产环境才能成功;

那么有什么好的方式,可以不侵入main.ts,生产环境也可以使用mock数据,希望各位赐教,感谢!

fontcoderrrrrrr avatar Sep 23 '22 16:09 fontcoderrrrrrr

只需要将插件源码中dist目录下的index文件中transform方法的返回值作调整就行,将injectCode放置于code之前即可

// 第339行
 return {
        map: needSourcemap ? this.getCombinedSourcemap() : null,
        code: `${injectCode}${code}`
 };

但是总不可能每次都去修改插件源码吧😅

wangkejugithub avatar Jan 14 '23 16:01 wangkejugithub

按照上面2个方式操作后,为什么生产环境中仍然是404

shenshuai89 avatar Feb 25 '23 13:02 shenshuai89

按照上面2个方式操作后,为什么生产环境中仍然是404

原来的mock文件中使用了type,将type改为method之后就正常了。https://github.com/shenshuai89/vue3-elementplus-admin/blob/main/mock/modules/user.ts#L65

shenshuai89 avatar Mar 01 '23 03:03 shenshuai89

I also cannot mock data in production build. The requests return 404.

    // deps
    "vue": "^3.3.2",
    "mockjs": "^1.1.0",
    // dev-deps
    "vite": "^4.3.5",
    "vite-plugin-mock": "^2.9.8",

charlie447 avatar May 18 '23 05:05 charlie447