Vite自定义配置

当启动 Vite 项目时,会自动解析项目根目录下名为 vite.config.js 的文件,基础的配置文件代码如下:

// vite.config.js
export default {
    // 配置选项
}

vite.config.js 的配置项有很多,使用 defineConfig 工具函数,并结合 IDE 自动提示功能,可以更加方便地查看各项配置,代码如下:

import { defineConfig } from 'vite'
export default defineConfig({
    ...
})

提示信息如图 9-7 所示。

image 2024 02 23 22 00 25 097
Figure 1. 图9-7 defineConfig 自动提示

同时,也可以区分开发环境和生产环境进行不同的配置,代码如下:

export default defineConfig(({ command, mode }) => {
    if (command === 'serve') {
        return {
            // serve 独有的配置
        }
    } else {
        return {
            // build 独有的配置
        }
    }
})

静态资源处理

Vite 内置了对 CSS 文件、图片、JSON 文件的处理,导入 .CSS 文件会把内容插入 <style> 标签中,同时也带有 HMR 支持,能够以字符串的形式检索处理后的、作为其模块默认导出的 CSS。同时,也可以配置 SassLessStylus 等预处理工具,前提是需要安装:

# .scss and .sass
npm install -D sass
# .less
npm install -D less
# .styl and .stylus
npm install -D stylus

安装完成之后,可以直接在 Vue 的单文件组件中使用 <style lang="sass">(或其他预处理器)自动开启这些支持。同时,可以通过 vite.config.jsCSS 项对这些预处理器进行配置,代码如下:

export default defineConfig({
    css: {
        preprocessorOptions: {
            scss: { // 对scss进行配置
                additionalData: `$injectedColor: orange;`
            }
        }
    }
})

导入一个静态资源会返回解析后的 URL,代码如下:

import imgUrl from './img.png'
document.getElementById('hero-img').src = imgUrl

添加一些特殊的查询参数可以更改资源被引入的方式,代码如下:

// 显式加载资源为一个 URL
import assetAsURL from './asset.js?url'
// 以字符串形式加载资源
import assetAsString from './shader.glsl?raw'
// 加载为 Web Worker
import Worker from './worker.js?worker'
// 在构建时, Web Worker 内联为 base64 字符串
import InlineWorker from './worker.js?worker&inline'

JSON 文件可以直接导入使用,同时支持导入其某个字段,代码如下:

// 导入整个对象
import json from './example.json'
// 对一个根字段使用具名导入,更有利于 Tree Shaking
import { field } from './example.json'

插件配置

我们知道,在开发环境下,Vite 是直接基于浏览器的 ES 6 Modules 的,所以对于 JavaScript 文件来说,在浏览器中就可以直接引入,但是对于一些其他文件,例如 .vue.jsx 文件等,是无法直接被浏览器识别的,所以针对这些文件,还需要使用一些 Vite 插件编辑之后,再提供给浏览器。

vite.config.js 中采用 plugin 项来配置插件:

import vue from '@vitejs/plugin-vue' // Vue插件
import vueJsx from '@vitejs/plugin-vue-jsx' // JSX插件
import styleImport from 'vite-plugin-style-import' // 第三方包样式按需导入
export default defineConfig({
    plugins: [
        vue(),             // 针对Vue文件解析
        vueJsx(),          // 针对JSX文件解析
        styleImport({      // 按需导入ant-design-vue样式
            libs: [
                {
                    libraryName: 'ant-design-vue',
                    esModule: true,
                    resolveStyle: (name) => {
                        return `ant-design-vue/es/${name}/style/index`
                    },
                },
            ]})
    ]
})

Vite 的插件众多,由于生产环境基于 Rollup 工具,因此大部分都兼容 Rollup 的插件格式,并且 Vite 已经内置了大量 Rollup 常用的插件,如果需要一些额外插件,则可以在 awesome-vite 中搜索。

当使用了与某些 Rollup 插件有冲突的插件时,为了兼容,可能需要强制设置插件的位置,或者只在构建时使用。可以使用 enforce 修饰符来强制设置插件的位置,代码如下:

// vite.config.js
import image from '@rollup/plugin-image'
import { defineConfig } from 'vite'

export default defineConfig({
    plugins: [
        {
            ...image(),
            enforce: 'pre' // 在 vite 核心插件之前调用该插件
        }
    ]
})

enforce 的取值主要有以下几种:

  • 默认值:在 Vite 核心插件之后调用该插件。

  • pre:在 Vite 核心插件之前调用该插件。

  • post:在 Vite 构建插件之后调用该插件。

默认情况下,插件在开发(serve)和生产(build)模式中都会启用。如果插件在服务或构建期间按需使用,则可使用 apply 属性指明它们仅在 buildserve 模式下使用,代码如下:

// vite.config.js
import typescript2 from 'rollup-plugin-typescript2'
import { defineConfig } from 'vite'
export default defineConfig({
    plugins: [
        {
            ...typescript2(),
            apply: 'build' // 该插件仅在build模式下使用
        }
    ]
})

注意,这和前面讲到的在最外层判断 servebuild 模式进行配置实现的效果是一样的,两者选其一即可。

服务端渲染配置

服务端渲染就是在浏览器请求页面 URL 的时候,服务端将我们需要的 HTML 文本组装好,并返回给浏览器,这个 HTML 文本被浏览器解析之后,不需要经过 JavaScript 脚本的执行,即可直接构建出需要的 DOM 树并展示到页面中。这个服务端组装 HTML 的过程叫作服务端渲染。其中,Vite 也内置了 Vue 的服务端渲染能力,我们会在后面的章节中详细讲解。