vite配置文件

128 阅读3分钟

vite.base.config.js

// path 本质上就是一个路径字符串处理模块,它里面有非常多的路径字符串处理方法
import path from "path";
import { defineConfig } from "vite";

import postcssPresetEnv from 'postcss-preset-env'
import myViteAliases from './plugins/ViteAliases.js'
// import { createHtmlPlugin } from 'vite-plugin-html'
import CreateHtmlPlugin from "./plugins/CreateHtmlPlugin.js";
// import { viteMockServe } from 'vite-plugin-mock'
import VitePluginMock from "./plugins/VitePluginMock.js";
import checker from "vite-plugin-checker";
import viteCompression from 'vite-plugin-compression'
import viteCDNPlugin from 'vite-plugin-cdn-import'

export default defineConfig({
  resolve: {
    // 路径别名
    // alias: {
    //   "@": path.resolve(__dirname, "./src"),
    //   "@assets": path.resolve(__dirname, "./src/assets")
    // },
    extensions: ['.js', '.mjs', '.ts', '.jsx', '.tsx', '.json', '.vue']
  },
  optimizeDeps: {
    exclude: []
  },
  envPrefix: 'ENV_', //可识别的环境变量前缀
  css: { //对css的行为进行配置
    modules: { //对css模块化默认行为进行覆盖, module 配置最终是会传给 postcss modules
      // 修改生成的配置对象的key的展示形式(驼峰还是中划线的形式)
      localsConvention: 'camelCaseOnly',
      // 配置当前的模块化行为是模块化还是全局化(有 hash 就是开启了模块化的标志,因为他可以保证产生不同的 hash 值来控制我们的样式不被覆盖)
      scopeBehaviour: 'local',
      // 生产类名的规则(可以配置成函数也可以配置成字符串):https://github.com/webpack/loader-utils#interpolatename
      generateScopedName: '[name]_[local]_[hash:5]',
      // generateScopedName: (name, filename, css) => {
      //   // name ---> 代表当前css文件的类名
      //   // filename ---> 当前css文件的绝对路径
      //   // css ---> 当前的样式
      //   return `${name}_${Math.random().toString(36).substring(5, 12)}`
      // } //配置成函数时,返回值决定了他最终的显示类型

      // 生产 hash 的时候会根据给的类名以及其他字符串生产,如果想要生产的 hash 更加的独特一点,可以配置 hashPrefix, 该前缀可以参与 hash 生产
      hashPrefix: 'lijian',
      // 代表不想参与到css模块化的路径,
      globalModulePaths: []
    },
    // 用来配置 css预处理器 的全局参数
    preprocessorOptions: {
      // 整个配置对象最后都会给到less的执行(全局)参数中去
      less: {
        math: 'always',
        // 全局变量,可以在全局使用,不需要再额外多文件中导入以下变量
        globalVars: {
          mainColor: 'red'
        }
      },
      sass: {}
    },
    // 文件间的索引(当没有索引时,当程序报错的时候只会指出压缩后的代码文件的错误位置,而无法定位到源代码的错误位置)
    devSourcemap: true, //开启css的文件索引(sourceMap)
    // 直接配置的就是 postcss 的配置
    postcss: {
      plugins: [
        postcssPresetEnv({
          importFrom: [path.resolve(__dirname, './variable.css')]
        })
      ]
    }
  },
  // 构建生产包时的一些策略
  build: {
    // 配置 rollup 的一些构建策略
    rollupOptions: {
      // 控制输出
      output: {
        // 在 rollup 中 hash 是将文件名和文件内容组合计算得出来的结果
        assetFileNames: "[hash].[name].[ext]",
        // 分包策略
        manualChunks: (id) => {
          // id 是每个文件模块的绝对路径
          // node_modules 中的文件包,例如 lodash
          if (id.includes('node_modules')) {
            // return 'vendor';
          }
        }
      },
    },
    // 图片内容小于 4kb 就转化成 base64
    assetsInlineLimit: 4096000,
    // 打包后的文件夹名称,不配置默认是 dist
    // outDir: 'testDist',
    // assetsDir: "static",//配置输出目录中的静态资源目录
    emptyOutDir: true,//清除输出目录的所有文件,默认就是 true

  },
  plugins: [
    myViteAliases(), //设置别名
    CreateHtmlPlugin({ //修改 html 内容
      inject: {
        data: {
          title: 'lijian'
        }
      }
    }),
    // viteMockServe(), //开启 mock 测试
    VitePluginMock(),
    // typescript 检测
    checker({
      // typescript: true, // 配合在package.json 中 添加 tsc --noEmit 使用
    }),
    // 代码压缩
    viteCompression({
      verbose: true, // 是否在控制台输出压缩结果
      disable: false, // 是否禁用
      threshold: 10240, // 体积大于 threshold 才会被压缩,单位 b
      algorithm: 'gzip', // 压缩算法,可选 [ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw']
      ext: '.gz', // 生成的压缩包后缀
      deleteOriginFile: false //压缩后是否删除源文件
    }),
    // 配置 cdn 
    viteCDNPlugin({
      modules: [
        {
          // 模块名称
          name: 'lodash',
          // 全局导出的名称
          var: '_',
          // cdn 地址
          path: 'https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js'
        }
      ]
    })
  ],
  // 开发服务器中的配置
  server: {
    // 配置跨域解决方案
    proxy: {
      "/api": {
        target: "http://www.360.com",
        changeOrigin: true,
        rewrite: (path) => {
          console.log('path', path, path.replace(/^\/api/, ''));
          return path.replace(/^\/api/, '')
        }
      }
    }
  }
})

vite.config.js

import { defineConfig } from "rollup";
import viteBaseConfig from "./vite.base.config";
import viteDevConfig from "./vite.dev.config";
import viteProdConfig from "./vite.prod.config";

// 策略模式
const envResolve = {
  "build": () => {
    console.log('生产环境');
    return Object.assign({}, viteBaseConfig, viteProdConfig)
  },
  "serve": () => {
    console.log('开发环境');
    return Object.assign({}, viteBaseConfig, viteDevConfig)
  }
}

export default defineConfig(({ command, mode }) => {
  // command: ' build | serve ', 'build' 代表生产环境, 'serve' 代表的开发环境
  return envResolve[command]()
})