Quellcode durchsuchen

需要install,打包后还可以修改环境变量

xiaochan vor 8 Monaten
Ursprung
Commit
35e03efea5
4 geänderte Dateien mit 399 neuen und 70 gelöschten Zeilen
  1. 90 0
      bin/inject-env-to-window.js
  2. 213 9
      package-lock.json
  3. 9 5
      package.json
  4. 87 56
      vite.config.js

+ 90 - 0
bin/inject-env-to-window.js

@@ -0,0 +1,90 @@
+const CONFIG_NAME = "__PRODUCTION____APP__CONF__";
+const CONFIG_FILE_NAME = "_app.config.js";
+const OUTPUT_DIR = "release/dist";
+
+const path = require("path");
+const dotenv = require("dotenv");
+const fs = require("fs-extra");
+
+/**
+ * 获取用户根目录
+ * @param dir file path
+ */
+function getRootPath(...dir) {
+  return path.resolve(process.cwd(), ...dir);
+}
+
+/**
+ * 获取以指定前缀开头的环境变量
+ * @param match prefix
+ * @param confFiles ext 为什么要测试和正式的都要循环有可能是测试加了东西但是正式没加,到时候上线会报错
+ * 应该是防止环境变量缺失
+ */
+function getEnvConfig(
+  match = "VITE_",
+  confFiles = [".env.development", ".env.production"]
+) {
+  let envConfig = {};
+  confFiles.forEach(item => {
+    try {
+      const env = dotenv.parse(
+        fs.readFileSync(path.resolve(process.cwd(), item))
+      );
+      envConfig = { ...envConfig, ...env };
+    } catch (e) {
+      console.error(`解析错误:${item}`, e);
+    }
+  });
+  const reg = new RegExp(`^(${match})`);
+  Object.keys(envConfig).forEach(key => {
+    if (!reg.test(key)) {
+      Reflect.deleteProperty(envConfig, key);
+    }
+  });
+  return envConfig;
+}
+
+function createConfig(params) {
+  const { configName, config, configFileName } = params;
+  try {
+    const windowConf = `window.${configName}`;
+
+    // 确保变量不会被修改
+    const configStr = `${windowConf}=${JSON.stringify(config)};
+      Object.freeze(${windowConf});
+      Object.defineProperty(window, "${configName}", {
+        configurable: false,
+        writable: false,
+      });
+    `.replace(/\s/g, "");
+
+    // 拼接新的输出根目录地址
+    const filePath = `${OUTPUT_DIR}/`;
+
+    // 创建根目录
+    fs.mkdirp(getRootPath(filePath));
+    fs.writeFileSync(getRootPath(filePath + configFileName), configStr);
+
+    console.log(`✨ 配置文件构建成功:`);
+    console.log(filePath + "\n");
+  } catch (error) {
+    console.log("配置文件配置文件打包失败:\n" + error);
+  }
+}
+
+const runBuild = async () => {
+  try {
+    const config = getEnvConfig();
+    createConfig({
+      config,
+      configName: CONFIG_NAME,
+      configFileName: CONFIG_FILE_NAME,
+    });
+    console.log(`环境变量注入成功 - 构建成功!`);
+  } catch (error) {
+    console.log("虚拟构建错误:\n" + error);
+    process.exit(1);
+  }
+};
+
+runBuild();

+ 213 - 9
package-lock.json

@@ -59,11 +59,14 @@
         "@vitejs/plugin-vue-jsx": "^4.0.1",
         "@vue/cli-service": "5.0.8",
         "@vue/compiler-sfc": "3.4.27",
+        "dotenv": "^16.4.7",
+        "fs-extra": "^11.2.0",
         "prettier": "^3.3.3",
         "sass": "1.77.1",
         "unplugin-auto-import": "0.17.6",
         "unplugin-icons": "0.19.0",
         "vite": "5.2.11",
+        "vite-plugin-html": "^3.2.2",
         "vite-plugin-mock": "3.0.2",
         "vite-plugin-vue-setup-extend": "0.4.0",
         "vue-tsc": "2.0.17"
@@ -3543,6 +3546,30 @@
         }
       }
     },
+    "node_modules/@vue/cli-service/node_modules/dotenv": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-10.0.0.tgz",
+      "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@vue/cli-service/node_modules/fs-extra": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz",
+      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+      "dev": true,
+      "dependencies": {
+        "at-least-node": "^1.0.0",
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/@vue/cli-shared-utils": {
       "version": "5.0.8",
       "resolved": "https://registry.npmmirror.com/@vue/cli-shared-utils/-/cli-shared-utils-5.0.8.tgz",
@@ -5350,6 +5377,12 @@
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
       "dev": true
     },
+    "node_modules/consola": {
+      "version": "2.15.3",
+      "resolved": "https://registry.npmmirror.com/consola/-/consola-2.15.3.tgz",
+      "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==",
+      "dev": true
+    },
     "node_modules/consolidate": {
       "version": "0.15.1",
       "resolved": "https://registry.npmmirror.com/consolidate/-/consolidate-0.15.1.tgz",
@@ -6495,12 +6528,15 @@
       }
     },
     "node_modules/dotenv": {
-      "version": "10.0.0",
-      "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-10.0.0.tgz",
-      "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
+      "version": "16.4.7",
+      "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.4.7.tgz",
+      "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
       "dev": true,
       "engines": {
-        "node": ">=10"
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://dotenvx.com"
       }
     },
     "node_modules/dotenv-expand": {
@@ -6579,6 +6615,21 @@
       "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
       "dev": true
     },
+    "node_modules/ejs": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz",
+      "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+      "dev": true,
+      "dependencies": {
+        "jake": "^10.8.5"
+      },
+      "bin": {
+        "ejs": "bin/cli.js"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/electron-to-chromium": {
       "version": "1.5.25",
       "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz",
@@ -7189,6 +7240,36 @@
       "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz",
       "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
     },
+    "node_modules/filelist": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz",
+      "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+      "dev": true,
+      "dependencies": {
+        "minimatch": "^5.0.1"
+      }
+    },
+    "node_modules/filelist/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/filelist/node_modules/minimatch": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/fill-range": {
       "version": "7.0.1",
       "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
@@ -7323,18 +7404,17 @@
       "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
     },
     "node_modules/fs-extra": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz",
-      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+      "version": "11.2.0",
+      "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.2.0.tgz",
+      "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
       "dev": true,
       "dependencies": {
-        "at-least-node": "^1.0.0",
         "graceful-fs": "^4.2.0",
         "jsonfile": "^6.0.1",
         "universalify": "^2.0.0"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=14.14"
       }
     },
     "node_modules/fs-monkey": {
@@ -8093,6 +8173,46 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/jake": {
+      "version": "10.9.2",
+      "resolved": "https://registry.npmmirror.com/jake/-/jake-10.9.2.tgz",
+      "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
+      "dev": true,
+      "dependencies": {
+        "async": "^3.2.3",
+        "chalk": "^4.0.2",
+        "filelist": "^1.0.4",
+        "minimatch": "^3.1.2"
+      },
+      "bin": {
+        "jake": "bin/cli.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jake/node_modules/async": {
+      "version": "3.2.6",
+      "resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz",
+      "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+      "dev": true
+    },
+    "node_modules/jake/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
     "node_modules/javascript-stringify": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz",
@@ -9133,6 +9253,16 @@
         "node": ">= 6.13.0"
       }
     },
+    "node_modules/node-html-parser": {
+      "version": "5.4.2",
+      "resolved": "https://registry.npmmirror.com/node-html-parser/-/node-html-parser-5.4.2.tgz",
+      "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==",
+      "dev": true,
+      "dependencies": {
+        "css-select": "^4.2.1",
+        "he": "1.2.0"
+      }
+    },
     "node_modules/node-releases": {
       "version": "2.0.18",
       "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.18.tgz",
@@ -12102,6 +12232,80 @@
         }
       }
     },
+    "node_modules/vite-plugin-html": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/vite-plugin-html/-/vite-plugin-html-3.2.2.tgz",
+      "integrity": "sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==",
+      "dev": true,
+      "dependencies": {
+        "@rollup/pluginutils": "^4.2.0",
+        "colorette": "^2.0.16",
+        "connect-history-api-fallback": "^1.6.0",
+        "consola": "^2.15.3",
+        "dotenv": "^16.0.0",
+        "dotenv-expand": "^8.0.2",
+        "ejs": "^3.1.6",
+        "fast-glob": "^3.2.11",
+        "fs-extra": "^10.0.1",
+        "html-minifier-terser": "^6.1.0",
+        "node-html-parser": "^5.3.3",
+        "pathe": "^0.2.0"
+      },
+      "peerDependencies": {
+        "vite": ">=2.0.0"
+      }
+    },
+    "node_modules/vite-plugin-html/node_modules/@rollup/pluginutils": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
+      "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
+      "dev": true,
+      "dependencies": {
+        "estree-walker": "^2.0.1",
+        "picomatch": "^2.2.2"
+      },
+      "engines": {
+        "node": ">= 8.0.0"
+      }
+    },
+    "node_modules/vite-plugin-html/node_modules/connect-history-api-fallback": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+      "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/vite-plugin-html/node_modules/dotenv-expand": {
+      "version": "8.0.3",
+      "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-8.0.3.tgz",
+      "integrity": "sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite-plugin-html/node_modules/fs-extra": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
+      "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+      "dev": true,
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite-plugin-html/node_modules/pathe": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/pathe/-/pathe-0.2.0.tgz",
+      "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==",
+      "dev": true
+    },
     "node_modules/vite-plugin-mock": {
       "version": "3.0.2",
       "resolved": "https://registry.npmmirror.com/vite-plugin-mock/-/vite-plugin-mock-3.0.2.tgz",

+ 9 - 5
package.json

@@ -4,6 +4,7 @@
   "scripts": {
     "dev": "vite",
     "update:element": "npm install element-plus ./deps/element-plus.2.7.1.1.tar.gz",
+    "build:env": "vite build && node ./bin/inject-env-to-window.js",
     "build": "vite build --mode=production",
     "build:show": "vite build --mode=show",
     "build:tianzi": "vite build --mode=tz"
@@ -11,6 +12,7 @@
   "dependencies": {
     "@babel/standalone": "7.24.5",
     "@element-plus/icons-vue": "2.3.1",
+    "@imengyu/vue3-context-menu": "^1.4.2",
     "@kjgl77/datav-vue3": "1.7.2",
     "@vitejs/plugin-legacy": "5.4.0",
     "@vueuse/core": "10.9.0",
@@ -31,12 +33,14 @@
     "jquery": "3.7.1",
     "js-cookie": "3.0.5",
     "jsbarcode": "3.11.6",
+    "jsencrypt": "^3.3.2",
     "moment": "2.29.4",
     "monaco-editor": "0.48.0",
     "normalize.css": "8.0.1",
     "nprogress": "0.2.0",
     "pinia": "2.1.7",
     "qrcanvas": "3.1.2",
+    "qs": "^6.13.0",
     "sortablejs": "1.15.2",
     "vue": "^3.5.6",
     "vue-cropper": "^1.1.2",
@@ -47,24 +51,24 @@
     "vxe-table": "^4.7.50",
     "vxe-table-plugin-export-xlsx": "4.0.1",
     "xe-utils": "3.5.26",
-    "xlsx": "0.17.0",
-    "qs": "^6.13.0",
-    "jsencrypt": "^3.3.2",
-    "@imengyu/vue3-context-menu": "^1.4.2"
+    "xlsx": "0.17.0"
   },
   "devDependencies": {
-    "@types/qs": "^6.9.15",
     "@types/node": "20.11.0",
+    "@types/qs": "^6.9.15",
     "@types/sortablejs": "^1.15.8",
     "@vitejs/plugin-vue": "5.0.4",
     "@vitejs/plugin-vue-jsx": "^4.0.1",
     "@vue/cli-service": "5.0.8",
     "@vue/compiler-sfc": "3.4.27",
+    "dotenv": "^16.4.7",
+    "fs-extra": "^11.2.0",
     "prettier": "^3.3.3",
     "sass": "1.77.1",
     "unplugin-auto-import": "0.17.6",
     "unplugin-icons": "0.19.0",
     "vite": "5.2.11",
+    "vite-plugin-html": "^3.2.2",
     "vite-plugin-mock": "3.0.2",
     "vite-plugin-vue-setup-extend": "0.4.0",
     "vue-tsc": "2.0.17"

+ 87 - 56
vite.config.js

@@ -1,4 +1,4 @@
-import { defineConfig } from "vite";
+import { defineConfig, loadEnv } from "vite";
 import vue from "@vitejs/plugin-vue";
 import { resolve } from "path";
 // vue setup 的糖语法
@@ -7,6 +7,8 @@ import VueSetupExtend from "vite-plugin-vue-setup-extend";
 import AutoImport from "unplugin-auto-import/vite";
 import Icons from "unplugin-icons/vite";
 import vueJsx from "@vitejs/plugin-vue-jsx";
+import { createHtmlPlugin } from "vite-plugin-html";
+import pkg from "./package.json";
 
 const pathResolve = dir => {
   return resolve(__dirname, ".", dir);
@@ -16,61 +18,90 @@ const alias = {
   "@": pathResolve("src"),
 };
 
-export default defineConfig({
-  define: {
-    __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: "true",
-  },
-  esbuild: {
-    jsxFactory: "h",
-    jsxFragment: "Fragment",
-  },
-  externals: {
-    BMap: "BMap",
-    BMapLib: "BMapLib",
-  },
-  resolve: {
-    alias,
-    extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],
-  },
-  plugins: [
-    Icons({
-      autoInstall: true,
-      compiler: "vue3",
-    }),
-    VueSetupExtend(),
-    vue(),
-    vueJsx(),
-    AutoImport({
-      dts: "src/auto-imports.d.ts",
-      imports: ["vue"],
-    }),
-  ],
-  server: {
-    host: "0.0.0.0",
-    port: 3000,
-    proxy: {
-      "/emr": {
-        //这里配置运行时服务地址
-        target: "http://172.16.32.125:8001/emr",
-        secure: false, //如果运行时服务是https,此处配置为true
-        changeOrigin: true, //支持跨域调用,这里配置为true
-        rewrite: path => path.replace(/^\/emr/, ""),
-      },
-      "/doctorSignatureImage": {
-        target: "http://172.16.32.167:8077",
-        secure: false, //如果运行时服务是https,此处配置为true
-        changeOrigin: true, //支持跨域调用,这里配置为true
-      },
-      "/thyyarchive": {
-        target: "http://172.16.32.197:9202/",
-        secure: false,
-        changeOrigin: true,
-        rewrite: path => path.replace(/^\/thyyarchive/, ""),
+export default defineConfig(({ mode }) => {
+  const ENV = loadEnv(mode, process.cwd());
+  const GLOB_CONFIG_FILE_NAME = "_app.config.js";
+
+  const isBuild = mode === "production";
+  const getAppConfigSrc = () => {
+    return `/${GLOB_CONFIG_FILE_NAME}?v=${pkg.version}-${new Date().getTime()}`;
+  };
+
+  return {
+    define: {
+      __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: "true",
+    },
+    esbuild: {
+      jsxFactory: "h",
+      jsxFragment: "Fragment",
+    },
+    externals: {
+      BMap: "BMap",
+      BMapLib: "BMapLib",
+    },
+    resolve: {
+      alias,
+      extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],
+    },
+    plugins: [
+      Icons({
+        autoInstall: true,
+        compiler: "vue3",
+      }),
+      VueSetupExtend(),
+      vue(),
+      vueJsx(),
+      AutoImport({
+        dts: "src/auto-imports.d.ts",
+        imports: ["vue"],
+      }),
+      createHtmlPlugin({
+        minify: isBuild,
+        inject: {
+          data: {
+            title: "",
+          },
+          // Embed the generated app.config.js file
+          tags: isBuild
+            ? [
+                {
+                  tag: "script",
+                  attrs: {
+                    src: getAppConfigSrc(),
+                  },
+                },
+              ]
+            : [],
+        },
+      }),
+    ],
+    server: {
+      host: "0.0.0.0",
+      port: 3000,
+      proxy: {
+        "/emr": {
+          //这里配置运行时服务地址
+          target: "http://172.16.32.125:8001/emr",
+          secure: false, //如果运行时服务是https,此处配置为true
+          changeOrigin: true, //支持跨域调用,这里配置为true
+          rewrite: path => path.replace(/^\/emr/, ""),
+        },
+        "/doctorSignatureImage": {
+          target: "http://172.16.32.167:8077",
+          secure: false, //如果运行时服务是https,此处配置为true
+          changeOrigin: true, //支持跨域调用,这里配置为true
+        },
+        "/thyyarchive": {
+          target: "http://172.16.32.197:9202/",
+          secure: false,
+          changeOrigin: true,
+          rewrite: path => path.replace(/^\/thyyarchive/, ""),
+        },
       },
     },
-  },
-  build: {
-    chunkSizeWarningLimit: 1000,
-    outDir: "release/dist",
-  },
+    build: {
+      chunkSizeWarningLimit: 1000,
+      outDir: "release/dist",
+    },
+  };
 });