virtual.ts 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import type { Plugin, ViteDevServer } from "vite";
  2. import { createEps } from "./eps";
  3. import { createModule } from "./module";
  4. export function virtual(): Plugin {
  5. const virtualModuleIds = ["virtual:eps", "virtual:module"];
  6. // 使虚拟模块失效,重新加载
  7. function buildEps(server: ViteDevServer) {
  8. virtualModuleIds.forEach((vm) => {
  9. const mod = server.moduleGraph.getModuleById(`\0${vm}`);
  10. if (mod) {
  11. server.moduleGraph.invalidateModule(mod);
  12. }
  13. });
  14. }
  15. return {
  16. name: "vite-cool-virtual",
  17. enforce: "pre",
  18. configureServer(server) {
  19. server.middlewares.use(async (req, res, next) => {
  20. // 页面刷新时触发 eps 刷新
  21. if (req.url == "/@vite/client") {
  22. buildEps(server);
  23. }
  24. next();
  25. });
  26. },
  27. handleHotUpdate({ file, server }) {
  28. // 代码保存时触发 eps 刷新
  29. if (!file.includes("build/cool/dist")) {
  30. buildEps(server);
  31. }
  32. },
  33. resolveId(id) {
  34. if (virtualModuleIds.includes(id)) {
  35. return "\0" + id;
  36. }
  37. },
  38. async load(id) {
  39. if (id === "\0virtual:eps") {
  40. const { service, list } = await createEps();
  41. return `
  42. export const eps = ${JSON.stringify({ service, list })}
  43. `;
  44. }
  45. if (id === "\0virtual:module") {
  46. const { dirs } = createModule();
  47. return `
  48. export const dirs = ${JSON.stringify(dirs)}
  49. `;
  50. }
  51. }
  52. };
  53. }