vue.config.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. const path = require("path");
  2. const TerserPlugin = require("terser-webpack-plugin");
  3. const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
  4. const WorkboxPlugin = require("workbox-webpack-plugin");
  5. const HappyPack = require("happypack");
  6. const webpack = require("webpack");
  7. // const HtmlWebpackPlugin = require("html-webpack-plugin");
  8. function resolve(dir) {
  9. return path.join(__dirname, dir);
  10. }
  11. /** 仅注册已配置 target 的代理,避免 undefined 导致 devServer 启动失败 */
  12. function buildDevProxy(routes) {
  13. return routes.reduce((proxy, route) => {
  14. if (!route.target) return proxy;
  15. const { context, target, pathRewrite, onProxyReq, timeout, proxyTimeout } =
  16. route;
  17. proxy[context] = {
  18. target,
  19. changeOrigin: true,
  20. ...(pathRewrite ? { pathRewrite } : {}),
  21. ...(onProxyReq ? { onProxyReq } : {}),
  22. ...(timeout ? { timeout } : {}),
  23. ...(proxyTimeout ? { proxyTimeout } : {}),
  24. };
  25. return proxy;
  26. }, {});
  27. }
  28. module.exports = {
  29. chainWebpack(config) {
  30. config.module.rule("svg").exclude.add(resolve("src/icons")).end();
  31. config.module
  32. .rule("icons")
  33. .test(/\.svg$/)
  34. .include.add(resolve("src/icons"))
  35. .end()
  36. .use("svg-sprite-loader")
  37. .loader("svg-sprite-loader")
  38. .options({
  39. symbolId: "icon-[name]",
  40. })
  41. .end();
  42. config.plugin("happypack").use(HappyPack, [
  43. {
  44. loaders: ["babel-loader"],
  45. },
  46. ]);
  47. // config.plugin('dll').use(webpack.DllPlugin, [
  48. // {
  49. // name: '[name]_library',
  50. // path: path.join(__dirname, 'dll', '[name]-manifest.json'),
  51. // },
  52. // ]);
  53. // 仅生产构建注册 Service Worker:dev server(--watch)下 GenerateSW 重复调用
  54. // 存在已知问题——首次生成的 precache 版本号后续不会正确更新,会导致浏览器
  55. // 一直用旧缓存响应请求,改代码、重启 dev server、强制刷新都不生效。
  56. if (process.env.NODE_ENV === "production") {
  57. config.plugin("workbox").use(WorkboxPlugin.GenerateSW, [
  58. {
  59. clientsClaim: true,
  60. skipWaiting: true,
  61. },
  62. ]);
  63. }
  64. },
  65. css: {
  66. loaderOptions: {
  67. postcss: {
  68. postcssOptions: {
  69. plugins: [require("tailwindcss"), require("autoprefixer")],
  70. },
  71. },
  72. sass: {
  73. additionalData: `
  74. @import "@/styles/global.scss";
  75. `,
  76. },
  77. },
  78. },
  79. devServer: {
  80. // contentBase: path.join(__dirname, "public"),
  81. // 页面 IP/端口:在各 .env.* 中配置 VUE_APP_DEV_HOST、VUE_APP_DEV_PORT
  82. host: process.env.VUE_APP_DEV_HOST || "localhost",
  83. port: process.env.VUE_APP_DEV_PORT
  84. ? Number(process.env.VUE_APP_DEV_PORT)
  85. : 8080,
  86. proxy: buildDevProxy([
  87. {
  88. context: "/api",
  89. target: process.env.VUE_APP_APIPROXY,
  90. pathRewrite: { "^/api": "" },
  91. },
  92. {
  93. context: "/DatangEnosData",
  94. target: process.env.VUE_APP_DatangEnosData_APIPROXY,
  95. pathRewrite: { "^/DatangEnosData": "" },
  96. },
  97. // 健康分析接口(勿用 /health,避免与路由 /home/health 及 history 回退冲突)
  98. {
  99. context: "/healthApi",
  100. target: process.env.VUE_APP_HEALTH_APIPROXY,
  101. pathRewrite: { "^/healthApi": "" },
  102. },
  103. // 振动、激光测距仪
  104. {
  105. context: "/WZLapi",
  106. target: process.env.VUE_APP_WZLAPIPROXY,
  107. pathRewrite: { "^/WZLapi": "" },
  108. },
  109. {
  110. context: "/ETLapi",
  111. target: process.env.VUE_APP_ETLAPIPROXY,
  112. pathRewrite: { "^/ETLapi": "" },
  113. onProxyReq(proxyReq) {
  114. console.log("Proxying /ETLapi request to:", proxyReq.path);
  115. },
  116. },
  117. {
  118. context: "/tiles_map",
  119. target: process.env.VUE_APP_MAP,
  120. pathRewrite: { "^/tiles_map": "/tiles_map" },
  121. },
  122. {
  123. context: "/tiles",
  124. target: process.env.VUE_APP_MAP,
  125. pathRewrite: { "^/tiles": "/tiles" },
  126. },
  127. {
  128. context: "/AnalysisMulti",
  129. target: process.env.VUE_APP_AnalysisMultiAPIPROXY,
  130. pathRewrite: { "^/AnalysisMulti": "" },
  131. },
  132. {
  133. context: "/transDataWeb",
  134. target: process.env.VUE_APP_WZLAPIPROXY,
  135. pathRewrite: { "^/transDataWeb": "" },
  136. },
  137. {
  138. context: "/sAlgorithm",
  139. target: process.env.VUE_APP_sAlgorithmAPIPROXY,
  140. pathRewrite: { "^/sAlgorithm": "" },
  141. },
  142. {
  143. context: "/databaseApi",
  144. target: process.env.VUE_APP_databaseApiAPIPROXY,
  145. pathRewrite: { "^/databaseApi": "" },
  146. },
  147. {
  148. context: "/downLoadChart",
  149. target: process.env.VUE_APP_downLoadChartAPIPROXY,
  150. pathRewrite: { "^/downLoadChart": "" },
  151. timeout: 30 * 60 * 1000,
  152. proxyTimeout: 30 * 60 * 1000,
  153. },
  154. ]),
  155. },
  156. configureWebpack: {
  157. resolve: {
  158. alias: {
  159. "@": resolve("src"),
  160. },
  161. },
  162. optimization: {
  163. usedExports: true,
  164. splitChunks: {
  165. chunks: "all",
  166. },
  167. minimize: true,
  168. minimizer: [new TerserPlugin(), new CssMinimizerPlugin()],
  169. },
  170. // plugins: [
  171. // new HtmlWebpackPlugin({
  172. // filename: "custom-filename.html", // 自定义输出的 HTML 文件名
  173. // title: "风机运行管理系统", // 设置页面的标题
  174. // // 其他配置...
  175. // }),
  176. // // 其他插件...
  177. // ],
  178. },
  179. pluginOptions: {
  180. "style-resources-loader": {
  181. preProcessor: "sass",
  182. patterns: [],
  183. },
  184. },
  185. configureWebpack: {
  186. devtool: "source-map",
  187. },
  188. };