Skip to content
On this page

vite相关配置参数

这一篇文章主要介绍vite的配置参数,下一篇文章将详细的介绍工作中常用的插件。

ts
import { ConfigEnv, defineConfig, UserConfig } from 'vite'

/**
 * 建议使用函数的方式导出配置项,操作更加灵活
 * 除了以下这种写法,我们还可以这样写:
 * export default defineConfig(({ command, mode }: ConfigEnv) => {
 *  ......
 * })
 */
export default ( { command, mode }: ConfigEnv ): UserConfig => {
    return {
        /**
         * 基础路径: 如果当前网址是127.0.0.1::5173/#/login,
         * 当我们期望是127.0.0.1::5173/fx/#/login,我们需要将base配置成'/fx',
         * 并且所有的请求都会自动加上'/fx'
        */
        base: '/',

        // 文件根路径(index.html 文件所在的位置), 默认为process.cwd()
        root: process.cwd(),

        // 设为false 可以避免 vite 清屏而错过在终端中打印某些关键信息
        clearScreen: true,

        resolve: {
            /**
             * 定义别名,
             * 例如将/@/指向src文件夹
             * tips: 如果使用ts, 请在tsconfig => compilerOptions => paths: {
             *      "/@/*": ["src/*"],
             * }, 否则会报语法错误
             * 后期我们会使用vite-aliases插件自动帮我们生成别名,这个会在vite插件中介绍
             */
            alias: [
                {
                    find: /^\/@\//,
                    replacement: pathResolve('src') + '/'
                },
                ...
            ]
        },

        css: {
            // 配置 css modules 的行为
            modules: {
                
            },
            // postCss 配置
            postcss: {

            },
            //指定传递给 css 预处理器的选项
            preprocessorOptions:{
                scss: {
                    additionalData:`$injectedColor:orange;`
                },
                less: {
		            modifyVars: {
						hack: `true; @import (reference) "./src/assets/style/var.less";`
					},
		            javascriptEnabled: true,
		        },
            }
        },

        json: {
            // 是否支持从 .json 文件中进行按名导入
            namedExports: true,
            // 若设置为 true 导入的json会被转为 export default JSON.parse("..") 会比转译成对象字面量性能更好
            stringify:false
        },

        // 继承自 esbuild 转换选项,最常见的用例是自定义 JSX
        esbuild: {
            jsxFactory: "h",
            jsxFragment: "Fragment",
            jsxInject:`import Vue from 'vue'`
        },

        // 前端服务器相关配置
        server: {
            // 端口被占用时,尝试下一个可用端口
            strictPort: false,
            // 是否启用https
            https: false, 
            /**
             * 是否在浏览器中打开页面
             * 如果想把谷歌作为默认的浏览器:
             * 打开谷歌浏览器 => 设置 => 找到默认浏览器(修改即可)
            */
            open: true,
            // 监听的ip地址, 默认是127.0.0.1
            host: 'localhost',
            // 是否强制依赖预构建
            force: true,

            hmr: {
                // 禁用开发服务器错误的屏蔽(如果代码错误,或者服务器错误 会有一个遮罩) 
                overlay: false
            },
            // 端口号
            port: '5173',
            // 代理
            proxy: {
                // 字符串写法
                '/foo': 'http://192.168.1.13:4567/foo',

                // 选项写法,这也是我们常用的写法
                '/api': {
                    // 将/api代理到target地址
                    target: 'http://jsonplaceholder.typicode.com',

                    // 是否启用跨域, 默认为false
                    changeOrigin: true,

                    // 重写地址,如果请求的url中后台没有'/api',则需要将url中的'/api'替换为''这个需要与后端协商
                    rewrite: (path) => path.replace(/^\/api/, ''),

                    // 是否启用安全模式, http为false,https为true
                    secure: false,
                    
                    // 是否支持websocket
                    ws: true,
                }
            }
        },

        // 强制预构建插件包
        optimizeDeps: {
            // 检测需要预构建的依赖项
            entries: [],
            // 默认情况下,不在 node_modules 中的,链接的包不会预构建
            include: ['axios'],
            // 排除在优化之外
            exclude:['your-package-name']
        },

        // 打包配置
        build: {
            /**
             * 设置为 false 可以禁用最小化混淆,或是用来指定使用哪种混淆器。默认为 Terser,
             * 虽然 Terser 相对较慢,但大多数情况下构建后的文件体积更小。ESbuild 最小化混
             * 淆更快但构建后的文件相对更大,建议使用默认的
             * */ 
            minify: boolean | 'terser' | 'esbuild',
            // 打包后输出路径
            outDir: 'dist',
            target: 'esnext',
            assetsDir: 'assets',
            // 打包前是否清空文件夹
            emptyOutDir: true,
            // css分割
            cssCodeSplit: true,
            // 是否压缩大型文件
            brotliSize: false,
            // 小于此阈值的资源的导入或引用将内联为base64编码,以避免额外的http请求
            assetsInlineLimit: 4096,
            //构建后是否生成 source map 文件
            sourcemap: false,
            terserOptions: {
                compress: {
                    // 防止Infinity被压缩为1/0, 默认是false,建议改成true
                    keep_infinity: true,
                    drop_console: true,
                    drop_debugger: true
                }
            },
            // 启用/禁用 brotli 压缩大小报告, 压缩大型输出文件可能会很慢
            brotliSize: false,
            /**
             * 在编写代码时,您可能已经添加了许多代码拆分点以按需加载内容。编译后,您可能
             * 会注意到一些块太小了-造成更大的HTTP开销。LimitChunkCountPlugin可以通过
             * 合并来对您的块进行后处理
            */
            chunkSizeWarningLimit: 500,

            // 自定义底层的 Rollup 打包配置
            rollupOptions: {
                // 自己开发lib包时,确保外部化处理那些你不想打包进库的依赖
                external: [
                    'ant-design-vue', 
                    'vue-i18n',
                ]
            },
            // @rollup/plugin-commonjs 插件的选项
            commonjsOptions: {
            
            },
        }
    }
}