virtual.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. server.ws.send({
  33. type: "custom",
  34. event: "eps-update"
  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, list } = await createEps();
  46. return `
  47. export const eps = ${JSON.stringify({ service, list })}
  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. }