virtual.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import type { Plugin } 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. return {
  7. name: "vite-cool-virtual",
  8. enforce: "pre",
  9. configureServer(server) {
  10. server.middlewares.use(async (req, res, next) => {
  11. // 页面刷新时触发
  12. if (req.url == "/@vite/client") {
  13. // 重新加载虚拟模块
  14. virtualModuleIds.forEach((vm) => {
  15. const mod = server.moduleGraph.getModuleById(`\0${vm}`);
  16. if (mod) {
  17. server.moduleGraph.invalidateModule(mod);
  18. }
  19. });
  20. }
  21. next();
  22. });
  23. },
  24. async handleHotUpdate({ file, server }) {
  25. // 代码保存时触发
  26. if (!file.includes("build/cool/dist")) {
  27. const { service } = await createEps();
  28. // 通知客户端刷新
  29. server.ws.send({
  30. type: "custom",
  31. event: "eps-update",
  32. data: {
  33. service
  34. }
  35. });
  36. }
  37. },
  38. resolveId(id) {
  39. if (virtualModuleIds.includes(id)) {
  40. return "\0" + id;
  41. }
  42. },
  43. async load(id) {
  44. if (id === "\0virtual:eps") {
  45. const { service } = await createEps();
  46. return `
  47. export const eps = ${JSON.stringify({ service })}
  48. `;
  49. }
  50. if (id === "\0virtual:module") {
  51. const { dirs } = createModule();
  52. return `
  53. export const dirs = ${JSON.stringify(dirs)}
  54. `;
  55. }
  56. }
  57. };
  58. }