import { defineConfig, loadEnv } from 'vite'
import path from 'path'
import createVitePlugins from './vite/plugins'
import px2rem from 'postcss-plugin-px2rem'

// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
  const env = loadEnv(mode, process.cwd())
  return {
    build: {
      target: 'es2020',
      rollupOptions: {
        input: './index.html',
        _output: {//不配置
          // 入口文件
          entryFileNames(chunk) {
            return 'assets/js/app-[hash].js';
          },
          // async-chunk
          chunkFileNames() {
            return 'assets/js/[name]-[hash].js';
          },
          // 资源文件
          assetFileNames(chunk) {
            // css
            if (chunk.name?.endsWith('.css')) {
              return 'assets/css/[name]-[hash].[ext]';
            }
            // image
            if (/.(png|jpg|gif|jpeg|webp|svg)$/.test(chunk.name || '')) {
              return 'assets/imgs/[name].[ext]';
            }
  
            return `assets/other/[name].[ext]`;
          },
        },
      }, 
    },
    optimizeDeps: {
      esbuildOptions: {
        target: 'es2020', 
      },
    },
    // 部署生产环境和开发环境下的URL。
    // 默认情况下，vite 会假设你的应用是被部署在一个域名的根路径上
    // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上，你就需要用这个选项指定这个子路径。例如，如果你的应用被部署在 https://www.ruoyi.vip/admin/，则设置 baseUrl 为 /admin/。
    plugins: createVitePlugins(env, command === 'build'),
    base: './',
    envDir: path.resolve(__dirname, './env'),
    resolve: {
      // https://cn.vitejs.dev/config/#resolve-alias
      alias: {
        // 设置路径
        '~': path.resolve(__dirname, './'),
        // 设置别名
        '@': path.resolve(__dirname, './src')
      },
      // https://cn.vitejs.dev/config/#resolve-extensions
      extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
    },
    // vite 相关配置
    server: {
      hmr: true,
      port: 8887,
      host: true,
      open: false,
      proxy: {
        // https://cn.vitejs.dev/config/#server-proxy
        '/api/': {
          target: 'http://127.0.0.1:8080',
          changeOrigin: true,
          rewrite: (p) => p.replace(/^\/api/, ''),
          timeout: 60000,
          proxyTimeout:60000
        },
        '/upload': {
          target: 'http://127.0.0.1:8080',
          changeOrigin: true
        },
        '/files': {
          target: 'http://192.168.3.222:9000',
          changeOrigin: true
        }
      }
    },
    //fix:error:stdin>:7356:1: warning: "@charset" must be the first rule in the file
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: '@use "/src/assets/css/global.scss" as *;',
          api: "modern-compiler"
        }
      },
      postcss: {
        plugins: [
          px2rem({
            rootValue: 15,  //换算基数， 默认100 ,也就是1440px ，这样的话把根标签的字体规定为1rem为50px,这样就可以从设计稿上量出多少个px直接在代码中写多少px了
            unitPrecision: 5, //允许REM单位增长到的十进制数字，其实就是精度控制
            // propWhiteList: [], // 默认值是一个空数组，这意味着禁用白名单并启用所有属性。
            // propBlackList: [], // 黑名单
            // exclude:false,  //默认false，可以（reg）利用正则表达式排除某些文件夹的方法，例如/(node_module)/ 。如果想把前端UI框架内的px也转换成rem，请把此属性设为默认值
            // selectorBlackList: [], //要忽略并保留为px的选择器
            // ignoreIdentifier: false, //（boolean/string）忽略单个属性的方法，启用ignoreidentifier后，replace将自动设置为true。
            // replace: true, // （布尔值）替换包含REM的规则，而不是添加回退。
            mediaQuery: false, //（布尔值）允许在媒体查询中转换px
            minPixelValue: 0  //设置要替换的最小像素值(3px会被转rem)。 默认 0
          }),
          {
            postcssPlugin: 'internal:charset-removal',
            AtRule: {
              charset: (atRule) => {
                if (atRule.name === 'charset') {
                  atRule.remove();
                }
              }
            }
          }
        ]
      }
    }
  }
})
