vite.config.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { defineConfig, Plugin, ViteDevServer } from 'vite';
  2. import vue from '@vitejs/plugin-vue';
  3. import vueJsx from '@vitejs/plugin-vue-jsx';
  4. import * as path from 'path';
  5. import * as fs from 'fs';
  6. import formidable from 'formidable';
  7. // https://vitejs.dev/config/
  8. export default defineConfig({
  9. assetsInclude: ['**/*.glb'],
  10. plugins: [vue(), vueJsx(), fileList()],
  11. resolve: {
  12. alias: {
  13. '@': path.resolve(__dirname, './src/'),
  14. '@meta2d': path.resolve(__dirname, '../meta2d.js/packages'),
  15. '@2d-components': path.resolve(__dirname, '../2d-components/packages'),
  16. '@meta3d': path.resolve(__dirname, '../meta3d.js'),
  17. },
  18. },
  19. build: {
  20. outDir: 'v',
  21. rollupOptions: {
  22. output: {
  23. manualChunks: {
  24. monaco: [`monaco-editor`],
  25. },
  26. },
  27. },
  28. },
  29. server: {
  30. proxy: {
  31. '/image': 'https://2d.le5le.com/',
  32. '/file': 'https://2d.le5le.com/',
  33. '/api': 'https://2d.le5le.com/',
  34. },
  35. },
  36. });
  37. function fileList(): Plugin {
  38. return {
  39. name: 'vite-plugin-svg-png-files',
  40. configureServer(server: ViteDevServer) {
  41. server.middlewares.use((req, res, next) => {
  42. const url = req.url as string;
  43. if (
  44. (url.startsWith('/svg/') ||
  45. url.startsWith('/png/') ||
  46. url.startsWith('/material/')) &&
  47. url.endsWith('/')
  48. ) {
  49. const pwd = decodeURI(path.join(__dirname, 'public', url));
  50. const files = fs.readdirSync(pwd, {
  51. withFileTypes: true,
  52. });
  53. const list: {
  54. name: string;
  55. type?: string;
  56. }[] = [];
  57. for (const item of files) {
  58. if (item.isDirectory()) {
  59. list.push({ name: item.name, type: 'directory' });
  60. } else {
  61. list.push({ name: item.name });
  62. }
  63. }
  64. res.end(JSON.stringify(list));
  65. } else if (url === '/img' && req.method === 'POST') {
  66. const form = formidable({
  67. uploadDir: decodeURI(path.join(__dirname, 'public', '/img')),
  68. keepExtensions: true,
  69. });
  70. form.parse(req, (err, fields, files) => {
  71. if (!err) {
  72. res.end(
  73. JSON.stringify({ url: '/img/' + files.file.newFilename })
  74. );
  75. }
  76. });
  77. } else {
  78. next();
  79. }
  80. });
  81. },
  82. };
  83. }