1012414140@qq.com
2026-10-16 49345844dc953732e015889d58ea73b2bc7adef9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
var path = require('path')
module.exports = {
  publicPath: '/',
  assetsDir: 'static',
  productionSourceMap: false, // 关闭sourceMap,减少产物体积
 
  // 强制抽离 CSS 为独立文件,不内联进 JS
  css: {
    extract: true
  },
 
  configureWebpack: {
    // ========== 只外置:ElementUI / ViewUI / ECharts,必须外置 vue ==========
    externals: {
      'vue': 'Vue',
      'element-ui': 'ELEMENT',
      // view-design 4.x 的 UMD 包(dist/iview.min.js)在浏览器下挂载的全局名是 iview
      'view-design': 'iview',
      'echarts': 'echarts'
    },
    // =======================================================
 
    optimization: {
      minimizer: [
        new (require('terser-webpack-plugin'))({
          terserOptions: {
            compress: {
              drop_console: true, // 移除console
              drop_debugger: true, // 移除debugger
              pure_funcs: ['console.log', 'console.info', 'console.warn']
            },
            mangle: {
              safari10: true
            },
            output: {
              comments: false // 移除所有注释
            }
          },
          extractComments: false,
          parallel: true // 多进程压缩
        })
      ],
 
      runtimeChunk: 'single',
 
      splitChunks: {
        chunks: 'all',
        minSize: 10 * 1024, // 20kb → 10kb,拆分更充分
        minChunks: 2,
        maxAsyncRequests: 30,
        maxInitialRequests: 30,
        name: false,
 
        cacheGroups: {
          common: {
            name: 'common',
            chunks: 'all',
            minChunks: 2,
            priority: 5,
            reuseExistingChunk: true
          },
          vendor: {
            test: /[\\/]node_modules[\\/]/,
            name: 'vendor',
            chunks: 'all',
            priority: 10,
            reuseExistingChunk: true
          }
        }
      }
    },
    resolve: {
      alias: {
        '@': path.join(__dirname, 'src')
      }
    }
  },
 
  // 图片优化 + 关闭预加载冗余
  chainWebpack(config) {
    config.module
      .rule('images')
      .use('url-loader')
      .loader('url-loader')
      .tap(options => {
        options.limit = 4 * 1024
        return options
      })
    config.plugins.delete('prefetch')
    config.plugins.delete('preload')
  },
 
  devServer: {
    sockHost: 'localhost',
    port: 8082,
    disableHostCheck: true,
    proxy: {
      '/': {
        target: 'http://183.196.93.178:8089',
        // target: 'http://192.168.0.147:8089',
        changeOrigin: true,
        pathRewrite: {
          '/': ''
        }
      }
    }
  }
}