Vite构建工具
本文最后更新于 2025-03-01,文章内容可能已经过时。
Vite介绍
Vite是一个打包构建工具,它可以将项目中的浏览器不认识的代码文件,类似webpack转换为浏览器可认识的静态资源文件,打包构建结合了esbuild和rollup 构建工具实现!
相对于
webpack构建工具,配置方面变的更简单,学习成本降低,构建速度变快!

Vite项目创建
创建一个Vue3项目
使用 npm 方式创建
npm init vite@latest my_project使用 pnpm方式创建
pnpm create vite my_project也可以通过
--template指定框架来快速创建
pnpm create vite my_project --template vue目录结构
├── README.md
├── index.html # html 模版文件
├── package.json # 项目配置文件
├── public # 静态文件,该文件夹内的文件不会被打包处理
│ └── vite.svg
├── src # 开发源代码的地方
│ ├── App.vue
│ ├── assets
│ │ └── vue.svg
│ ├── components
│ │ └── HelloWorld.vue
│ ├── main.js # main.js 入口文件
│ └── style.css
└── vite.config.js # vite 配置文件根据命令行提示,选择要使用的框架,最终等待开发目录生成后,进入该文件夹,安装依赖,启动项目即可!
cd my_project
pnpm install # or npm install
pnpm run dev # or npm run dev需要注意的是,在
vue中,默认是不支持JSX语法的,需要通过安装插件来支持该语法类型!
pnpm i @vite/plugin-vue-jsx -D然后在
vite.config.js中引入插件进行注册!
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
// https://vite.dev/config/
export default defineConfig({
plugins: [vue(), vueJsx()],
});使用
jsx语法
import { defineComponent } from "vue";
export default defineComponent({
setup() {
return () => {
return <div>hello jsx</div>;
};
}
})创建一个Vue2项目
在
vite项目中创建vue2项目时,还需要使用一个插件vite-plugin-vue2,它可以在项目中支持vue2的写法!
使用 pnpm 创建一个项目
pnpm create vite my_vue2_project根据
命令窗口交互提示,选择Vanilla,Vanilla在不使用任何框架的情况下创建一个工程项目,像vite配置文件等需要手动创建!
目录结构
├── index.html
├── package.json
├── pnpm-lock.yaml
├── public
│ └── vite.svg
├── src
│ ├── App.vue # 删除 src 内部默认文件后,创建App.vue
│ └── main.js
└── vite.config.js # 配置文件为手动创建安装依赖
安装
vite-plugin-vue2插件,和vue2最新版本!这里需要注意的是,
vue2的版本一定是最新的,避免版本不匹配的问题!
pnpm info vue versions可以通过以上命令,来查看
vue版本信息,获取vue2的最新版本!
pnpm i vite-plugin-vue2 -Dpnpm i vue@2.7.16 -S创建vite配置文件
import { defineConfig } from "vite";
import { createVuePlugin } from "vite-plugin-vue2";
export default defineConfig({
plugins: [ createVuePlugin() ],
})创建App.vue文件
<template>
<div>
<center>vite + vue2 {{ msg }}</center>
</div>
</template>
<script>
export default {
name: 'App',
data() {
return {
msg: 'Welcome to Your Vue.js App'
}
}
}
</script>
<style lang="scss" scoped>
</style>修改main.js入口文件
import Vue from "vue";
import App from "./App.vue";
new Vue({
render: (h) => h(App),
}).$mount("#app");启动项目
pnpm run devCSS的使用方式
CSS变量与基本引用
在
src目录下创建styles文件夹并分别创建一个index.css文件和一个variable.css文件!
variable.css用来存放一些css变量!
index.css用来引入变量,并对元素设置css样式!
variable.css
:root{
--text-color: blue;
--bg-color: white;
}index.css
@import url("./variable.css");
body {
@console.error("This is an error message");
color: var(--text-color);
}
@console.error是postcss中的一个插件,它可以通过js形式计算出css样式!
postcss中有很多插件,比如单位转换px转rem,低版本浏览器css属性兼容,还有前缀插件等!
然后在
main.js入口文件中引入index.css样式
main.js
import { createApp } from 'vue'
import './styles/index.css'
import App from './App.vue'
createApp(App).mount('#app')CSS postcss的支持
postcss是一个用JavaScript工具和插件转换CSS 代码的工具!
@console就是postcss中的插件之一,具体使用方式如下!
依赖安装:pnpm install @postcss-plugins/console -D新建 postcss.config.jspostcss.config.js是配置文件,在vite中对postcss已有内置,新建该配置文件后,便会加载该配置文件!module.exports = { plugins: [require('@postcss-plugins/console')] }
CSS Module
任何以
.module.css为后缀名的CSS 文件都被认为是一个CSS modules文件。导入这样的文件会返回一个相应的模块对象:
example.module.css
.red {
color: red;
}import classes from './example.module.css'
document.getElementById('foo').className = classes.red如果
css.modules.localsConvention设置开启了camelCase格式变量名转换(例如localsConvention: 'camelCaseOnly'),你还可以使用按名导入。
vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
// https://vite.dev/config/
export default defineConfig({
plugins: [vue(), vueJsx()],
css: {
modules: {
localsConvention: 'camelCaseOnly'
}
}
});import { applyColor } from './example.module.css'
document.getElementById('foo').className = applyColor配置alias路径别名
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
export default defineConfig({
plugins: [vue(), vueJsx()],
resolve: {
alias: {
"@": "/src",
"@assets": "/src/assets",
"@components": "/src/components",
"@views": "/src/views",
"@router": "/src/router",
"@store": "/src/store",
"@utils": "/src/utils",
"@styles": "/src/styles"
}
},
});配置TypeScript集成
静态文件处理
静态资源,表示图片、媒体等相关文件内容,通过import方式来进行导入并使用!
基本使用
例如,在src目录中的assets文件夹内有一张图片
import vueSvg from './assets/vue.svg'使用时,可以通过
动态绑定的方式来引用,import静态资源时,会返回一个编译后的的打包路径!
<img :src="vueSvg" class="logo vue" alt="Vue logo" />url路径查询参数
添加一些特殊的
查询参数可以更改资源被引入的方式:
url该参数会返回一个解析后的url地址// 显式加载资源为一个 URL import assetAsURL from "@/jsx/hello.jsx?url" // jsx url /src/jsx/hello.jsxraw以字符串形式加载资源会返回
jsx文件中的内容// 以字符串形式加载资源 import assetAsString from './hello.jsx?raw'import { defineComponent } from "vue"; export default defineComponent({ setup() { return () => { return <div>hello jsx</div>; }; } })web worker// 加载为 Web Worker import Worker from './worker.js?worker' // 在构建时 Web Worker 内联为 base64 字符串 import InlineWorker from './worker.js?worker&inline'JSON文件导入import jsonTest from "./assets/test.json" // 会将json以对象的内容进行输出
assets 和 public 区别
assets是src目录下的静态资源:src目录下的文件会参与文件编译,文件路径最终都会通过编译生成文件指纹!在
vite中,什么情况下,会在代码中引入静态资源路径时,会被编译成新的路径!css 中的静态路径background-image: url("./assets/logo.jpg")img 中src的静态路径<img src="./assets/logo.jpg" />import()语句方式引入的路径import logoJpg from "./assets/logo.jpg"或者可以使用
动态导入的方式import("./assets/logo.jpg").then(res => { console.log("url", res.default) })动态导入,会在打包结果后的dist文件夹内生成多个一对图片还有与之对应的js文件内容!js文件内容,包含了图片转换后的文件指纹路径,最后对路径做了导出,由res.default来获取结果!
URL对象,同样也会被vite进行路径处理const url = new URL("./assets/${val}.jpg", import.meta.url); console.log("vite 打包编译后的 url 地址", url)import.meta.url是一个ESM的原生功能,会暴露当前模块的 URL。将它与原生的URL构造器 组合使用,在一个 JavaScript 模块中,通过相对路径我们就能得到一个被完整解析的静态资源 URL!const imgUrl = new URL('./img.png', import.meta.url).href document.getElementById('hero-img').src = imgUrl
public是根目录中的一个文件夹:public文件夹内的文件不会受到编译的影响,最终都会以初始的文件状态进行结果打包!
eslint 和 prettier
1. eslint是一个代码规范插件,它可以通过配置、预设方式来规定代码书写的规范检查!
2. prettier是一个代码格式化插件,它需要在编辑器中安装这个插件,配合eslint来使用,可以设置编辑器在保存代码时,进行格式化代码块,来纠正代码到eslint的所定义的格式规范!
3. husky是一个代码提交插件,它会在提交代码之前,去做eslint校验,保证代码的规范性,若存在不规范代码,则无法进行提交commit!
在使用
eslint和prettier之前,需要在开发工具中安装这两个插件,例如vscode 、 webstorm!


eslint 相关配置
eslint相关依赖安装
pnpm install eslint-plugin-vue eslint-config-prettier eslint-plugin-prettier eslint-plugin-import eslint-plugin-promise eslint-plugin-node -D
eslint-config-standtard是一个预设配置,也是一个eslint标准规范配置,通过extends配置属性,来继承这个标准的特性!
eslint-plugin-vue是vue提供的一个关于vue代码编写规范配置插件
基础规则:
eslint:recommended代码风格:
airbnb、standard、google框架支持:
react、vue、typescript工具集成:
prettier、import
根目录创建eslint配置文件
在
项目根目录中新建".eslintrc.js"配置文件,该配置文件,用来配置代码格式规范检测!
.eslintrc.js
module.exports = {
extends: ['prettier', 'plugin:vue/vue3-recommended'],
plugins: ['prettier'],
env: {
es6: true,
browser: true
},
global: {
postMessage: true
},
rules: {
'prettier/prettier': 'error',
'no-console': 'off',
'no-debugger': 'off',
'space-before-function-paren': 'off'
}
}
extends属性为继承的意思,可以字符串,或者是一个数组,来继承多个规范配置!
plugin:vue/vue3-recommended是vue3标准规范配置,继承该规范后,代码规则检测,将以此规范进行代码检测!pnpm install eslint-plugin-vue -D
plugin:vue/recommended 是 vue2 eslint 规则!
plugin:vue/vue3-recommended 是vue3 eslint 规则!
rules用来配置eslint具体校验规则,如函数后括号之间是否留有空格(space-before-function-paren), off 代表关闭该项的检测!
global用来配置全局变量代码,postMessage表示在全局中可用,不需要去做eslint提示!
当
开启eslint插件时,会发现项目中的许多文件,出现了报错提示,并提示我们去按照代码规范去纠正这些问题!而这些
问题,存在与多出,修改的文件内容也比较多,无法进行一个个修改,比较麻烦,因此,我们需要配合prettier格式化插件工具,来解决此问题!
prettier 相关配置
首先需要在
开发工具中,安装此插件,之后,在vscode中来对format部分进行调整修改,确保保存时,进行代码格式化操作!
修改vscode配置
两部分修改,一部分是,保存代码时,进行格式化!另一个是,确保格式化工具选择的是prettier选项!
cmd+shift+p调出vscode设置面板,在面板中搜素format,找到format on save选项确保勾选!

另外就是搜索
formatter确保列出的选项内,选择的是prettier插件!

新建prettier配置文件
在
项目根目录中新建".prettierrc"配置文件,该配置文件,可以通过json形式来配置,代码中格式化的规则!
.prettierrc
{
"singleQuote": true, // 保留单引号
"semi": false, // 去除结尾分号
"trailingComma": "none" // 去除结尾逗号
}配合
eslint规则使用,不然会有冲突!
配置描述
| 配置项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
printWidth |
整数 |
80 |
设置每行的最大字符数。当代码超过此宽度时,Prettier 会自动换行。 |
tabWidth |
整数 |
2 |
设置缩进的空格数。可以根据团队或个人的编码习惯进行调整。 |
useTabs |
布尔值 |
false |
如果设置为 true,则使用制表符(Tab)进行缩进;否则,使用空格。 |
semi |
布尔值 |
true |
如果设置为 true,则在语句末尾添加分号;否则,不添加。 |
singleQuote |
布尔值 |
false |
如果设置为 true,则使用单引号 (' ');否则,使用双引号 (" ")。 |
quoteProps |
字符串 |
"as-needed" |
控制对象属性引号的使用方式。"as-needed":仅在必要时使用引号;"consistent":保持一致;"preserve":保留现有引号。 |
jsxSingleQuote |
布尔值 |
false |
如果设置为 true,则在 JSX 中使用单引号;否则,使用双引号。 |
trailingComma |
字符串 |
"es5" |
控制对象、数组、函数参数等末尾是否添加尾随逗号。"es5":在 ES5 支持的位置添加;"none":不添加;"all":在所有支持的位置添加。 |
bracketSpacing |
布尔值 |
true |
如果设置为 true,则在对象字面量的大括号内添加空格;否则,不添加。 |
jsxBracketSameLine |
布尔值 |
false |
如果设置为 true,则将 JSX 的右括号放在同一行;否则,换行。 |
arrowParens |
字符串 |
"always" |
控制箭头函数参数是否使用圆括号。"always":始终使用;"avoid":仅在必要时使用。 |
proseWrap |
字符串 |
"preserve" |
控制 Markdown 和其他文本文件中的换行方式。"preserve":保留现有换行;"always":始终换行;"never":不换行。 |
htmlWhitespaceSensitivity |
字符串 |
"css" |
控制 HTML 文件中空白敏感度的处理方式。"css":根据 CSS 处理;"strict":严格处理;"ignore":忽略。 |
endOfLine |
字符串 |
"lf" |
控制行尾的换行符类型。"lf":Unix/Linux 的换行符;"crlf":Windows 的换行符;"cr":旧版 Mac 的换行符;"auto":根据操作系统自动选择。 |
embeddedLanguageFormatting |
字符串 |
"auto" |
控制嵌入代码的格式化方式。"auto":自动处理;"off":关闭嵌入代码的格式化。 |
overrides |
数组 |
无 |
允许针对特定文件类型或路径应用不同的格式化规则。例如,可以为 .json 文件设置不同的 printWidth。 |
示例配置
{
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": true,
"trailingComma": "es5",
"bracketSpacing": true,
"jsxBracketSameLine": false,
"arrowParens": "always",
"proseWrap": "preserve",
"htmlWhitespaceSensitivity": "css",
"endOfLine": "lf",
"embeddedLanguageFormatting": "auto"
}配置scripts添加lint校验
在
package.json文件中,配置scripts脚本,可以快速通过命令,来检测代码规范性!\
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"lint": "eslint --ext .js,.vue --ignore-path .gitignore ."
}
}配置打包构建时校验lint
{
"scripts": {
"dev": "vite",
"build": "pnpm lint && vite build",
"preview": "vite preview",
"lint": "eslint --ext .js,.vue --ignore-path .gitignore ."
}
}只需要在
pnpm run build的时候之前跑下pnpm lint做一个校验即可!
配置git提交时做lint校验
在此时,如果
不配置git提交的话,可能会将校验不通过的代码,提交到代码仓库中,此时我们需要使用husky插件,来处理此问题!
husky可以防止使用Git hooks的一些不好的commit或者push。
Husky是一个Git Hook工具,可以触发 Git 提交的各个阶段:pre-commit 、commit-msg 、pre-push 、pre-rebase等等。Husky支持所有 Git 钩子,可以根据项目的需要选择适当的钩子来运行自定义脚本。
安装husky依赖
pnpm install husky -D初始化husky目录
npx husyk init初始化会自动做两件事情:
在
package.json中添加scripts脚本!{ "scripts": { "prepare": "husky" } }当
项目其他成员克隆我们的代码后运行npm install时,"prepare"会被触发,husky init会运行,这样能确保每个开发者在克隆项目并安装依赖时都有相同的 Git 钩子设置。创建一个
.husky 的文件夹在项目根目录下,其中有一个'pre-commit'钩子脚本,其中有一个'npm test'命令被自动添加了。所以如果我们没有自定义的需求,实际上默认就会有这么一个'pre-commit'钩子存在了。
安装husky相关钩子
npx husyk install
自定义脚本命令
当
npx husky init初始化时,默认生成了一个pre-commit钩子脚本,且内部默认添加了一条命令,npm test,若想自定义,比如,在提交时,做一次eslint格式校验,那么需要打开这个pre-commit文件,进行编辑,并添加 pnpm lint 脚本保存即可!
这时候,当去做
commit提交时,就会先执行pnpm lint去校验代码规范操作,若eslint校验失败,则不会提交代码!
其它husky命令使用
npx husky add .husky/pre-commit "npm run lint"
add会.husky目录下生成pre-commit钩子脚本,并在脚本内部添加npm run lint命令!
vite中的环境变量
环境变量,就是在不同环境下定义的变量值,例如开发环境 测试环境 生产环境等不同环境相关!
在
vite中,可以通过import.meta.env的方式来获取环境对象
环境对象env
{
"BASE_URL": "/",
"DEV": true,
"MODE": "development",
"PROD": false,
"SSR": false
}| 属性 | 类型 | 描述 |
|---|---|---|
import.meta.env.MODE |
字符串 |
表示当前应用的运行模式。常见的值包括: |
- development:开发模式 |
||
- production:生产模式 |
||
- test:测试模式(如果适用) |
||
| 该属性用于根据不同的模式执行不同的逻辑,例如启用或禁用调试工具、日志记录等。 | ||
import.meta.env.BASE_URL |
字符串 |
表示应用的基路径(base URL)。在构建应用时,如果配置了 publicPath 或 base 选项,该属性会反映配置的基路径。例如,如果应用部署在 https://example.com/app/,则 BASE_URL 为 /app/。 |
import.meta.env.PROD |
布尔值 |
表示应用是否运行在生产模式。当 MODE 为 production 时,该属性为 true;否则为 false。用于在代码中根据运行环境执行不同的逻辑,例如启用性能优化、关闭调试信息等。 |
import.meta.env.DEV |
布尔值 |
表示应用是否运行在开发模式。当 MODE 为 development 时,该属性为 true;否则为 false。用于在代码中根据运行环境执行不同的逻辑,例如启用日志记录、调试工具等。 |
import.meta.env.SSR |
布尔值 |
表示应用是否在服务器端渲染(SSR)环境中运行。如果应用使用 SSR,该属性为 true;否则为 false。用于在代码中根据渲染环境执行不同的逻辑,例如条件加载某些模块或资源。 |
import.meta.env.VITE_ |
对象 |
以 VITE_ 开头的环境变量。这些变量在构建时被注入到代码中,并且可以在应用中使用。例如,import.meta.env.VITE_API_URL 可以用于配置 API 的基础 URL。注意:只有以 VITE_ 开头的环境变量才会被暴露到客户端代码中。 |
import.meta.env.VITE_API_URL |
字符串 |
示例属性,表示通过 VITE_API_URL 环境变量注入的 API 基础 URL。具体的属性名称取决于在 .env 文件中定义的环境变量。 |
import.meta.env在打包环境(生产 测试)编译之后,实际上是不存在的,另外vite会将此代码转换为一个对象形式进行输出展示!
console.log("import.meta.env", import.meta.env)
编译后的代码,import.meta.env就不存在了,会被替换成一个对象!
console.log("import.meta.env", {
"BASE_URL": "/",
"DEV": true,
"MODE": "development",
"PROD": false,
"SSR": false
})
自定义环境变量
自定义环境变量,就是可以在项目根目录下创建特定的文件,来表示不同环境下的变量,并且变量名必须以VITE_开头才行!
特定的文件可以有(.env 、 .env.development、 .env.development.local、.env.production 、 .env.test)
.env# 所有情况下都会加载.env.local# 所有情况下都会加载,但会被 git 忽略.env.[mode]# 只在指定模式下加载.env.[mode].local# 只在指定模式下加载,但会被 git 忽略
环境中的mode模式
mode用来指定vite环境的构建模式,则默认支持development(开发环境)和production(生产环境),当然也可以自定义mode,如test或者是staging,通过--mode来实现!
test 和 staging
test用于开发阶段测试环境
staging用于交付阶段uat应用测试环境
test测试环境:用于运行
自动化测试、单元测试、集成测试等,确保代码的正确性和稳定性。在
项目根目录中创建.env.test.env.test用于配置test 测试环境中相关的变量API BASE_URL等!VITE_APP_ENV=test VITE_APP_TITLE=My Vue3 Project Test VITE_APP_API=http://localhost:8090/test/apipackage.json配置scripts{ "scripts": { "dev": "vite", "build": "pnpm lint && vite build --production", "test": "vite build --mode test", "lint": "eslint --ext .js,.vue --ignore-path .gitignore .", "prepare": "husky" }, }--mode test用来指定当前构建环境test Mode,其变量中会读取.env.test中的变量! 构建test测试包pnpm run teststaging模式(暂存模式)用于在
生产环境之前进行预发布或试运行,确保应用在接近真实环境中的表现。通常用于将
应用部署到一个与生产环境相似的环境中进行最终验证。强调应用的
完整性和性能,可能包括负载测试、用户验收测试(UAT)等。配置通常与
生产环境相似,但可能使用不同的 API 端点、数据库等。在
项目根目录中创建.env.staging.env.staging用于配置staging uat 测试环境中相关的变量API BASE_URL等!VITE_APP_ENV=staging VITE_APP_TITLE=My Vue3 Project staging VITE_APP_API=http://localhost:8090/staging/api
package.json配置scripts{ "scripts": { "dev": "vite", "build": "pnpm lint && vite build --production", "staging": "vite build --mode staging", "lint": "eslint --ext .js,.vue --ignore-path .gitignore .", "prepare": "husky" }, }--mode staging用来指定当前构建环境staging Mode,其变量中会读取.env.staging中的变量! 构建staging测试包pnpm run staging
dev 和 preview
dev是本地开发环境,主要是开发业务功能,测试等!
preview是本地以production Mode去预览的一个环境,主要用来调试,在生产环境出现的问题!
这两中
mode都会在本地启动一个服务,进行本地项目预览,但是preview的env环境是production,而dev的env环境是,development!
vite dev(开发服务器):
- 用途:主要用于开发阶段,提供快速的热模块替换(HMR)、实时重载和详细的调试信息。
- 特点:
- 启动
开发服务器,默认运行在http://localhost:3000(端口可配置)。 - 支持
模块热替换(HMR),即在代码修改后自动更新页面,无需手动刷新。 - 提供
详细的错误信息和源码映射(source maps),便于调试。 - 适用于日常
开发和测试。
- 启动
vite preview(预览服务器):
- 用途:用于在
本地预览生产构建后的应用,模拟生产环境的行为。 - 特点:
- 启动一个
静态文件服务器,用于提供构建后的静态文件(通常位于dist目录)。 - 不包含
开发服务器的特性,如HMR 和源码映射。 - 适用于在
本地验证生产构建结果,或在部署前进行最终检查。 - 默认运行在
http://localhost:5000(端口可配置)。
- 启动一个
vite 构建命令的相关参数
dev 常用参数
| 参数 | 使用 | 描述 |
|---|---|---|
--port |
vite --port 8080 |
指定服务端口,一般用于指定本地服务端口! |
--https |
vite preview --https |
两者都支持通过配置启用 HTTPS! |
--open |
vite dev --port 300 --open |
启动开发服务器,监听端口 3000 并自动打开浏览器 |
--open /dashboard |
vite preview --open /dashboard |
指定目录文件打开 |
--host |
vite preview --host 0.0.0.0 |
指定主机域名 |
--cors |
vite dev --cors |
启用 CORS 支持 |
--config |
vite dev --config vite.custom.config.js |
自定义配置文件路径 |
build 常用参数
| 参数 | 使用 | 描述 |
|---|---|---|
--outDir |
vite build --outDir build |
指定输出目录。默认是 dist! |
--mode |
vite build --mode test |
用来指定 env 环境 mode,可自定义 test staging等! |
--assetsDir |
vite build --assetsDir static |
指定静态资源输出目录。默认是 assets! |
--sourcemap |
vite build --sourcemap |
生成源码映射文件 |
--minify |
vite build --minify terser |
指定代码压缩工具。默认是 esbuild。可选值包括 terser、esbuild 等 |
--target |
vite build --target es2015 |
指定构建目标环境。默认是 modules。可选值包括 es2015、es2016 等! |
--emptyOutDir |
vite build --emptyOutDir |
构建前清空输出目录 |
vite中HMR热更新功能
HMR(热更新),当我们修改页面中的内容时,不去刷新页面,而自动将改动的地方进行变更!
vite中开发vue项目,已经默认有了热更新操作,像vue页面以及页面中的样式,都会及时得到修改的反馈!
手动完成一个更新操作
通过
import.meta.hot来完成,dom片段的局部更新操作!
import "./style.css";
import javascriptLogo from "./javascript.svg";
import viteLogo from "/vite.svg";
import { setupCounter } from "./counter.js";
export function render() {
document.querySelector("#app").innerHTML = `
<div>
<a href="https://vite.dev" target="_blank">
<img src="${viteLogo}" class="logo" alt="Vite logo" />
</a>
<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript" target="_blank">
<img src="${javascriptLogo}" class="logo vanilla" alt="JavaScript logo" />
</a>
<h1>Hello Vite!</h1>
<div class="card">
<button id="counter" type="button"></button>
</div>
<p class="read-the-docs">
Click on the Vite logo to learn moredwad
</p>
</div>
`;
setupCounter(document.querySelector("#counter"));
}
if (import.meta.hot) {
import.meta.hot.accept((newModule) => {
newModule.render();
});
}
import.meta.hot.accept接受一个回调函数,其回调参数,为当前模块后产生变动后的新模块,然后调用render函数,进行重新渲染!
就是
当前模块中的代码发生变动时,会触发 websockt,然后获取accept中的回调参数,拿到新的模块中导出的render函数,进行调用重新渲染!
global import 批量导入
使用
import.meta.glob()函数可以接受一个文件路径,来匹配多个文件,并返回一个键值对对象,key为文件路径名,而value则是,对应的import导入的文件内容!
基本使用
实现
批量组件注册,如下components文件夹内的目录结构!
├── HelloWorld.vue
├── TestComp.vue
└── index.jsindex.js
index.js为批量注册的入口文件,通过import.meta.glob()函数来注册获取components内的所有.vue文件!
export function registerComponents(app) {
const compoents = import.meta.glob('./*.vue')
Object.keys(compoents).forEach(async (key) => {
const componentName = key.replace('./', '').replace('.vue', '')
const component = await compoents[key]()
console.log('componentName', componentName)
console.log('component', component.default)
app.component(componentName, component.default)
})
}以
上导入方式,是异步方法返回,比较繁琐,可以通过配置对象来处理此问题{ eager: true }!
export function registerComponents(app) {
const compoents = import.meta.glob('./*.vue', { eager: true })
Object.keys(compoents).forEach((key) => {
const componentName = key.replace('./', '').replace('.vue', '')
const component = compoents[key]
console.log('componentName', componentName)
console.log('component', component.default)
app.component(componentName, component.default)
})
}main.js
import { createApp } from 'vue'
import './styles/index.css'
import App from './App.vue'
import { registerComponents } from './components/index'
const app = createApp(App)
// 注册全局组件
registerComponents(app)
app.mount('#app')文件路径引入规则
| 匹配模式 | 描述 | 示例 |
|---|---|---|
* |
匹配任意数量的任意字符(不包含路径分隔符 /)。 |
*.js 匹配当前目录下的所有 .js 文件。 |
** |
递归匹配任意数量的任意字符,包括路径分隔符 /。 |
**/*.js 匹配所有子目录下的所有 .js 文件。 |
? |
匹配单个任意字符(不包含路径分隔符 /)。 |
?.js 匹配类似 a.js、b.js 等文件。 |
[seq] |
匹配方括号内的任意一个字符序列。 |
[ab].js 匹配 a.js 或 b.js。 |
[!seq] 或 [^seq] |
匹配不在方括号内的任意一个字符序列。 |
[^ab].js 匹配除 a.js 和 b.js 之外的文件。 |
{foo,bar} |
匹配大括号内的任意一个字符串。 |
{foo,bar}.js 匹配 foo.js 或 bar.js。 |
{n..m} |
匹配数字范围 n 到 m 之间的任意一个数字。 |
{1..3}.js 匹配 1.js、2.js、3.js。 |
**/node_modules/** |
排除 node_modules 目录下的所有文件。 |
**/!(*.spec).js 排除所有 .spec.js 文件。 |
**/!(pattern) |
排除匹配 pattern 的文件。 |
**/!(foo).js 排除所有名为 foo.js 的文件。 |
**/?(pattern) |
匹配可选的 pattern。 |
**/?(foo).js 匹配 foo.js 或其他文件。 |
**/+(*.js) |
匹配以 .js 结尾的文件。 |
**/+(*.js) 匹配所有 .js 文件。 |
| `**/(*.js | *.ts)` | 匹配以 .js 或 .ts 结尾的文件。 |
| `**/*.@(js | ts)` | 同上,使用 @ 符号进行分组。 |
| `**/*.+(js | ts)` | 匹配以 .js 或 .ts 结尾的文件。 |
**/*.js |
匹配所有以 .js 结尾的文件。 |
**/*.js 匹配所有 .js 文件。 |
**/*.min.js |
匹配所有以 .min.js 结尾的文件。 |
**/*.min.js 匹配所有压缩后的 .js 文件。 |
**/[^a-z]*.js |
匹配不以小写字母开头的 .js 文件。 |
**/[^a-z]*.js 匹配类似 1.js、A.js 等文件。 |
**/[a-z]*.js |
匹配以小写字母开头的 .js 文件。 |
**/[a-z]*.js 匹配类似 a.js、b.js 等文件。 |
**/[^_]*.js |
匹配不以 _ 开头的 .js 文件。 |
**/[^_]*.js 匹配类似 a.js、b.js 等文件。 |
**/_*.js |
匹配以 _ 开头的 .js 文件。 |
**/_*.js 匹配类似 _a.js、_b.js 等文件。 |
| `**/*.@(js | ts | json)` |
| `**/!(*.js | *.ts)` | 排除所有 .js 和 .ts 文件。 |
| `**/!(foo | bar).js` | 排除所有名为 foo.js 和 bar.js 的文件。 |
| `**/?(foo | bar).js` | 匹配可选的 foo.js 或 bar.js。 |
| `**/+(foo | bar).js` | 匹配至少一个 foo.js 或 bar.js。 |
预编译
预编译,vite在启动之前呢,会把node_modules中的第三方依赖库进行一个cache缓存,当用到时,会从cache缓存中获取,从而提高加载运行的速度!
缓存的文件在node_modules > .vite文件夹中,当启动时,依赖包会加载到该目录当中!

除此之外,我们可以通过
vite.config.js配置文件,来配置缓存优化策略,可以来指定哪些第三方库用来缓存,哪些第三方库不需要缓存的相关配置!
{
optimizeDeps: {
// include 匹配缓存依赖
include: ['vue', 'vue-router', 'vuex'],
// exclude 排除缓存依赖
exclude: ['vue-demi']
}
}
注意:vite会默认扫描所有第三方库,然后进行缓存! 而exclude配置需要排除第三方依赖缓存时,需要注意,该依赖包是否有大量的功能作为导出,例如lodash,该依赖包,内部提供了,很多utils工具函数,若不进行cache,会导致页面加载时卡顿,闪烁的问题,因为浏览器会对lodash中所有的utils文件作为请求加载!
{
optimizeDeps: {
// include 匹配缓存依赖
include: ['vue', 'vue-router', 'vuex'],
// exclude 排除缓存依赖
exclude: ['lodash']
}
}
lodash配置不缓存时,并且在某一个模块下,导入并引用lodash,则浏览器会加载请求lodash中上百个模块文件!


vite 配置文件
基本配置
| 配置属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
root |
`string | string[]` | process.cwd() |
base |
string |
/ |
公共基础路径,适用于部署在子路径下的应用。 |
mode |
string |
'development' |
环境模式,可以是 'development'、'production' 或自定义模式。 |
define |
Record<string, string> |
{} |
全局常量定义,用于替换代码中的变量。 |
plugins |
Plugin[] |
[] |
使用的 Vite 插件列表。 |
publicDir |
string |
'public' |
公共静态资源目录,文件会原样复制到输出目录。 |
cacheDir |
string |
'.vite' |
缓存目录,用于存储缓存的依赖和构建产物。 |
resolve |
object |
{} |
模块解析选项,包括 alias(路径别名)等。 |
alias |
Record<string, string> |
{} |
模块路径别名,用于简化模块导入路径。 |
build |
object |
{} |
构建相关配置,包括 outDir(输出目录)、assetsDir(静态资源目录)、rollupOptions(Rollup 配置)等。 |
build.outDir |
string |
'dist' |
构建输出目录。 |
build.assetsDir |
string |
'assets' |
静态资源输出目录。 |
build.rollupOptions |
RollupOptions |
{} |
传递给 Rollup 的自定义配置,用于更细粒度的控制构建过程。 |
server |
object |
{} |
开发服务器配置,包括 port(端口)、host(主机)、open(是否自动打开浏览器)等。 |
server.port |
number |
5173 |
开发服务器端口。 |
server.host |
string |
'localhost' |
开发服务器主机名。 |
server.open |
`boolean | string` | false |
css |
object |
{} |
CSS 相关配置,包括 modules(CSS Modules)、preprocessorOptions(预处理器选项)等。 |
css.modules |
object |
{} |
CSS Modules 配置。 |
css.preprocessorOptions |
object |
{} |
CSS 预处理器(如 Sass、Less)选项。 |
json |
object |
{} |
JSON 解析配置。 |
esbuild |
object |
{} |
Esbuild 相关配置,用于加速构建过程。 |
optimizeDeps |
object |
{} |
依赖优化配置,包括 include(包含的依赖)、exclude(排除的依赖)等。 |
envPrefix |
string |
'VITE_' |
环境变量前缀,用于在代码中访问环境变量。 |
logLevel |
string |
'info' |
日志级别,可以是 'info'、'warn'、'error'、'silent'。 |
clearScreen |
boolean |
true |
是否在终端中清除屏幕。 |
build.lib |
object |
{} |
库模式配置,用于构建库而非应用。 |
build.ssr |
boolean |
false |
是否启用服务器端渲染(SSR)模式。 |
build.minify |
`boolean | string` | 'esbuild' |
build.target |
string |
'modules' |
构建目标环境,如 'modules'、'esnext'、'es2015' 等。 |
通用配置
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue'; // 如果使用 Vue.js
import path from 'path';
import react from '@vitejs/plugin-react'; // 如果使用 React
import viteImagemin from 'vite-plugin-imagemin'; // 图片压缩插件
import unocss from 'unocss/vite'; // CSS 工具类框架
import { visualizer } from 'rollup-plugin-visualizer'; // 构建分析
export default defineConfig({
// 1. 基本配置
root: process.cwd(),
base: '/', // 公共基础路径,根据部署环境调整
mode: 'development', // 或 'production'
// 2. 插件配置
plugins: [
vue(), // Vue.js 插件
// react(), // 如果使用 React,使用此行代替 vue()
viteImagemin({
// 图片压缩配置
gifsicle: {
optimizationLevel: 7,
interlaced: false,
},
optipng: {
optimizationLevel: 7,
},
mozjpeg: {
quality: 20,
},
pngquant: {
quality: [0.8, 0.9],
speed: 4
},
svgo: {
plugins: [
{
name: 'removeViewBox',
active: false
},
{
name: 'removeEmptyAttrs',
active: false
}
]
}
}),
unocss(), // CSS 工具类框架
// 构建分析插件,仅在生产构建时启用
process.env.NODE_ENV === 'production' && visualizer()
].filter(Boolean), // 过滤掉可能的 undefined 值
// 3. 路径别名
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'@assets': path.resolve(__dirname, 'src/assets'),
'@components': path.resolve(__dirname, 'src/components'),
'@views': path.resolve(__dirname, 'src/views'),
'@store': path.resolve(__dirname, 'src/store'),
// 根据项目结构调整
}
},
// 4. 服务器配置
server: {
port: 3000, // 开发服务器端口
host: 'localhost', // 开发服务器主机名
open: true, // 是否自动打开浏览器
cors: true, // 启用 CORS
proxy: {
// 代理配置,根据后端 API 调整
'/api': {
target: 'http://localhost:5000',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
},
// 5. 优化配置
build: {
outDir: 'dist', // 构建输出目录
assetsDir: 'assets', // 静态资源输出目录
rollupOptions: {
output: {
// 代码分割配置
chunkFileNames: 'js/[name]-[hash].js',
entryFileNames: 'js/[name]-[hash].js',
assetFileNames: 'assets/[name]-[hash][extname]'
},
// 其他 Rollup 配置
},
minify: 'esbuild', // 代码压缩器,'terser' 或 'esbuild'
terserOptions: {
// Terser 配置
compress: {
drop_console: true, // 移除 console 语句
drop_debugger: true // 移除 debugger 语句
}
},
sourcemap: 'hidden', // Source map 配置,'none' | 'hidden' | 'inline'
// 库模式配置(如果需要)
lib: {
entry: path.resolve(__dirname, 'lib/index.js'),
name: 'MyLibrary',
formats: ['cjs', 'esm']
},
// SSR 配置(如果需要)
ssr: false
},
// 6. CSS 配置
css: {
modules: {
// CSS Modules 配置
scopeBehaviour: 'local',
generateScopedName: '[local]___[hash:base64:8]'
},
preprocessorOptions: {
// CSS 预处理器配置,如 Sass、Less
scss: {
// 例如,引入全局变量
additionalData: `@import "@/assets/styles/global.scss";`
}
},
// PostCSS 配置(如果需要)
postcss: {
plugins: [
// 例如,自动添加前缀
require('autoprefixer')
]
}
},
// 7. 环境变量
envPrefix: 'VITE_', // 环境变量前缀
// 8. 其他配置
logLevel: 'info', // 日志级别
clearScreen: true, // 是否清除终端屏幕
optimizeDeps: {
include: ['@vue/compiler-sfc'], // 需要预构建的依赖
exclude: ['lodash'] // 需要排除的依赖
}
});配置说明
基本配置:root:指定项目根目录,通常为 process.cwd()。base:公共基础路径,根据部署环境调整,例如 / 或 /myapp/。mode:环境模式,通常设置为 'development' 或 'production'。
插件配置:Vue.js 插件:如果项目使用 Vue.js,需要引入并配置 @vitejs/plugin-vue。React 插件:如果项目使用 React,需要引入并配置 @vitejs/plugin-react。图片压缩插件:使用 vite-plugin-imagemin 进行图片压缩,提升构建性能。CSS 工具类框架:使用 unocss 或其他类似工具,提升 CSS 开发效率。构建分析插件:使用 rollup-plugin-visualizer 分析构建产物,优化打包大小。
路径别名:- 配置
@指向src目录,方便模块导入。 - 根据
项目结构调整其他路径别名,如@assets、@components等。
- 配置
服务器配置:port:开发服务器端口,通常设置为 3000 或其他常用端口。host:开发服务器主机名,通常为 'localhost'。open:是否自动打开浏览器,通常设置为 true。cors:启用 CORS,允许跨域请求。proxy:代理配置,用于解决开发环境下的 API 代理问题。
优化配置:outDir:构建输出目录,通常为 dist。assetsDir:静态资源输出目录,通常为 assets。rollupOptions:传递给 Rollup 的自定义配置,用于更细粒度的控制构建过程。minify:代码压缩器,通常使用 'esbuild' 或 'terser'。sourcemap:Source map 配置,根据需要选择 'hidden' 或 'none'。lib:库模式配置,如果需要构建库而非应用,需要配置此项。ssr:服务器端渲染配置,如果需要启用 SSR,需要设置为 true。
CSS 配置:modules:CSS Modules 配置,包括作用域行为和生成类名格式。preprocessorOptions:CSS 预处理器配置,如 Sass、Less 的全局变量导入。postcss:PostCSS 配置,例如自动添加浏览器前缀。
环境变量:envPrefix:环境变量前缀,通常为 'VITE_'。
其他配置:logLevel:日志级别,通常设置为 'info'。clearScreen:是否清除终端屏幕,通常设置为 true。optimizeDeps:依赖优化配置,包括需要预构建的依赖和需要排除的依赖。
