index.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // Used to import all files under `src/views`
  2. // The built-in dynamic import of vite cannot meet the needs of importing all files under views
  3. import glob from 'glob';
  4. import { Transform } from 'vite/dist/node/transform.js';
  5. function getPath(path: string) {
  6. const lastIndex = path.lastIndexOf('.');
  7. if (lastIndex !== -1) {
  8. path = path.substring(0, lastIndex);
  9. }
  10. return path.replace('src/views', '');
  11. }
  12. const dynamicImportTransform = function (env: any = {}): Transform {
  13. return {
  14. test({ path }) {
  15. // Only convert the file
  16. return path.includes('/src/utils/helper/dynamicImport.ts');
  17. },
  18. transform({ code }) {
  19. const { VITE_DYNAMIC_IMPORT } = env;
  20. if (!VITE_DYNAMIC_IMPORT) {
  21. return code;
  22. }
  23. // if (!isBuild) return code;
  24. // Only convert the dir
  25. try {
  26. const files = glob.sync('src/views/**/**.{vue,tsx}', { cwd: process.cwd() });
  27. const _code = `
  28. export default function (id) {
  29. switch (id) {
  30. ${files
  31. .map((p) =>
  32. ` case '${getPath(p)}': return () => import('${p
  33. .replace('src/views', '/@/views')
  34. .replace(/\/\//g, '/')}');`.replace('.tsx', '')
  35. )
  36. .join('\n ')}
  37. default: return Promise.reject(new Error("Unknown variable dynamic import: " + id));
  38. }
  39. }\n\n
  40. `;
  41. return _code;
  42. } catch (error) {
  43. console.error(error);
  44. return code;
  45. }
  46. },
  47. };
  48. };
  49. export default dynamicImportTransform;