/* * @Author: your name * @Date: 2020-10-14 15:24:16 * @LastEditTime: 2022-01-20 11:38:21 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: \vue3-element-sysu-map\vue.config.js */ const config = require("./src/config"); const webpack = require("webpack"); const path = require('path') function resolve(dir) { return path.join(__dirname, '.', dir) } const TerserPlugin = require("terser-webpack-plugin"); const CompressionWebpackPlugin = require("compression-webpack-plugin"); let scssVariables = require("./src/styles/variables.scss.js"); const Icons = require("unplugin-icons/webpack") const IconsResolver = require("unplugin-icons/resolver") module.exports = { publicPath: "", productionSourceMap: false, devServer: { setupMiddlewares: (middlewares, devServer) => { if (config.dev_mock) { const mock_server = require("./src/api/mock-server.js"); mock_server(devServer.app); } return middlewares; }, proxy: { '/ws': { target: 'https://apis.map.qq.com', changeOrigin: true, ws: false, } }, host: '127.0.0.1', port: '8081', https: false, open: false // 配置自动启动浏览器 }, chainWebpack: (config) => { config.resolve.symlinks(true); config.plugin("provide").use(webpack.ProvidePlugin, [ { XE: "xe-utils", }, ]); config.plugin("define").use(webpack.DefinePlugin, [ { VE_ENV: { MODE: JSON.stringify(process.env.NODE_ENV), SERVER: JSON.stringify(process.env.SERVER), PYSERVER: JSON.stringify(process.env.PYSERVER) }, }, ]); }, configureWebpack: () => { let baseConfig = { plugins: [ Icons({ compiler: 'vue3' }), ], }; let envConfig = {}; if (process.env.NODE_ENV === "production") { // 为生产环境修改配置... envConfig = { optimization: { splitChunks: { chunks: "all", // enforceSizeThreshold: 20000, cacheGroups: { echarts: { name: "chunk-echarts", priority: 20, test: /[\\/]node_modules[\\/]_?echarts(.*)/, }, elementPlus: { name: "chunk-elementPlus", priority: 20, test: /[\\/]node_modules[\\/]_?element-plus(.*)/, }, elementPlusIcon: { name: "chunk-elementPlusIcon", priority: 20, test: /[\\/]node_modules[\\/]_?@element-plus[\\/]icons(.*)/, }, mockjs: { name: "chunk-mockjs", priority: 20, test: /[\\/]node_modules[\\/]_?mockjs(.*)/, }, }, }, }, externals: { // lodash: "_" }, plugins: [ new TerserPlugin({ terserOptions: { compress: { drop_console: false, drop_debugger: true, }, }, }), new CompressionWebpackPlugin({ filename: "[path][base].gz", algorithm: "gzip", // test: /\.js$|\.html$|\.json$|\.css/, test: /\.js$|\.json$|\.css/, threshold: 10240, // 只有大小大于该值的资源会被处理 minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理 // deleteOriginalAssets: true // 删除原文件 }), Icons({ compiler: 'vue3' }), ], }; } return Object.assign(baseConfig, envConfig); }, css: { loaderOptions: { scss: { // 注意:在 sass-loader v8 中,这个选项名是 "prependData" // additionalData: `@import "~@/styles/imports.scss";` additionalData: Object.keys(scssVariables) .map((k) => `$${k.replace("_", "-")}: ${scssVariables[k]};`) .join("\n"), }, }, }, };