From d8df1d1a57ed07c2c2bfd84e558e6198f821cdb6 Mon Sep 17 00:00:00 2001
From: schangxiang@126.com <schangxiang@126.com>
Date: 周日, 04 5月 2025 21:55:12 +0800
Subject: [PATCH] 1111

---
 HIAWms/web/vite.config.ts |  223 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 223 insertions(+), 0 deletions(-)

diff --git a/HIAWms/web/vite.config.ts b/HIAWms/web/vite.config.ts
new file mode 100644
index 0000000..c0925aa
--- /dev/null
+++ b/HIAWms/web/vite.config.ts
@@ -0,0 +1,223 @@
+import { defineConfig, loadEnv, createLogger } from 'vite'
+import vue from '@vitejs/plugin-vue'
+import vueJsx from '@vitejs/plugin-vue-jsx'
+import path from 'path'
+import Components from 'unplugin-vue-components/vite'
+import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
+import qiankun from 'vite-plugin-qiankun'
+import pkg from './package.json'
+import { optimizeLodashImports } from '@optimize-lodash/rollup-plugin'
+import VueTypeImports from 'vite-plugin-vue-type-imports'
+import { ChildProcess } from 'child_process'
+import slash from 'slash'
+const kill = require('kill-port')
+const crossSpawn = require('cross-spawn')
+
+const isWin = process.platform === 'win32'
+const appPath = slash(path.resolve(process.cwd(), 'app'))
+
+const getPort: () => Promise<string> = () => {
+  const child: ChildProcess = crossSpawn(
+    isWin
+      ? '..\\node_modules\\lmes-create-widget\\port'
+      : '../node_modules/lmes-create-widget/port',
+    [], //娣诲姞绔彛鍜岀幆澧冨彉閲忓弬鏁�
+    {
+      cwd: appPath,
+      shell: true,
+      env: {
+        ENV: 'production',
+      },
+    }
+  )
+
+  let output = ''
+  return new Promise((resolve, reject) => {
+    // 鑾峰彇瀛愯繘绋嬬殑鏍囧噯杈撳嚭
+    child.stdout?.on('data', (data) => {
+      output += data.toString()
+    })
+
+    child.stderr?.on('data', (data) => {
+      console.error('stderr:', data.toString())
+    })
+
+    child.on('close', (code) => {
+      if (code === 0) {
+        const port = output.split('\n')[0]
+        console.log('PROJECT_PORT:', port)
+        resolve(port)
+      } else {
+        reject(code)
+      }
+    })
+  })
+}
+
+const runGoServer = (projectPort: string) => {
+  const child: ChildProcess = crossSpawn(
+    isWin
+      ? `..\\node_modules\\lmes-create-widget\\www ${projectPort}`
+      : `../node_modules/lmes-create-widget/www ${projectPort}`,
+    [], //娣诲姞绔彛鍜岀幆澧冨彉閲忓弬鏁�
+    {
+      stdio: 'inherit',
+      cwd: appPath,
+      shell: true,
+      env: {
+        ENV: 'production',
+      },
+    }
+  )
+  return child
+}
+/**
+ * 鏉�姝籫oLang鏈嶅姟锛�8800绔彛
+ */
+const killGoServer = async (port: number) => {
+  try {
+    console.log('妫�娴嬪埌 Ctrl+C锛岃繘绋嬪嵆灏嗛��鍑�...')
+    await kill(port)
+    process.exit(0)
+  } catch (error) {
+    process.exit(0)
+  }
+}
+const run = (projectPort: string) => {
+  try {
+    runGoServer(projectPort)
+    let lastPressTime = Date.now()
+    process.on('SIGINT', async () => {
+      const currentTime = Date.now()
+      if (lastPressTime && currentTime - lastPressTime < 2000) {
+        killGoServer(Number(projectPort))
+      } else {
+        lastPressTime = Date.now()
+      }
+    })
+    process.on('SIGTERM', () => {
+      console.log('杩涚▼琚� kill 缁堟...')
+      killGoServer(Number(projectPort))
+    })
+  } catch (error) {
+    console.error(error)
+  }
+}
+// @ts-ignore
+export default defineConfig(async ({ mode }) => {
+  const projectPort = await getPort()
+  run(projectPort)
+  const env = loadEnv(mode, __dirname)
+  console.info('[mode]', mode)
+  console.info('[env]', env)
+
+  return {
+    // base:  `//localhost:${env.VITE_PORT}/`,
+    base: '/',
+    plugins: [
+      // requireTransform({}),
+      vueJsx(),
+      vue({
+        // @ts-ignore
+        reactivityTransform: path.resolve(__dirname, 'src'),
+      }),
+      VueTypeImports(),
+
+      Components({
+        include: [/\.vue$/, /\.vue\?vue/, /\.md$/, /\.tsx/, /\.jsx/],
+        resolvers: [
+          ElementPlusResolver({
+            importStyle: 'sass',
+          }),
+        ],
+      }),
+      {
+        name: 'fixHMR',
+        handleHotUpdate({ modules, file }) {
+          if (file.match(/\.(js|ts|css)$/)) return modules
+
+          modules.map((m) => {
+            m.importers = new Set()
+          })
+        },
+      },
+      // qiankun(pkg.name, {
+      //   useDevMode: true,
+      // }),
+      optimizeLodashImports(),
+    ],
+    resolve: {
+      alias: {
+        '@': path.resolve(__dirname, './src'),
+        components: path.resolve(__dirname, './src/components'),
+        sdk: path.resolve(__dirname, 'src/cms/sdk.es.js'),
+      },
+    },
+    server: {
+      host: '0.0.0.0',
+      headers: {
+        'Access-Control-Allow-Origin': '*',
+      },
+      origin: `//localhost:${env.VITE_PORT}`,
+      // open: true,
+      port: env.VITE_PORT,
+      cors: true,
+      proxy: {
+        // 浣跨敤鏈湴澶氳瑷�鏂囦欢鏃跺紑鍚�
+        '/api/v1/multiplelanguage/static': {
+          target: 'http://localhost:8001/language/Common.en-US.json',
+          changeOrigin: true,
+          rewrite: (path) =>
+            path.replace(/^\/api\/v1\/multiplelanguage\/static/, ''),
+        },
+        '/api': {
+          target: env.VITE_API_URL,
+          changeOrigin: true,
+        },
+        '/hubs': {
+          target: env.VITE_API_URL,
+          changeOrigin: true,
+          ws: true,
+        },
+        '/projectApi': {
+          target: `http://127.0.0.1:${projectPort}`,
+          changeOrigin: true,
+          ws: true,
+        },
+      },
+    },
+    build: {
+      outDir: 'wwwroot',
+      minify: 'esbuild',
+      sourcemap: true,
+      chunkSizeWarningLimit: 1500,
+      target: 'ES2022',
+      rollupOptions: {
+        output: {
+          entryFileNames: `index.js`,
+        },
+      },
+    },
+    esbuild: {
+      drop: mode !== 'development' ? ['console', 'debugger'] : [],
+      keepNames: true,
+    },
+    css: {
+      // postcss: {
+      //   plugins: [
+      //     PurgeCSS({
+      //       // PurgeCSS options here
+      //       content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
+      //     }),
+      //   ],
+      // },
+      preprocessorOptions: {
+        scss: {
+          additionalData: `
+            @use "@/assets/styles/element.scss" as *;
+          `,
+        },
+      },
+    },
+  }
+})

--
Gitblit v1.9.3